java 6 replaceall replacefirst

时间:2010-09-26 16:47:32

标签: java string

以下正则表达式在string.replaceall()中使用时有效,但在string.replaceFirst()中则不行。

字符串:

TEST|X||Y|Z||

预期产出:

TEST|X|**STR**|Y|Z||

正则表达式:

  string.replaceAll( "(TEST\\|[\\|\\|]*\\\\|)\\|\\|", "$1|ST|" );


Output (not desired):


 TEST|X|**STR**|Y|Z|**STR**|


string.replaceFirst( "(TEST\\|[\\|\\|]*\\\\|)\\|\\|", "$1|ST|" );

不对字符串进行任何更改。

请帮忙!

提前致谢。

3 个答案:

答案 0 :(得分:0)

你的问题不是很明确,但我假设你在问为什么输出有差异。你在字符串中传递的正则表达式模式找到了两个匹配项。所以当你说替换所有匹配都被替换时,当使用replaceFirst时,只替换第一个匹配。因此产出的差异。要找到匹配项 -

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regex {

    public static void main(String[] args) {

        String string1 = new String("TEST|X||Y|Z||");           

        Pattern pattern = Pattern.compile("(TEST\\|[\\|\\|]*\\\\|)\\|\\|");
        Matcher matcher = pattern.matcher(string1);

        boolean found = false;
        while (matcher.find()) {
            System.out.printf("I found the text \"%s\" starting at "
                    + "index %d and ending at index %d.%n", matcher.group(),
                    matcher.start(), matcher.end());
            found = true;
        }
        if (!found) {
            System.out.printf("No match found.%n");
        }
    }
}

答案 1 :(得分:0)

如果你只想替换第一个“||”通过“| ST |”,你可以这样做:

System.out.println("TEST|X||Y|Z||".replaceFirst("\\|\\|", "|ST|"));

答案 2 :(得分:0)

您的正则表达式可能没有达到预期效果。管道符号 | 的原因有两个含义。这是你的seprator,它在正则表达式中也是 OR

(TEST\\|[\\|\\|]*\\\\|)\\|\\|

您正在有效地搜索TEST等或者||并匹配|| s

如果您尝试仅匹配||在TEST | X |之后你可以用

"(TEST\\|[^\\|]*)\\|\\|"

TEST后跟管道,跟随零个或多个非管道,然后是两个管道