2017-01-10 160 views
0

我有一個包含文本字符串的textarea,我將它的值賦給名爲updatestring的變量。我正在閱讀本文中由update(){}包含的文本。該文本進入變量更新代碼。使用大括號括起來的文字也包含javascript中的大括號

var updatestring = 'update(){\n//logic code here...\n\n\n}\n' ; 
var updatecode = updatestring.match(/update\(\)\{([^}]+)\}/)[1]; 

我的問題是,我想可能是由update(){}包圍的文本還包含字符}。在JavaScript中,有沒有簡單的方法可以在不使用庫的情況下執行此操作?

回答

2

貪婪匹配(這是*默認行爲)將中間}字符跳過直到最後一個,所以需要什麼特別的:

var updatestring = 'update(){\n//logic {embedded curly brackets}code here...\n\n\n}\n' ;  
 

 
var regexp = /{([^]*)}/; 
 
//   ^    match starting curly 
 
//    ^^^^^^   capture 
 
//    ^^^   any character including newline 
 
//    ^   any number of times 
 
//     ^  match ending curly 
 

 
var regexp = result = updatestring.match(regexp)[1]; 
 

 
console.log(updatestring, result);

[^]將匹配包括換行符在內的所有內容。

順便說一下,爲什麼你想使用正則表達式來解析看起來像JavaScript的東西?

+0

''[^]'好的,現在已經存在一段時間了,並且還沒有看到任何人實際使用它來匹配所有包括CRLF。 ;) –

+0

另一種方法是'[\ s \ S]', – 2017-01-10 06:03:24

+0

顯然'[\ d \ D]'和'[\ w \ W]'也能工作,現在我得到了模式,哈哈。 ;) –

2

編輯:torazaburo的答案比較好,但我會在這裏留下這個來顯示另一種方式,僅用於教育目的。 ;)

試試這個:/[^{]*{((?:.|\r|\n)*)}/

例子:https://regex101.com/r/QOIyvz/4

[^{]* - 直到{被發現,之前停止跳過所有的字符。

{ - 匹配第一個大括號。

((?:.|\r|\n)*) - ?:開始非捕獲組(不會被返回),並且*「貪婪」的所有字符和回車匹配和換行,並使其可捕獲的組的所有部分(另一(和之間))返回。

} - 正則表達式將停止貪婪搜索以匹配找到的最後一個。

Example: updatestring.match(/[^{]*{((?:.|\r|\n)*)}/)[1]