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

标签 java regex regex-negation regex-lookarounds

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

例如:

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

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

  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

关于java - 正则表达式处理零长度匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28153264/

相关文章:

java - Cron 表达式在该月的最后一天不起作用

java - Android Adapter的convertview未更新

java - 如果函数不是递归的,while 可以用 if 代替吗?

regex - 使用正则表达式匹配两个字符串之间的字符串,同时排除字符串

ios - 如何在 Swift 中组合正则表达式?

java - JSF 页面更改后未部署

php - 使用正则表达式删除字符串末尾除指定标签之外的所有标签

java - Java 的 Bash 风格模式匹配、扩展和路径名解析

php - 使链接在文本 block 中可点击的最佳方法

正则表达式 - 匹配除特定字符串以外的任何内容