Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何仅在正则表达式中的显式信号字之后进行匹配?_Java_Regex - Fatal编程技术网

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")
正则表达式匹配:

  • (SIGNAL.*?
    -捕获组1(
    $1
    ):一个
    信号子串,然后任何0+字符的其他换行符,尽可能少(因为
    *?
    是一个非贪婪、不情愿的量词)
  • \W+
    -1个或多个非单词字符(字母、数字和
    以外的字符)
  • \d+
    -1+位
  • (结束)
    -捕获组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