javascript - regex - синдром повторяющихся тегов - PullRequest
0 голосов
/ 28 июня 2019

что-то странное для меня, когда я пытаюсь выяснить разницу между этими двумя случаями

дело 1:

матч с 2 группами

var reg = /@([a-zA-Z]+)\((.*)\)/;
var text = ' @ifblank(1, @ifblank(2, 3) ) ';

text.match(reg);

результат (как и ожидалось)

match 1: "ifblank"
match 2: "1, @ifblank(2, 3) "

дело 2:

совпадение с 3 группами

var reg = /@([a-zA-Z]+)\((.*), (.*)\)/;
var text = ' @ifblank(1, @ifblank(2, 3) ) ';

text.match(reg);

результат (не такой, как ожидалось)

match 1: "ifblank"
match 2: "1, @ifblank(2"
match 3: "3) "

что я ожидал, это:

match 1: "ifblank"
match 2: "1"
match 3: "@ifblank(2, 3)"

Я предполагаю, что это из-за того, что я использую одни и те же теги в одном формате, но как я могу создать ожидаемый результат?

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Если у вас есть только цифры в первом индексе, т. Е. Где вы хотите, чтобы ваше

совпадение 2: "1"

, тогда вы можете изменить свое регулярное выражение на

var reg = / @ ([a-zA-Z] +) ((\ d), (. *)) /;

1 голос
/ 28 июня 2019

Для второй группы вместо .* для сопоставления что-нибудь , используйте [^,]+ для сопоставления с чем угодно, кроме запятой:

@([a-zA-Z]+)\(([^,]*), (.*)\)
               ^^^^

https://regex101.com/r/uyfoqq/2

Если вы хотите, вы также можете обрезать пробел в конце третьей группы, требуя, чтобы последний соответствующий ему символ был \S (непробельный символ):

@([a-zA-Z]+)\(([^,]*), (.*\S) *\)
                          ^^ ^^

https://regex101.com/r/uyfoqq/3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...