Регулярные выражения — Не удается сопоставить эту строку

#ruby #regex

#ruby #регулярное выражение

Вопрос:

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

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

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

Комментарии:

1. У вас есть какой-нибудь код, который вы можете нам показать?

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

3. Не оценивайте все это с помощью * : это приводит к тому, что оно ничему не соответствует, и даже в лучшем случае вы фиксируете только последнее из совпадений.

Ответ №1:

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

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

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

 /d (_d ) /
  

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

 /d (_d )*/
  

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

Ответ №2:

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

Ответ №3:

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

 /d (_d )*/
  

Ответ №4:

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

 /[d_]*d/
  

Комментарии:

1. Это будет соответствовать ______9 , 9 и 999 , ни один из которых не соответствует формату.

2. @Justin В OP не сказано, что они не соответствуют формату. В OP приведен только один пример, и как вы можете быть уверены в этом?

3. Дело не столько в 9 или 9999 . Я не был уверен, были ли они также включены, поэтому у меня нет проблем с ними. Однако из примера довольно ясно, что _________9 включать это не следует. Если вы улучшите свой ответ, я удалю отрицательный отзыв.

4. Какое правило вы имеете в виду? Даже если вы дадите мне правило, это то, что вы мне даете, а не операции.

5. Это было целью моего первого комментария: я признаю, что вопрос неясен, но он кажется достаточно ясным, чтобы сказать, что _________9 это не должно быть разрешено. Вы намеревались разрешить это?