2017-01-10 15 views
0

テキスト文字列を含むテキストエリアがあります。その値をupdatestringという名前の変数に変更しています。このテキストエリアには、update(){}で囲まれたテキストが表示されています。このテキストは変数updatecodeに入ります。また、中括弧で囲まれたテキストをJavaScriptで囲みます。

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

私が持っている問題は、私はupdate(){}で囲まれたテキストは、文字}が含まれている可能性があることにしたいということです。 JavaScriptでは、ライブラリを使用せずにこれを行う簡単な方法はありますか?

答えて

2

貪欲なマッチングは、最後の1までの中間}文字をスキップしますので、特別なことは何も必要ありません:

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);

[^]は、改行を含むすべてと一致します。

ところで、なぜあなたはregexpを使ってJavaScriptのようなものを解析しようとしていますか?

+0

'[^]'で良いことがありました。しばらく前から正規表現を使っていて、実際に誰かがCRLFを含むすべてのものにマッチするのを見たことがありません。 ;) –

+0

代替は '[\ s \ S]'、 –

+0

でも '[\ d \ D]'と '[\ w \ W]'も機能します。 ;) –

2

編集:torazaburoの回答は良いですが、ここでは教育目的のために別の方法を示すためにここに残しておきます。 ;)

はこれを試してみてください:/[^{]*{((?:.|\r|\n)*)}/

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

[^{]*から{が見つかり、ちょうどその前に停止しているまで、すべての文字をスキップします。

{ - 最初のブレースに一致します。

((?:.|\r|\n)*)から?:は非キャプチャグループ(返却されません)を開始し、*は「貪欲」のすべての文字とキャリッジリターンと一致し、ラインフィード、およびその他の(の間でそれら捕獲グループのすべての部分(になり、 ))が返されます。

} - Regexは、最後に見つかったものと一致するように欲張り検索を停止します。 (*のデフォルトの動作です)

Example: updatestring.match(/[^{]*{((?:.|\r|\n)*)}/)[1] 
関連する問題