2011-02-02 61 views
0

我一直都在为这个早晨奋斗。希望有一些正则表达大师可以引导我走向正确的方向。基本上,我使用正则表达式来比较两个字符串值。同样的正则表达式应该适用于这两个字符串,并且如果所有命名组中的所有值都匹配,我们认为字符串等效(这种命名组检查在代码中完成)。命名捕获带有两个变种的正则表达式

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

所以......

JW-CST - >捕获组值= “CST” CST - >捕获组值= “CST”

捕获组的名称是无关紧要的,应用程序我正在通过捕获的每个组简单循环,确保它们匹配两个结果。

到目前为止,我有这样的:(?。(< = - ) | *)

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

+0

这是你正在使用的唯一一种字符串吗?在这种情况下,一个简单的`/-?((**$/)`就足够了。但我相信它更复杂。那么你能提供一个真正的字符串和你期望的匹配吗? – Pierre 2011-02-02 17:11:11

+0

您需要给出具体和完整的好输入和坏输入示例。 – tchrist 2011-02-02 18:35:47

回答

1

你可以使用这个表达式:

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

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

这不会对字符串长度施加任何限制,它允许字母数字字符;如果你只希望允许例如2至3个ASCII字符,你可以使用

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

如果你给有关的编程语言(因此它的正则表达式引擎)你使用,我可能有更多的技巧您。

在.NET中,你也可以使用:

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

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