2013-02-28 32 views
1

我需要得到以下正則表達式才能工作,但有問題。是的,它解析HTML。不,沒有更好的選擇。正則表達式否定字符類和點星號

這是正則表達式:

test(.*)\/[^s].*(=|\/|Z) 

我使用了 「U」 修飾符(所以它的ungreedy),和 「\」 是我逃生的象徵。

堵在這個模式:

test.com/sch/anythingwhateverZhello 

結果在比賽中,當我不認爲它應該。雖然我(我想)明確地告訴它它應該A)只捕獲到第一個「/」,所以它應該是「.com」,並且B)捕獲是「.com/sch」和「Z」如果「/」之後的第一個字母是「s」,則不匹配。有趣的是 - 我的問題的可能來源 - 是當我刪除[^ s]時,捕獲現在可以正常工作。有了它,星號就會吞噬第二個「/」,這是沒有意義的。我試着在星號後面加一個問號,就像正則表達式的雙重提示一樣,它不應該是貪婪的,但這沒有什麼區別。

OK,所以不是一個否定的字符類(我真的不想,只排除「S」,我真的想排除「SCH」專),我明年受審負前瞻:

test(.*)\/(?!sch).*(=|\/|Z) 

同樣的問題!匹配和第一次捕獲是「.com/sch」。

任何想法我的錯誤在這裏? (我一直在使用RexV2正則表達式驗證程序http://www.rexv.org/,所以我發現該引擎中可能存在一個錯誤,但我可以在我的實時環境中複製此問題)。

+1

'測試(。*)'這是你的問題。也許它應該是'test([^ \ /] *)'?它的方式是匹配'test.com/sch'和'/',然後在'anythingwhateverZhello'中沒有's',所以它一直在繼續。 – Shef 2013-02-28 20:06:59

+1

先生,你是個天才。這解決了它。我仍然不明白爲什麼不符合(*)不會停在第一個「/」(事實上,確實如此,當它後面沒有[^ s]時......),但我會離開爲進一步的學者。順便說一句,你的修補程序也使得前瞻性的工作。謝謝! – FoulFoot 2013-02-28 20:18:57

+0

太好了,我會將其作爲答案發布,並且您可以將問題標記爲已解決。 – Shef 2013-02-28 20:20:16

回答

0

test(.*)那就是你的問題。也許它應該是測試([^ /] *)?

是,它的匹配test.com/sch,因爲.指任何字符的方式,然後/再有就是在anythingwhateverZhello沒有s,所以它一直持續。