【问题标题】:Reg Ex: Repeating Patterns that match different values正则表达式:匹配不同值的重复模式
【发布时间】:2017-08-28 07:33:28
【问题描述】:

例如,我正在尝试重用正则表达式组:

(?<var>[A-Za-z](\d*\w*)*)

匹配大多数变量名,例如abcabc123abc_123abc_123_abc 等等。

有没有一种方法可以重复使用这个组而不用再次输入整个模式?


例如,如果我想创建一个正则表达式来匹配以下字符串:

abc_123 AS xyz_89

我需要创建一个像这样的 reg ex:

^([A-Za-z](\d*\w*)*)( AS )([A-Za-z](\d*\w*)*)$

并且匹配类似的东西:

abc_123.def_456 AS xyz_89

我需要使用相同的模式 3 次。

能够参考第一组似乎更有效率,所以我不重复正则表达式逻辑。我读过关于反向引用的文章,但似乎它们是为了匹配相同的 value 而不是一般模式。

【问题讨论】:

  • 你用的是什么正则表达式?
  • 反向引用仅返回在正则表达式的前一部分中捕获的内容。它实际上并没有合成任何新信息。
  • 顺便说一句,(\d*\w*)* 正在打开通往灾难性回溯地狱的大门。
  • @anubhava Java 当前
  • @SebastianProske 我愿意接受更好的方法来实现同样的目标:)

标签: java regex


【解决方案1】:

php 中,递归子模式有效:

^([A-Za-z](?:\d*\w*)*)( AS )(?1)

上面的正则表达式将匹配:

abc_123 AS xyz_89

解释:

  1. ([A-Za-z](?:\d*\w*)*) 取自您的示例并标记为第 1 组
  2. ( AS ) 取自您的示例,保持原样
  3. (?1)是第一组的递归子模式

Demo

【讨论】:

  • @RizwanM.Tuman 是的,我已经添加了 java 标签。没有语言/工具/方言标签的正则表达式问题几乎无法回答,尤其是当它们依赖于仅在某些风格中可用的功能时。这就是阿努巴瓦在评论中要求澄清的原因。
  • @SebastianProske 哦,好的,现在知道了:|
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
相关资源
最近更新 更多