【问题标题】:Named capture Regex with two variants具有两个变体的命名捕获正则表达式
【发布时间】:2011-06-20 03:06:59
【问题描述】:

我整个上午都在为此苦苦挣扎。希望一些正则表达式大师可以引导我朝着正确的方向前进。基本上,我使用正则表达式来比较两个字符串值。应该对两个字符串应用相同的正则表达式,如果所有命名组中的所有值都匹配,我们认为字符串等价(此命名组检查在代码中完成)。

对于字符串,我有类似“jw-cst”的东西,需要与“cst”进行比较。我需要的正则表达式应该考虑这些等价的,因为之前和包括“-”的任何内容都不应该在命名组中捕获。

所以...

jw-cst -> 捕获组值 = "cst" cst -> 捕获组值 = "cst"

捕获组的名称无关紧要,我正在使用的应用程序只是遍历捕获的每个组,以确保它们匹配两个结果。

到目前为止,我有这个:

(?(?-).|.*)

但它似乎使用了第二个匹配条件......所以总是返回“jw-cst”而不仅仅是“cst”。如果我删除第二种选择 (.*),它将正确匹配...任何帮助将不胜感激。

【问题讨论】:

  • 您正在处理的只有这种字符串吗?在这种情况下,一个简单的/-?(.*)$/ 就足够了。但我敢肯定它更复杂。那么你能提供一个真实的字符串以及你期望匹配的内容吗?
  • 你需要给出好的输入和坏输入的具体和完整的例子。
  • 一组字符串将全部为 2 或 3 个字符(首字母,即 BL 或 MRK),另一组字符串将与前一组相同(首字母,即 BL 或 MRK)或将是两个首字母的组合,永远不会更多(即 BL-MRK 或 DLN-MRK)。我将始终与第二组首字母匹配(即,如果字符串是 BL-MRK,我只对 MRK 部分感兴趣)。示例:1) ALK 2) ALK 捕获:ALK 1) BLK-CRS 2) CRS 捕获:CRS 1) DN-ELB 2) ELB 捕获:ELB 1) FN-GA 2) GA 捕获:GA

标签: regex


【解决方案1】:

你可以使用这个正则表达式:

^(?:\w+-)?(\w+)$

并将其应用于两个字符串。捕获组 1 应包含相同的字符串。

这对字符串长度没有任何限制,它允许使用字母数字字符;例如,如果您只想允许 2 到 3 个 ASCII 字符,则可以使用

^(?:[A-Z]{2,3}-)?([A-Z]{2,3})$

如果您提供有关您正在使用的编程语言(以及因此使用的正则表达式引擎)的信息,我可能会为您提供更多提示。

在 .NET 中,您还可以使用:

(?<=^(?:\w+-)?)\w+$

这样,整个比赛将只包含“第二”部分。

【讨论】:

  • 非常好!谢谢,就是这样。作为参考,使用 .Net 作为正则表达式引擎。您提供的第一个正则表达式就可以了。我觉得我太挂了 |而不是寻找更简单的解决方案。再次感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多