java - 正则表达式捕获组混淆

标签 java regex

我有以下文字

Jul 31, 2015 - Departure 2 stops Total travel time:20 h 40 m
Aug 26, 2015 - Return 1 stop Total travel time:19 h 0 m Chicago
nonstop

我想获取看起来像“stop(s)”的文本和“nonstop”的所有实例之前的数字,但是我希望两者都在同一个捕获组中。

我写了这个正则表达式 (\d)(?:\Wstops?)|(nonstop)

这是我想要的,但如您所见,它由两个捕获组组成(第 1 组用于数字,第 2 组用于“不间断”),这可以通过单个捕获组完成吗?

我的另一个问题,是否可以使用正则表达式直接将“不间断”返回为 0,而不是稍后在代码中处理文本?

这是我的正则表达式的现场演示:regex101

最佳答案

你需要用正lookahead assertion .

Matcher m = Pattern.compile("\\d(?=\Wstops?)|nonstop").matcher(s);
while(m.find())
{
System.out.println(m.group());
}
  • \\d(?=\Wstops?) 仅当其后跟一个非单词字符后又跟字符串 stop 时才匹配所有数字或停止

  • | 或者

  • nonstop 匹配字符串nonstop

关于java - 正则表达式捕获组混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31401599/

相关文章:

java - 在 Java 中将字符串转换为字节

java - Java中的实时更新秒表?

java - 有什么(任何方式)可以比 StringWriter 更快地连接 java 字符串吗?

java - 如何从数据库读取 keystore

java - 为什么 StringBuilder 会抛出 NullPointerException

java - matcher.find() 匹配太多

python - Python 非贪婪正则表达式的行为

regex - 无法让此 REGEX 负向前瞻/环视适用于 JS

javascript - 检测匹配的括号

带有转义反斜杠的 Swift 正则表达式不起作用