2014-06-27 66 views
0

我是新來使用正則表達式,並想知道如果下面的正則表達式可以以某種方式簡化...簡化和修正正則表達式

{{(?:[\s]+)?(.*)([\s]+)?}} 

我試圖獲取字符串了以下格局。 ...

{{SOME_STRING}} 
{{ SOME_STRING}} 
{{ SOME_STRING }} 
{{ SOME-STRING  }} 
{{ SomE STRING }} 

此外,它不完全正常工作,因爲在比賽中不應該有任何尾隨空格。

Regex101鏈接:http://regex101.com/r/kT9yT5

+0

寫'\ S *'代替'(?:[\ S] +)'用於一個?。 –

回答

1

不應該有在比賽的任何尾隨空格

你可以試試下面的正則表達式,並得到了匹配組

/{{\s*(.*?)\s*}}/g 

這意味着每被包含在{{}}內的東西使用難以量化的量詞

這裏是Online Demo

瞭解更多關於Greedy vs. Reluctant vs. Possessive Quantifiers

+0

第二個有拖尾空間,第一個很好。 – user1960364

+0

@Braj你需要擺脫大括號。 –

+0

@AvinashRaj我不這麼認爲。 – Braj

0

你可以試試下面的正則表達式來刪除所有尾隨而目前{}內開始空格,

\{\{\s*(\w+[-\s]?\w+)\s*\}\} 

DEMO

Expl anation:

  • \{\{立即開口大括號{{
  • \s*零個或多個空格。
  • \w+一個或多個單詞字符。可選-或空格字符。
  • \w+一個或多個單詞字符。
  • \s*零個或多個空格字符。
  • \}\}文字閉花括號}}

你的代碼會是這樣,

$regex = '~\{\{\s*(\w+[-\s]?\w+)\s*\}\}~'; 
preg_match_all($regex, $yourstring, $matches); 
print_r($matches[1]); 

Ideone

1

對於直接匹配,使用\K魔術

{{\s*\K[^}]+?(?=\s*}}) 

See demo.

說明

  • {{\s*開幕括號和任何空白字符
  • \K告訴引擎砸什麼從最後一場比賽到目前爲止匹配返回
  • 匹配否定字符類[^}]+?懶惰地匹配任何字符到...
  • 先知(?=\s*}})可以斷言接下來的內容是空格和右花括號。

示例代碼

看到輸出在live php demo的底部。

$regex = '~{{\s*\K[^}]+?(?=\s*}})~'; 
preg_match_all($regex, $yourstring, $matches); 
print_r($matches[0]); 

輸出

[0] => SOME_STRING 
[1] => SOME_STRING 
[2] => SOME_STRING 
[3] => SOME-STRING 
[4] => SomE STRING