Помощь с регулярным выражением - PullRequest
0 голосов
/ 29 июля 2011

Я не очень хорошо разбираюсь в регулярных выражениях и мне нужна помощь.

У меня есть строка, подобная следующей:

[{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)', значение = '680'}, {тип = 'стоимость', поле = '29 версий', значение = '250'}

Я понимаюпочему эта строка была подобрана.Я не понимаю, почему никакие другие строки не были найдены .Я ожидал, что другие подходящие строки будут:

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

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

Почему эти совпадения не были сделаны

Ответы [ 4 ]

0 голосов
/ 29 июля 2011

Это должно сделать это:

    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 после закрывающей косой черты), дайте мне все, что начинается с {, имеет один или несколько не} символов и заканчивается}.

0 голосов
/ 29 июля 2011

Вероятно, вы используете жадный квантификатор, а не ленивый.Вставьте ? после каждого из ваших * и посмотрите, исправит ли это что-нибудь.

0 голосов
/ 29 июля 2011

Проблема заключается в использовании .* внутри подгрупп. 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. Избегайте жадности, о которой Стив Ван упоминает в своем ответе, собирать подгруппы только по назначению.

в противном случае активировать только в фигурной скобке, т. Е. \{[^\}]+\}

0 голосов
/ 29 июля 2011

Помогает ли это:

^ 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 фиксирует все между "[" и "]".

...