2009-12-16 20 views
0

這個問題的答案可能是一個簡單的沒有,但在這裏不用...C++提振正則表達式哪一個元素是真的

我目前使用升壓功能regex_match來評估對正則表達式值的字符串。

而不是隻是返回T/F,有沒有辦法找出多個聯合語句的哪個元素評估爲真?

例如:

^a$|^z$|^p$ 

a --> 0 
z --> 1 
f --> -1 

回答

2

括它們捕獲括號,然後測試其子表達式匹配。

(^a$)|(^z$)|(^p$) 


match_results m; 
regex_match(..., m); 

一個 - >m[1].matched

ž - >m[2].matched

p - >m[3].matched

更新:

您也許能夠改善它通過使單個捕獲組和測試結果,例如:

^([azp])$ 
... 
if ('a' == m[0][0]) ... 

兩種方法幾乎肯定比調用regex_match快三倍,但要確保您只需要測試它。除非你經常這樣做真的,差別不值得擔心。

顯然,請確保您只設置一次正則表達式,而不是每次都需要它。

如果需要它真的,真的很快,你可能不應該使用正則表達式。

+0

您對解決方案的速度有任何見解,而不是僅僅調用3次不同的regex_match? – tinkertime 2009-12-16 20:51:33

+0

我想如果你擔心速度,你應該使用自定義詞法分析器(或lex)而不是正則表達式。更可能不值得擔心。 – 2009-12-16 20:58:52

0

如果你想分析你的文字匹配的詳細程度,也許你應該考慮使用boost的Spirit,而不是正則表達式。