2017-06-03 46 views
2

我是新來的正則表達式,我有這樣的文字:如何使用正則表達式排除兩個大括號之間的文本?

測試{{這不應該選擇和大括號太}}但 這個{}或應選擇。所以我想排除所有文字 之間的開幕和結束大括號。

,我想這個結果

「測試」

「但是這一次{或}應選擇。所以,我要排除所有文字 之間的開放和大括號。「

這是我表達我用:

$p = '/[a-zA-Z0-9#\' ]+(?![^{{]*}})/'; 

但是,這排除了單一大括號。
我想知道如何在文本中包括單個大括號,並且只排除兩個大括號之間的文本
請您能給我一些關於正則表達式的好文檔嗎?我想了解更多。

+0

用'preg_split'拆分文本 –

+0

一個很奇怪的任務。 '〜{{。*?}}(* SKIP)(* F)|(?:(?!{{。*?}})。)+〜s'應該可以工作。 –

回答

1

輸入(I加倍效果字符串):

$string='test{{this should not be selected and the curly brackets too}} but this one { or } should be selected. So I want to exclude all text between an opening and closing curly brackets. test{{this should not be selected and the curly brackets too}} but this one { or } should be selected. So I want to exclude all text between an opening and closing curly brackets.'; 

方法#1 preg_split()

var_export(preg_split('/{{[^}]*}}/',$string,null,PREG_SPLIT_NO_EMPTY)); 
// Added the fourth param in case the input started/ended with a double curly substring. 

方法#2 preg_match_all()

var_export(preg_match_all('/(?<=}{2}|^)(?!{{2}).*?(?={{2}|$)/s',$string,$out)?$out[0]:[]); 

輸出(無論哪種方式):

array (
    0 => 'test', 
    1 => ' but this one { or } should be selected. So I want to exclude all text between an opening and closing curly brackets. test', 
    2 => ' but this one { or } should be selected. So I want to exclude all text between an opening and closing curly brackets.', 
) 

preg_split()待雙捲曲纏繞子爲「分隔符」和分裂他們完整的字符串。


preg_match_all()方法圖案... Pattern Demo此使用正回顧後和正超前兩者追捕雙花括號或啓動弦/結束的。它在中間使用負向預覽,以避免在新行開始時匹配不需要的雙捲曲字符串。最後,模式末尾的s修飾符將允許.匹配換行符。

+0

不確定她/他想加入不同部分*(請參閱問題)*。 –

+0

@Mana你還對preg_match_all版本感到滿意嗎?你似乎真的很想要那個。在測試模式時,請使用https://regex101.com,因爲它會告訴您何時出現語法錯誤並解釋您的模式正在做什麼。 http://www.regular-expressions.info/是閱讀東西的好地方 – mickmackusa

+0

@Mana除了這些網站,當然還有很多其他網站都非常有價值。坦率地說,如果你盯着它們太久,所有這些手冊開始讓你的大腦變得脆弱;如果你想讓正則表達式真的沉入其中,那就練習一下真實情況。這些問題爲我理解正則表達式創造了奇蹟。如果您想讓我推薦任何瘋狂令人敬畏的SO用戶,請從以下文章開始:WiktorStribiżew和Casimir et Hippolyte。我從來沒有見過這些人被困住,他們知道很多技巧。 – mickmackusa

0

使用preg_replace並用空字符串替換所有出現的\{\{[^\}]*\}\}

例子:http://www.regextester.com/?fam=97777

說明:

\{  - { 
\{  - { 
[^\}]* - everything except } 
\}  - } 
\}  - } 
+0

我需要使用preg_match_all並獲取不在兩個大括號內的文本。無論如何,你的解決方案使用否定嗎? – Mana

1
(?:^|(?:}}))(.+?)(?:$|{{) 

試試:https://regex101.com/r/2Xy7gU/1/
什麼是發生在這裏:

  • (?:^|(?:}})) - 它與字符串的任意開頭開始或}}
  • (.+?) - 匹配一切(ungreedy)
  • (?:$|{{) - 比賽要結束 用繩子的兩端或{{

你想要什麼(不帶支架)是在第一組。

+0

我想排除這兩個括號,否則,是否有任何解決方案來解開文本,如果它只是在開始和結束括號之間。因爲我只是測試了你的解決方案,似乎不會匹配文本,如果它發現兩個開頭括號,試試這個文本來理解我的意思:「測試{{這不應該被選中,大括號}}但這個}}應該被選中,所以我想排除所有文本之間{打開和關閉花括號「。 – Mana

+0

我的解決方案工作,如果小號匹配(有相同數量的打開和關閉的),如果他們沒有嵌套。如果你想讓它適用於更復雜的分組,你可以搜索{{和}}並且排除包含所述組的匹配項 – ja2142

+0

或者你可以插入負面預測:'(?:^ |(?:}}))((( ?:(?!}})。)+?)(?:$ | {{)' https://regex101.com/r/44DDqO/1 這是您需要的嗎? – ja2142

0

2個選擇:

  • 簡單:只需考慮的塊{{}}爲分割模式
    $validblocks = preg_split("/{{[\w .]+}}/", $str);
  • 複雜:使用組和第一次捕捉rejcted模式,那麼剩下:
    (?<novalid>{{[\w ]+}})|(?<valid>{|[\w .]*|})
    隨後管理它。實施例這裏:https://regex101.com/r/SK729o/2
相關問題