0

設定した特定のマークアップを確認する必要があるフォームの入力フィールドがあります。

区切り文字は{!}です。

区切り文字内にあるすべてのものと一致させたいと思います。

content = /regex/g.exec('{!content}')

さらに、入力文字列に複数のマークアップを含めることができます。

input = '{!content} {!other}';
['content','other'] = /regex/g.exec('{!content} {!other}')

これは問題の最初の部分ですが、今では楽しい部分になります。

また、特定のマークアップ区切り文字が正しく終了していない場合もあり、それらもチェックする必要があります。

この場合、私は取得したいと思います:

input = '{!content {!other} {!broken';
['{!content', 'other', '{!broken'] = /regex/g.exec(input);

Update *は、@MikeMの元のソリューションが私が望むものをキャプチャしていないケースを発見しました。開始区切り文字がそれ自体である場合、結果配列に表示する必要があります。開始区切り文字が文字列の最後にある場合、キャプチャされません。

input = '{!content {!other} {!';
['{!content', 'other', '{!'] = /regex/g.exec(input);
4

2 に答える 2

2

コンテンツで許可されていない{場合は、次を使用できます}

var m,    
    result = [],
    str = '{!content {!other} {!broken',
    reg = /\{!([^{}]+)\}|(\{![^{}]+)/g;

while ( m = reg.exec( str ) ) {
    result.push( m[1] || m[2] );
}

console.log( result );   // [ "{!content ", "other", "{!broken" ]

ただし、閉じられていないコンテンツに続くスペースを取得します。

アップデート:

先頭または末尾の空白を含めずにコンテンツをキャプチャするには、以下を使用できます。わかりやすくするために、より長い形式で記述されています。

var m,    
    result = [],
    str = '{!content {!other} {!broken  {!    broken {! content }',
    reg = /\{!\s*([^{}]+?)\s*\}|\{!\s*([^{}]+?)\s*(?=\{|$)/g;

m = reg.exec( str );

while ( m != null ) {   

    if ( m[1] != null ) {
        result.push( m[1] );
    } else {  // m[2] cannot be null
        result.push( '{!' + m[2] );
    }
    m = reg.exec( str );
}

console.log( result );   
// [ "{!content", "other", "{!broken", "content", "{!broken", "content" ]

詳細については、 MDNexecexecを参照してください。

于 2013-02-01T23:55:21.603 に答える
0

一致の配列を返します。

(str.match(/\{\!.*?.(?=[\{\}])|\{\!.+?$/g)||[]).map(function(m){return m.substring(2);});
  • (_.match(...)||[])イディオムです。null一致するものが見つからない場合は一致が返されますが、通常は代わりに空の配列を取得する方が便利です。||[]それを修正します。

  • 正規表現は{!、貪欲でない方法でとターミネータ間の一致を検索します。つまり、の}後に最初に見つけることができるものを探してい{!ます。また、不一致の開いたブレースと行の終わりにぶつかることに寛容であり{、可能な限りこれらを通過させる必要があります。

    ここに画像の説明を入力してください

  • 上記の一致は常にで始まり{!ますが、終了区切り文字はありません。あとはそれをはがすだけなのでmap、配列をにできsubstring(2)ます。前後の空白を削除したい場合は、これを作成できますsubstring(2).trim()

于 2013-02-01T23:11:44.050 に答える