4

我必须替换部分文本,但前提是它的子字符串不包含在“<”和“>”之间。

例如,如果我有以下文字

<text color='blue'>My jeans are red</text>
<text color='red'>I am wearing a red t-shirt</text>
<text color='yellow'>I like red fruits</text>

我想用另一个词替换“红色”这个词,我怎样才能替换该文本中的词而不替换包含在“<”和“>”之间的词?我试图为此编写一个正则表达式,但我没有成功......

我认为一种愚蠢的方法是分析所有文本(逐个字符),看看我是在 <...> 内部还是外部,如果我在外部,就替换文本的出现......我认为应该做一个更聪明的方法!

4

4 回答 4

1

如果这对你来说可以吗?

如果您只想在单行中进行替换:

final String s = "<text color='red'>I am wearing a red t-shirt</color>";
        System.out.println(s.replaceAll("(?<=>)(.*?)red", "$1blue"));

将打印

<text color='red'>I am wearing a blue t-shirt</color>

多行案例

final String s = "<text color='red'>I am wearing a red t-shirt</color>\n<text color='red'>You are wearing a red T-shirt</color>";
        System.out.println(s.replaceAll("(?m)^(.*?)(?<=>)([^>]*?)red", "$1$2blue"));

输出:

<text color='red'>I am wearing a blue t-shirt</color>
<text color='red'>You are wearing a blue T-shirt</color>
于 2013-02-06T12:43:07.637 回答
0

我将替换任何后面没有“>”的“红色”。之后检查“<”和“>”对。

String xml = "<text color='blue'>My jeans are red</text> <text color='red'>I am wearing a red t-shirt</text>red";
xml = xml.replaceAll("red(?=([^>]*<[^>]*?>)*[^<|>]*$)", "blue");
System.out.println(xml);

结果如下:

<text color='blue'>My jeans are blue</text> <text color='red'>I am wearing a blue t-shirt</text>
于 2013-02-06T16:58:22.747 回答
0

使用支持字符串数组稍长一点,仅替换打开和关闭标记之间的字符串而< ... >不是其他文本。

        String input ="<text color='red'>I am wearing a red t-shirt</color>";
        String [] end = null;
        String [] start = input.split("<");
        if (start!=null && start.length>0)
            for (int i=0; i<start.length;i++){
                end = start[i].split(">");
            }
        if (end!=null && end.length>0)
            for (int k=0; k<end.length;k++){
                input.replace(end[k], end[k].replace("red", "blue"));
            }
于 2013-02-06T12:43:45.077 回答
-1
Text=Text.replace(" red ", " blue ");
Text=Text.replace(" red<"," blue<");
Text=Text.replace(" red.", " blue.");
于 2013-02-06T23:20:23.200 回答