Регулярные выражения - невозможно сопоставить эту строку - PullRequest
0 голосов
/ 11 мая 2011

Я пишу скрипт ruby, требующий сопоставления с образцом.Я получил большинство, однако я не могу сопоставить длинную строку 01122223_200000_1717181, поэтому при использовании / (\d+\_+\d+)*/.

Это соответствует следующему шаблону, хотя / \**|TYPE:|\=*/.Я не могу понять, почему.Я также проверил порядок сопоставления с образцом.

У кого-нибудь есть предложения?

Ответы [ 4 ]

3 голосов
/ 11 мая 2011

С вашим шаблоном происходит несколько вещей, но я думаю, что только одно приводит к сбою сопоставления:

  • Ваши скобки немного смещены.
  • У вас есть+ после подчеркивания, но я не думаю, что вы хотите / нуждаетесь в этом.
  • У вас есть лишние пробелы в начале шаблона.

Из них, вероятно,единственная проблема, мешающая вам получить совпадение - последняя.Остальная часть шаблона все равно должна совпадать, хотя, вероятно, не совсем так, как вы этого хотите (то есть она будет соответствовать некоторым вещам, которые вы бы не хотели, чтобы она соответствовала).Я бы пошел с этим:

/\d+(_\d+)+/

Если вы хотите принять шаблон без подчеркивания (например, 999999), используйте это:

/\d+(_\d+)*/

О вашем втором вопросе: Причина, по которой он соответствует / \**|TYPE:|\=*/, заключается в том, что \** и \=* используют * в качестве квантификатора, а не +.Это означает, что они будут совпадать, даже если ввод не содержит символов * или =.\=* соответствует пустой строке, поэтому это выражение будет соответствовать любому вводу. Измените его на / \*+|TYPE:|\=+/, и оно больше не должно совпадать.

2 голосов
/ 11 мая 2011

Для сопоставления этой первой строки (01122223_200000_1717181) это может помочь: /(\d+_)+\d+/

0 голосов
/ 11 мая 2011

Моя более или менее первая идея была:

/\d+(_\d+)*/
0 голосов
/ 11 мая 2011

Это должно быть легко. Просто используйте диапазоны.

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