我對正則表達式相當陌生,並試圖找出只匹配自定義標記中單詞實例的模式。正則表達式只匹配自定義標記中的單詞
在下面的示例中,兩個單詞都匹配在|和前一個]匹配之後的是,條件是
Pattern: (?=|)singleline(?=.*])
Sample: [if @sample|singleline second] <p>Another statement singleline goes here</p> [/if]
我對正則表達式相當陌生,並試圖找出只匹配自定義標記中單詞實例的模式。正則表達式只匹配自定義標記中的單詞
在下面的示例中,兩個單詞都匹配在|和前一個]匹配之後的是,條件是
Pattern: (?=|)singleline(?=.*])
Sample: [if @sample|singleline second] <p>Another statement singleline goes here</p> [/if]
詞語|和前一]
的.*
,這意味着「什麼,零次或多次,和貪婪一下」,將比賽進行到字符串的結尾和備份只夠得到一個]
(最後一)。 (和你的回顧後是一個超前):
,如果你真的想匹配你說你想匹配(見報價),那麼這就是它:
Pattern: (?<=|)(\w+)(?=])
編輯:或者這一個,如果你想「匹配字母數字和空格內|和]」:
Pattern: (?<=|)([\w\s]+?)(?=])
(?=|)
聲稱,該字符串存在或是什麼,接下來的事情。這將始終評估爲true
;總是有可能無所適從。我認爲sweaver2112是正確的,你打算在那裏使用後視,但你也需要逃離管道:(?<=\|)
。或以正常方式匹配管道;我認爲沒有必要使用該部分的lookarounds。
另一部分可能確實需要一個預見,但你需要擴大一點。你想斷言該單詞後面跟着一個右括號,但如果首先有一個左括號,則不會。假設括號總是正確配對,那應該意味着這個詞在它們之間。就像這樣:
Pattern: \|singleline(?=[^\]\[]*\])
[^\]\[]*\]
零個或多個任意字符,除了]
或[
,隨後]
匹配。根據正則表達式的風格,逃避「真實」括號的反斜槓可能或可能不是必要的,但是逃脫它們總是安全的。
感謝您的建議,向前看是一個很大的幫助。我有這樣的:'(?<= @ sample |。)singleline(?= [^ \] \ [] * \])它工作到目前爲止,除了它匹配任何@word不只是指定的 – jsuissa 2012-03-05 03:30:01
是否?<= @ sample \ |)singleline(?= [^ \] \ [] * \])'做你想做的事?我仍然不確定你想要完成什麼,也許'(?:@ sample \ |)?singleline(?= [^ \] \ [] * \])'會投放。 – 2012-03-05 03:54:30
您可以舉一個您希望產生的輸入和預期輸出的例子嗎? – Developer 2012-03-05 02:28:38
只是看看是否符合條件。可能希望刪除單詞:\t \t'$ pattern ='%(?= \ |)singleline(?=。*])%'; \t \t $ output = preg_replace($ pattern,「」,$ output);' – jsuissa 2012-03-05 02:33:28