2011-02-02 69 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+$ 

這樣一來,整個比賽將只包含「第二」的一部分。