2016-08-22 17 views
1

我需要找到像字符串的所有比賽:正則表達式:找不到合適的表情

{{ <text | default('<text or empty space>') }} 

這樣的模式,其中{{|例如:

{{ text1 | default('default for text1 value') }} 

我需要在同一行中匹配很多這些模式。我與(見here

[\{]{2} (.*) [|]{1} default(.*) [\}]{2} 

努力,但它沒有得到正確的匹配(只是一個2表達式)。任何幫助?

+0

在內部使用lazy'。*?'模式並刪除'{1}'。並將''g「'修飾符傳遞給正則表達式構造函數(最好使用正則表達式)。請參閱https://jsbin.com/mumuhoxidi/1/edit?js,console –

回答

1

請注意,.*部分是貪婪的,並匹配儘可能多的符號。您可以使用懶惰版本.*?,但還需要g全局修飾符才能使正則表達式引擎匹配多次。此外,我建議使用正則表達式文字符號,因爲正則表達式是靜態的,並且不是從變量構建的。

var reg = /\{{2} (.*?) \| default(.*?) \}{2}/g; 

regex demo

var reg = /\{{2} (.*?) \| default(.*?) \}{2}/g; 
 

 
var text = "{{ text1 | default('text1 default') }} {{ text2 | default('text2 default') }}" 
 

 
console.log(text.match(reg));

注意:您將需要RegExp#exec在一個循環中獲得所有捕獲的文本。

另一個注意事項:如果您的輸入可能在您需要的文本之前有{{ text}}之類的內容,.*?將會貪婪地行動。您將需要用(?:(?!\}{2}).)*替代所有.*?脾氣暴躁的令牌。見this demo