2010-07-26 117 views
2

我想接受來自用戶的任意正則表達式,並將其錨定在雙方以強制完全匹配(^<user's-regex>$),但我不知道是否必須考慮事實:用戶可能已經錨定了他的正則表達式。雙重錨定正則表達式

它看起來像Perl,C++,.NET和JavaScript都允許雙重多重錨定。

"hello" =~ /^h/ # true 
"hello" =~ /^^h/ # true 
"hello" =~ /^^^h/ # true 
"hello" =~ /e/ # true 
"hello" =~ /^e/ # false 
"hello" =~ /^^e/ # false 

有誰知道這是否被指定以這種方式工作?我可以依靠這種行爲嗎?或者這是一種事故,將來有可能發生變化?


編輯:需要我們這樣做的原因是,我們正在使用VBScript的正則表達式的(從COM),我們使用match然而,這將返回所有比賽所以它要慢得多字符串abc匹配.*a.*^.*a.*$。通過使用@Tim建議的錨定,我們的速度匹配(對於長字符串)大於12倍。

+0

你爲什麼需要這個? – SilentGhost 2010-07-26 10:57:56

回答

4

您可以依賴此行爲。正則表達式引擎不介意連續一次,兩次或一百次地聲明相同的事物。

然而,不是簡單地將周圍的正則表達式錨,你也應該增加它周圍的非捕獲組:

^(?: - 用戶正則表達式 - )$或最好,如果您正則表達式的味道讓這樣的:\A(?: - 用戶正則表達式 - )\Z

否則,如果用戶在他的正則表達式中使用替換,你會絆倒。比較:

user regex:   hello|bye 
anchored regex:  ^hello|bye$  // alternation now affects anchors 
correctly anchored: ^(?:hello|bye)$ 
+0

我更新動機的問題,謝謝你的回答非常有幫助。 – Motti 2010-07-27 05:46:35