【问题标题】:Regex nth match in equal string正则表达式第 n 个匹配字符串
【发布时间】:2012-09-17 04:16:55
【问题描述】:

是否可以仅使用正则表达式(无需额外代码!)来匹配第 n 个匹配项?例如:

“汽车”-“火车”-“船”-“自行车”

现在我只想匹配 BOAT,匹配的正则表达式是“[A-Z]+”,但这也匹配第一个、第二个和第四个。

有没有人为此提供纯正则表达式解决方案?我需要这个,因为我无法更改使用正则表达式的代码,但我可以提供正则表达式。

最好的问候, 罗宾

【问题讨论】:

  • 那么,您对这段代码了解多少?它似乎使用了全局标志,但它支持哪些正则表达式风格?
  • 大多数正则表达式风格将支持 $N(在您的情况下为 $3 用于“船”)进行多个匹配。
  • 这是一个使用 Matcher 的简单 java 正则表达式。第一个匹配项正在用于进一步处理。
  • 你能重新定义你的问题以匹配第 n 个到最后一个而不是第 n 个匹配吗?否则,您将陷入困境,因为 Java 对后向断言的支持有限。

标签: java regex regex-group


【解决方案1】:

如果我理解正确,并且您将多个字符串逐个字符串放入一个正则表达式中,然后 ,这是不可能

正则表达式本身没有比匹配时间更长的内存, 因此,如果您匹配一件事,然后再匹配另一件事,则没有第一件事的信息。

【讨论】:

  • 一次使用1行,但需要匹配第N个单词。
【解决方案2】:

我认为lookbehind 应该这样做:

(?<=^("[A-Z]+"[\s-]+){2})"[A-Z]+"

匹配字符串开头后两个单词的单词

【讨论】:

  • 使用 www.regexpal.com 的简单测试似乎失败了?这是由于验证器还是正则表达式?
  • @RobinUS2:lookbehind 是一个复杂的功能。 JavaScript(在 regexpal.com)根本不支持它,regexr 似乎不支持后向表达式中的重复。
  • @Bergi 添加了来自RegexBuddy 的屏幕截图.net 风味。您可以随意删除它;不想要:)
  • @JohnWoo:酷,谢谢!想给这张图片点个赞:-)
  • @Bergi +1 也为您服务,在后面添加正则表达式!
【解决方案3】:

(?!(\"[AZ]\"\s-\s){2})(\"[AZ]\") - 其中 {2} 表示您的索引想要。

唯一的问题是它也会返回指定索引之后的每个匹配项。您可以执行匹配并返回第一个结果。

在您的示例中使用正则表达式对其进行了测试。

【讨论】:

  • 您能否在您的正则表达式测试用例中发布一个永久链接(请参阅底部的按钮);我真的不敢相信它匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多