Java 如何仅在正则表达式中的显式信号字之后进行匹配?
我想匹配Java 如何仅在正则表达式中的显式信号字之后进行匹配?,java,regex,Java,Regex,我想匹配信号和结束字之间的任何“非字符+数字” (?!SIGNAL)\\W+\\d+(?=END) 但是:以下匹配+2和+7: random+2END+SIGNAL+random++7END 为什么这里的+2匹配?只有我希望这里有++7 我的最终目标是用空白代替比赛 例如: Java代码: Pattern.compile(REGEX).matcher(input).replaceFirst(StringUtils.EMPTY); 你可以用 s.replaceFirst("(SIGNAL.*
信号
和结束
字之间的任何“非字符+数字”
(?!SIGNAL)\\W+\\d+(?=END)
但是:以下匹配+2
和+7
:
random+2END+SIGNAL+random++7END
为什么这里的+2
匹配?只有我希望这里有++7
我的最终目标是用空白代替比赛
例如:
Java代码:
Pattern.compile(REGEX).matcher(input).replaceFirst(StringUtils.EMPTY);
你可以用
s.replaceFirst("(SIGNAL.*?)\\W+\\d+(END)", "$1$2")
正则表达式匹配:
-捕获组1((SIGNAL.*?
):一个$1
信号子串,然后任何0+字符的其他换行符,尽可能少(因为
是一个非贪婪、不情愿的量词)*?
-1个或多个非单词字符(字母、数字和\W+
以外的字符)
-1+位\d+
-捕获组2((结束)
):一个$2
子字符串结束
-两个数字替换反向参考,参考组1和组2的值$1$2
像往常一样,使用捕获组
/SIGNAL(您的_模式)END/.exec[1]
对不起,您能使用上面的regexr
链接给出一个适当的示例吗?原因信号(\W+\d+)结束
与此处的任何内容都不匹配!所以我怀疑这是重复的…为什么不?看,这很有效。请更详细地解释您想要得到什么以及为什么。如前所述,我只想在本例中匹配++7
。不是信号词,不是结束词。(因为我最终只想在匹配的++7
上运行一个正则表达式替换,并保留信号字。我不想匹配通配符,只想匹配非字符+数字。好了,现在,您似乎想要s.replace(/signal.*?END/g,function($0){返回$0.replace(/\W+\d+/g,,);})
好了,现在很清楚了:所以你用group1+group2替换完整匹配。如果开始是&SIGNAL
,结束是下一个&
,将random+2&SIGNAL+random++7&SIGNAL+random++7&
与(&SIGNAL.*?)\W+\d+(&)匹配怎么办
?这不起作用,只找到第一个匹配项!找到它:s.replaceFirst((SIGNAL.*?\\W+\\d+(?=END)”,“$1”)
我只是排除了第二个具有负面外观的匹配项,因此它可以重复使用。@membersound正确,lookaheads不使用文本,只检查当前位置右侧是否有文本。
String s = "random+2END+SIGNAL+random++7END";
System.out.println(s.replaceFirst("(SIGNAL.*?)\\W+\\d+(END)", "$1$2"));
// => random+2END+SIGNAL+randomEND