正则表达式处理零长度匹配
Regex handling zero-length match
我将带有 *(星号)符号的字符串作为输入。如果字符串有两个连续的星号,则认为该字符串无效。但是,有一个转义符号 \(反斜杠)。
例如:
- "**"(无效)
- "\**"(有效)
- "case**"(无效)
- "case\**"(有效)
- "*\*"(有效)
我一直卡在这种产生错误结果的正则表达式上:
/[^\]\*\*/
- java.util.regex.Pattern.compile("/[^\\]\*\*/")
/([^\]*?\*\*)|(\*\*)/
- 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
您是否正在寻找只匹配无效字符串的正则表达式?应该这样做:
"(?<!\\)\*\*+"
它将匹配两个或多个连续的星号,前面没有反斜杠。
编辑:(?<!foo)
东西叫做 "negative look-behind"。它匹配字符串中的任何零长度位置,该位置前面没有与括号内的正则表达式匹配的区域(在本例中为 "foo",或在您的反斜杠中)。
一开始我把它当作 [^\\]
,这几乎是同一件事(在这种情况下), 除了 它匹配任何 字符 ,除了反斜杠,但不是字符的 absense,例如“**”中字符串的开头。
环视(后视和前视)以及许多其他正则表达式都有很好的详细描述 "magic" here
我将带有 *(星号)符号的字符串作为输入。如果字符串有两个连续的星号,则认为该字符串无效。但是,有一个转义符号 \(反斜杠)。
例如:
- "**"(无效)
- "\**"(有效)
- "case**"(无效)
- "case\**"(有效)
- "*\*"(有效)
我一直卡在这种产生错误结果的正则表达式上:
/[^\]\*\*/
-java.util.regex.Pattern.compile("/[^\\]\*\*/")
/([^\]*?\*\*)|(\*\*)/
-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
您是否正在寻找只匹配无效字符串的正则表达式?应该这样做:
"(?<!\\)\*\*+"
它将匹配两个或多个连续的星号,前面没有反斜杠。
编辑:(?<!foo)
东西叫做 "negative look-behind"。它匹配字符串中的任何零长度位置,该位置前面没有与括号内的正则表达式匹配的区域(在本例中为 "foo",或在您的反斜杠中)。
一开始我把它当作 [^\\]
,这几乎是同一件事(在这种情况下), 除了 它匹配任何 字符 ,除了反斜杠,但不是字符的 absense,例如“**”中字符串的开头。
环视(后视和前视)以及许多其他正则表达式都有很好的详细描述 "magic" here