13

テンプレートエンジンの場合、正規表現を使用して、文字列の角かっこで囲まれたコンテンツを識別しています。たとえば、正規表現は{key}または<tag>または[element]と一致する必要があります。

現在、私の正規表現は次のようになっています。

var rx=/([\[\{<])([\s\S]+?)([\]\}>])]/;

問題は、そのような正規表現が角かっこを強制的に一致させないことです。たとえば、次の文字列で:

[{lastName},{firstName}]

正規表現は一致します[{lastName}

一致する角かっこを定義する方法はありますか?たとえば、開き角かっこが[の場合、閉じかっこは}や>ではなく]でなければならない、と言います。

4

4 に答える 4

29

これを行う最良の方法は、特に異なる角かっこが異なる意味を持つ可能性がある場合、3つの正規表現に分割することです。

var rx1 = /\[([^\]]+)]/;
var rx2 = /\(([^)]+)\)/;
var rx3 = /{([^}]+)}/;

これらは、、、、およびで囲まれ[]たテキストと、最初に一致したグループ内のテキストと一致します。(){}

于 2012-08-10T18:53:49.907 に答える
4
var rx = /\[[^\]]+\]|\{[^}]+\}|<[^>]+>/;
于 2013-01-17T00:15:06.390 に答える
4

かなり長くなりますが、|このようなパイプ文字()を使用する代替手段を使用できます。/\[([\s\S]+?)\]|\{([\s\S]+?)\}|<([\s\S]+?)>/

編集:正規表現を短縮しました、もうそれほど長くはありません...

于 2012-08-10T18:42:56.133 に答える
1

一致する角かっこを定義する方法はありますか?たとえば、開き角かっこが[の場合、閉じかっこは}や>ではなく]でなければならない、と言います。

並べ替え。

EREは、説明した方法で閉じ括弧を開き括弧に一致させる方法を提供していません。(PREGマジックを使用することは可能かもしれませんが、それは他の誰かに任せる必要があります。)複数の正規表現を使用するか、単一の正規表現内に複数のアトムを含める必要があります。

単一の正規表現を使用する場合は、検出する括弧で囲まれた文字列のタイプと、その文字列の内容を判別する必要があると思います。コメントで述べたように、これはプログラミング言語で行う必要がありますが、少なくとも正規表現から必要なものを取得できます。

以下の正規表現では、文字列の各スタイルはREで「ブランチ」として表されます。ブランチはor-バー()で区切られ|ます。わかりやすくするために、すべての文字列はであると想定しています[:alnum:]。コンテンツを指定していないため、特定の要件に合わせて調整する必要があります。

/(\[)([[:alnum:]]+)\]|(\()([[:alnum:]]+)\)|(\{)([[:alnum:]]+)\}/
 ↑   ↑               ↑                    ↑
 $1  $2           divider              divider

各ブランチでは、最初の文字が丸括弧で囲まれているため、「アトム」になっていることに注意してください。後方参照のようにこのアトムを参照するには、コードが必要です。2番目のアトムは内側のストリングです。さて...私のJavaScriptは、たとえばベーキングスキルほど強力ではありませんが、これは始まりかもしれません。

String.prototype.bracketstyle = function() {
  var re = /(\[)([:alnum:]+)\]|(\()([:alnum:]+)\)|(\{)([:alnum:]+)\}/;
  return this.replace(re,"$1");
}

String.prototype.innerstring = function() {
  var re = /(\[)([:alnum:]+)\]|(\()([:alnum:]+)\)|(\{)([:alnum:]+)\}/;
  return this.replace(re,"$2");
} 

これらを1つの関数に組み合わせたり、関数にせずに別の方法で使用したりできると思いますが、理解できます。

于 2012-08-10T18:56:15.627 に答える