以下正则表达式在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|" );
不对字符串进行任何更改。
请帮忙!
提前致谢。
答案 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后跟管道,跟随零个或多个非管道,然后是两个管道