繁体   English   中英

正则表达式处理零长度匹配

[英]Regex handling zero-length match

我有带*(星号)符号的字符串作为输入。 如果字符串有两个连续的星号,则认为该字符串无效。 但是,有一个逃脱符号\\(反斜杠)。

例如:

  • “**”(无效)
  • “\\ **”(有效)
  • “案例**”(无效)
  • “case \\ **”(有效)
  • “* \\ *”(有效)

我正在坚持这样的正则表达式产生不正确的结果:

  1. /[^\\\\]\\*\\*/ - java.util.regex.Pattern.compile("/[^\\\\\\\\]\\\\*\\\\*/")
  2. /([^\\\\]*?\\*\\*)|(\\*\\*)/ - java.util.regex.Pattern.compile("/([^\\\\\\\\]*?\\\\*\\\\*)|(\\\\*\\\\*)/")

另外,我从http://docs.oracle.com/javase/tutorial/essential/regex/quant.html上读到了关于贪婪,不情愿和占有欲的量化。

我知道问题是关于零长度匹配,但无法生成正确的正则表达式。

使用string.matches方法。 对于有效字符串,返回true。

String s1 = "case**";
String s2 = "case\\**";
System.out.println(s1.matches("(?=.*(\\\\\\*\\*|\\*\\\\\\*)).*"));
System.out.println(s2.matches("(?=.*(\\\\\\*\\*|\\*\\\\\\*)).*"));

输出:

false
true

DEMO

你在寻找一个只能匹配无效字符串的正则表达式吗? 这应该做:

"(?<!\\\\)\\*\\*+"

它将连续匹配两个或多个星号,而不是反斜杠。

编辑: (?<!foo) thingy被称为“负面观察”。 它匹配字符串中的任何零长度位置,该位置前面没有与括号内的正则表达式匹配的区域(在本例中为“foo”,或者在您的反斜杠中)。 我首先把它作为[^\\\\\\\\] ,这几乎是相同的(在这种情况下), 除了它匹配任何字符 ,而不是反斜杠,但不是一个字符的缺席 ,就像在开头“**”中的字符串。

有一个很好的详细描述的外观(后视和前瞻)以及许多其他正则表达“魔术” 在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM