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

Regex handling zero-length match

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

例如:

我一直卡在这种产生错误结果的正则表达式上:

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

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

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

使用string.matches方法。这 returns 对于有效字符串是正确的。

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

输出:

false
true

DEMO

您是否正在寻找只匹配无效字符串的正则表达式?应该这样做:

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

它将匹配两个或多个连续的星号,前面没有反斜杠。

编辑:(?<!foo) 东西叫做 "negative look-behind"。它匹配字符串中的任何零长度位置,该位置前面没有与括号内的正则表达式匹配的区域(在本例中为 "foo",或在您的反斜杠中)。 一开始我把它当作 [^\\],这几乎是同一件事(在这种情况下), 除了 它匹配任何 字符 ,除了反斜杠,但不是字符的 absense,例如“**”中字符串的开头。

环视(后视和前视)以及许多其他正则表达式都有很好的详细描述 "magic" here