0

私は正規表現があまり得意ではないので、助けが必要です。

次のような文字列があります。

[{type='(type here)', field='(field here)', value='(value here)'},{...},...,{...}]

私はそれを次の正規表現と一致させようとしています:

^\[(\{type=\'(.*)\', field=\'(.*)\', value=\'(.*)\'\},*)*\]$

しかし、それは一致していません。次に、デバッグしました。デバッグに使用した正規表現は次のとおりです。

\[(\{(.*)\}\]

文字列は次のとおりです。

[{type='cost', field='flag & e band 100s ($1/M's)', value='680'},{type='cost', field='29 versions', value='250'}]

一致は次のとおりです。

{type ='cost'、field ='flag&e band 100s($ 1 / M's)'、value = '680'}、{type ='cost'、field = '29 version'、value = '250'}

この文字列が一致した理由を理解しています。他の文字列が一致しなかった理由がわかりません。他の一致する文字列は次のようになると予想しました。

  1. {type ='cost'、field ='flag&e band 100s($ 1 / M's)'、value = '680'}、

  2. {type ='cost'、field = '29 version'、value = '250'}

なぜこれらの試合が行われなかったのですか?

4

4 に答える 4

0

これは役に立ちますか:

^ matches at the start of the string
\[ matches "["
(
    \{type=\' matches "{type='"
    (
        .* matches "cost', field='flag & e band 100s ($1/M's)', value='680'},{type='cost"
    ) captures "cost', field='flag & e band 100s ($1/M's)', value='680'},{type='cost"
    \', field=\' matches ', field='
    (
        .* matches "29 versions"
    ) captures "29 versions"
    \', value=\' matches "', value='"
    (
        .* matches "250"
    ) captures "250"
    \'\} matches "'}"
    ,* matches ""
)* captures "{type='cost', field='flag & e band 100s ($1/M's)', value='680'},{type='cost', field='29 versions', value='250'}" (first and only repeat)
\] matches "]"
$ matches at the end of the string

したがって、グループ 1 は "[" と "]" の間のすべてをキャプチャします。

于 2011-07-29T16:35:50.947 に答える
0

おそらく、怠惰な量指定子ではなく、貪欲な量指定子を使用している可能性があります。?各 の後にa を挿入し、*それで問題が解決するかどうかを確認します。

于 2011-07-29T16:36:05.827 に答える
0

これはそれを行う必要があります:

    var str = "[{type='cost', field='flag & e band 100s ($1/M's)', value='680'},{type='cost', field='29 versions', value='250'}] ";
    var regexp = /\{[^\}]+\}/g;
    var m;
    while (m = regexp.exec(str)) {
        alert(m[0]);
    }

式は複雑すぎる必要はありません。つまり、次の/\{[^\}]+\}/gことを意味します。

全体的に (終了スラッシュの後の g)、{ で始まり、} 以外の文字が 1 つ以上あり、} で終わるすべてのものを教えてください。

于 2011-07-29T16:56:22.313 に答える
0

問題は.*サブグループ内での使用です。type=\'(.*)\'貪欲に一致します。つまり、 が得られますcost', field='flag & e band 100s ($1/M's)', value='680'}, {type='cost

また、データの区切り文字はコンテンツにも存在します。たとえば、パターンは解析しようとしますfield=\'(.*)\'が、ヒットしますfield='flag & e band 100s ($1/M's)',( 'M.

だから私は提案します(フィールドの内容も収集したい場合):

  1. サブグループを保護するために、「フィールド」の可能なコンテンツを監視します(データが外部ソースからのものである場合は、エスケープするか、より適切な区切り文字を見つけます)。
  2. Steve Wang が彼の回答で言及しているような貪欲さを避けて、意図したとおりにのみサブグループを収集してください。

それ以外の場合は、中かっこのグループ化でのみトリガーされます。つまり、\{[^\}]+\}

于 2011-07-29T16:40:02.587 に答える