2012-03-05 60 views
1

我對正則表達式相當陌生,並試圖找出只匹配自定義標記中單詞實例的模式。正則表達式只匹配自定義標記中的單詞

在下面的示例中,兩個單詞都匹配在|和前一個]匹配之後的是,條件是

Pattern: (?=|)singleline(?=.*]) 

Sample: [if @sample|singleline second] <p>Another statement singleline goes here</p> [/if] 
+0

您可以舉一個您希望產生的輸入和預期輸出的例子嗎? – Developer 2012-03-05 02:28:38

+0

只是看看是否符合條件。可能希望刪除單詞:\t \t'$ pattern ='%(?= \ |)singleline(?=。*])%'; \t \t $ output = preg_replace($ pattern,「」,$ output);' – jsuissa 2012-03-05 02:33:28

回答

2

詞語|和前一]

.*,這意味着「什麼,零次或多次,和貪婪一下」,將比賽進行到字符串的結尾和備份只夠得到一個]最後一)。 (和你的回顧後是一個超前):

,如果你真的想匹配你說你想匹配(見報價),那麼這就是它:

Pattern: (?<=|)(\w+)(?=]) 

編輯:或者這一個,如果你想「匹配字母數字和空格內|和]」:

Pattern: (?<=|)([\w\s]+?)(?=]) 
1

(?=|)聲稱,該字符串存在或是什麼,接下來的事情。這將始終評估爲true;總是有可能無所適從。我認爲sweaver2112是正確的,你打算在那裏使用後視,但你也需要逃離管道:(?<=\|)。或以正常方式匹配管道;我認爲沒有必要使用該部分的lookarounds。

另一部分可能確實需要一個預見,但你需要擴大一點。你想斷言該單詞後面跟着一個右括號,但如果首先有一個左括號,則不會。假設括號總是正確配對,那應該意味着這個詞在它們之間。就像這樣:

Pattern: \|singleline(?=[^\]\[]*\]) 

[^\]\[]*\]零個或多個任意字符,除了][,隨後]匹配。根據正則表達式的風格,逃避「真實」括號的反斜槓可能或可能不是必要的,但是逃脫它們總是安全的。

+0

感謝您的建議,向前看是一個很大的幫助。我有這樣的:'(?<= @ sample |。)singleline(?= [^ \] \ [] * \])它工作到目前爲止,除了它匹配任何@word不只是指定的 – jsuissa 2012-03-05 03:30:01

+0

是否?<= @ sample \ |)singleline(?= [^ \] \ [] * \])'做你想做的事?我仍然不確定你想要完成什麼,也許'(?:@ sample \ |)?singleline(?= [^ \] \ [] * \])'會投放。 – 2012-03-05 03:54:30

相關問題