【问题标题】:What's wrong with the non capture group in my regular expression我的正则表达式中的非捕获组有什么问题
【发布时间】:2014-08-15 03:42:17
【问题描述】:

我正在尝试编写一个匹配类似于以下字符串的正则表达式:

Yu MSBE26
w AWAQBNL

我正在使用 Javascript 并想出了以下正则表达式:

(.*?(?:[AWMS\d]{2})[AWMS\d]{2}[A-Z]{2}[\dA-Za-z]{1,3})

换句话说,我通过匹配所有内容开始我的捕获组,直到遇到[AWMS\d]{2} 模式,然后我匹配[AWMS\d]{2} 模式,随后的[A-Z]{2},最后匹配[\dA-Za-z]{1,3} 以匹配最后两个或三个字符。

根据我的阅读,这应该可以工作,但我没有得到任何匹配项。

例如,当我使用正则表达式测试器时,我没有得到任何匹配:Sample

【问题讨论】:

  • 您能再分享一些您预期的匹配项和不匹配项吗? This doesn't work(很明显)很难知道你期望的工作是什么。
  • 我编辑了我的问题,将我的样本包含在正则表达式测试器中。我正在尝试匹配这两个字符串,但对我来说为什么不匹配并不明显。谢谢。
  • 我很确定它不匹配,因为您的非捕获组在 NC 组之后再次重复。猜测这是一个错误。删除它,它工作正常。
  • @Mutuelinvestor 您的正则表达式无法匹配您的字符串,因为与我在回答中详述的模式不匹配。
  • a-Z[\dA-Za-Z]{1,3} 中是不是拼写错误?如果没有,那么它将无法按预期工作。

标签: javascript regex


【解决方案1】:

删除第二个[AWMS\d]{2} - 它看起来像是一个意外添加,这也是您的正则表达式没有work 的原因:

(.*?(?:[AWMS\d]{2})[A-Z]{2}[\dA-Za-z]{1,3})

编辑:你甚至不需要非捕获组,方括号就足够了:

(.*?[AWMS\d]{2}[A-Z]{2}[\dA-Za-z]{1,3})

【讨论】:

  • 第一个 [AWMS\d] 是非捕获组的一部分。我使用第二个来实际匹配,不是吗?还是我不了解非捕获组的工作方式。我以为 .*?由于非捕获组,将匹配第一个字符串中的 MS。然后我从那里匹配。
  • 您只需要在您的模式中使用一次。如果您使用常规捕获组,它实际上会捕获这两个字母/数字以及整体模式(see example),但您根本不需要捕获/NC 组,因为您的方括号可以解决问题.
  • See here 了解您的正则表达式的作用(没有 NC/C 组)
  • 我无法与成功争论,谢谢。非捕获组没有捕获的东西我错了吗?
  • 非捕获组不捕获。但如果它在一个捕获组内,NC 组的内容仍将被捕获在父捕获组中。 See my comment on the other answer
【解决方案2】:

您的正则表达式与您的值不匹配,因为它们不匹配。

你的模式是:

(.*?(?:[AWMS\d]{2})[AWMS\d]{2}[A-Z]{2}[\dA-Za-z]{1,3})

Yu MSBE26
     ^--- fails here
w AWAQBNL
     ^--- fails here

顺便说一句,你可以使用你的正则表达式来匹配你的字符串:

(.*?[AWMS\d]{2}[A-Z]{2}[\dA-Za-z]{1,3})

Working demo

【讨论】:

  • 谢谢。您的演示效果很好,但它不使用非捕获组。我需要使用一个,因为这只是一个更大的正则表达式的一部分。
  • [A-Z]{2} 与 BE 和 AQ 不匹配。我的理解是非捕获组不匹配。因此,第二个 [AWMS\d]{2} 将匹配 MA,[A-Z]{2} 将匹配 BE,而 [\dA-Za-z]{1,3} 将匹配 26。
  • @Mutuelinvestor 是的,[A-Z]{2} 匹配 BE 和 AQ。 capturing 部分是由字符串左右两端的() 括号控制的。匹配并在这些括号内的所有内容都将被“捕获”并从正则表达式返回。如果您必须在该组中有第二组括号 (),并且您不希望它们被返回两次(因为它会是另一个捕获组),那么 是您应该使用非捕获组来否定它。他们仍然被捕获在整个组中。就您而言,您根本不需要内部组。
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多