Java一次替换多个替换

暗星

我正在尝试转换newick格式的树上的节点,但无法正确进行替换。说我有HashMap

"(1:" : "(30:"
",1:" : ",30:" 
"(30:" : "(6:"
",30:" : ",6:"

和树:

(30:0.07,(1:0.06,2:0.76))

传统观点建议使用倍数replaceAll,但这会带来一个问题:

replaceAll("(1:", "(30:") >> (30:0.07,(30:0.06,2:0.76))
replaceAll("(30:", "(6:") >> (6:0.07,(6:0.06,2:0.76))

这里的问题是我们已经替换了先前替换的节点。正确的树应如下所示:

(6:0.07,(30:0.06,2:0.76))

现在,我已经在Python中完成了此操作:

def multiple_replace(taxa, text): 
    regex = re.compile("|".join(map(re.escape, taxa.keys())))
    return regex.sub(lambda mo: taxa[mo.group(0)], text) 

但是我的Java实现遇到了麻烦:

private String convertTree (String treeOld, HashMap<String, String> conv) {
        Pattern pattern = Pattern.compile("\\(\\d+:|,\\d+:");
        Matcher matcher = pattern.matcher(treeOld);
        StringBuilder sbt = new StringBuilder(treeOld);
        while (matcher.find()) {
            String replace = conv.get(matcher.group());
            System.out.println(matcher.group() + "||" +replace + " || " + matcher.start() + ":"+matcher.end());
            sbt.delete(matcher.start(), matcher.end());
            sbt.insert(matcher.start(), replace);
        }
        return treeOld;

    }

尽管替换似乎可以正常进行,但是对于不同大小的字符串,我无法获得完全正确的索引(如示例中所示)。有没有办法用Java做到这一点?

威克多·斯特里比尤(WiktorStribiżew)

您可以Matcher#appendReplacement在匹配时使用来修改您的字符串。

请注意,您的正则表达式可以简化为,[,(]\d+:因为您的替代分支仅在第一个字符上有所不同([,(]匹配,()。

这是一个IDEONE演示

import java.util.*;
import java.util.regex.*;
import java.lang.*;
import java.io.*;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String tree = "(30:0.07,(1:0.06,2:0.76))";
        HashMap<String, String> h = new HashMap<String, String>();
        h.put("(1:" , "(30:");
        h.put(",1:" , ",30:");
        h.put("(30:" , "(6:");
        h.put(",30:" , ",6:");
        System.out.println(convertTree(tree, h));

    }
    private static String convertTree(String treeOld, HashMap<String, String> conv) {
        Pattern pattern = Pattern.compile("[,(]\\d+:");  // Init the regex
        Matcher m = pattern.matcher(treeOld);            // Init the matcher
        StringBuffer result = new StringBuffer();        // Declare the string buffer (can be replaced with a string builder)
        while (m.find()) {                               // Iterate through matches
            if (conv.containsKey(m.group(0))) {          // Check if the key exists
                m.appendReplacement(result, conv.get(m.group(0))); // If yes, use the HashMap value
            }
            else {
                m.appendReplacement(result, m.group(0));  // Else, just reinsert the match value
            }
        }
        m.appendTail(result);        // Append what remains to the result
        return result.toString();

    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

熊猫一次替换多个值

来自分类Dev

一次替换多个节点的文本

来自分类Dev

一次处理多个替换规则

来自分类Dev

每次出现Java替换()一次

来自分类Dev

每次出现Java替换()一次

来自分类Dev

R一次查找并替换多个脚本

来自分类Dev

一次替换多个文件中的字符串

来自分类Dev

使用Java中的Regex一次替换多个字符串

来自分类Dev

如何在使用多个替换表达式时指示sed仅替换一次?

来自分类Dev

使用替换矩阵一次替换多个字符串

来自分类Dev

如何在Java中使用HashMap一次替换文件中的多个字符串

来自分类Dev

单词只被替换一次

来自分类Dev

一次替换输入值

来自分类Dev

如何一次替换每个单词

来自分类Dev

一次替换Python替换HTTP参数

来自分类Dev

如何一次替换多个字符串

来自分类Dev

在data.frame R中一次替换多个数字

来自分类Dev

如何一次替换字符串的多个不同部分?

来自分类Dev

是否可以使用javascript一次性替换多个不同的字符串?

来自分类Dev

建议一次替换张量中的多个值的方法?

来自分类Dev

如何在熊猫中一次应用或替换多个列?

来自分类Dev

JavaScript一次替换文本中的多个字符

来自分类Dev

在R中一次替换多个列中的值的最简单方法

来自分类Dev

使用Javascript中的Regex一次替换多个字符串

来自分类Dev

Node.js一次替换多个字符串

来自分类Dev

如何一次性搜索和替换多个单词

来自分类Dev

如何一次替换多个 wordpress 帖子标题中的特定单词?

来自分类Dev

gsub将一次出现替换两次

来自分类Dev

Vim跳至替换参数的最后一次出现