Регулярное выражение с необязательными группами не работает - \ d не работает в скобках (\ d *%) - PullRequest
0 голосов
/ 23 марта 2020

Мне нужно написать регулярное выражение для следующих правил, в которых кнопка (a, b, start) является единственным обязательным полем, все остальные группы являются необязательными, но имеют проблемы. Требуется также некоторая логика c, с которой у меня тоже возникают проблемы

  • Это регулярное выражение для виртуального игрового контроллера с кнопками. Некоторые из кнопок - это «a», «b» и «start».
  • К каждой кнопке может быть добавлена ​​длительность, но это не обязательно. «a500ms» будет нажимать кнопку A в течение 500 миллисекунд. «a1s» будет нажимать кнопку A в течение 1 секунды.
  • Кнопки можно нажимать последовательно без пробелов. «ab» нажимает A, затем B. «astart» нажимает A, затем Start.
  • Синтаксис синтаксического анализатора выглядит следующим образом: (модификатор) (кнопка) (процент) (символ процента) (продолжительность) (тип длительности) ( добавлено)
  • (кнопка) - единственная обязательная группа. Все остальное необязательно.
  • Если (символ процента) не имеет (процент) или (тип длительности) не имеет (длительность), он недействителен
  • Полный пример, использующий полный синтаксис: "_start20% 12ms +"
  • Это удерживает "начало" на 20 процентов в течение 12 миллисекунд и добавляет более поздний ввод

Примеры:

  • " a600msb200ms "- действительный
  • " ams500b "- недопустимый, поскольку (тип длительности) (" мс ") не имел (длительность) (" 500 ") перед ним
  • " astart "- нажимает A затем Start (в настоящее время это не работает в моем регулярном выражении, но должно)
  • "b1sstart" - нажимает B на 1 секунду, затем start
  • "b + a" - одновременно нажимает B и A
  • "_ b a" - удерживает B, затем нажимает A

Мое регулярное выражение:

^(a|b|start)(\d*%)?(\d*(s|ms))?

Вот тестовый стенд https://regex101.com/r/jGf0VR/3

Проблемы

Регулярное выражение не работает для меня со следующими проблемами

  1. (\d*%)? - эта группа не работает, предположим, захватить 500%, 200%, но это не работает (да, пробовал с backsla sh все еще не работает). Факт, что он должен быть необязательным, но никогда не принимается как необязательный

  2. a200ms300s - должен быть зафиксирован, но не захвачен, аналогично a200s300ms также должен быть захвачен

  3. a200ms200% - должно быть недействительным, я не могу исправить это в первую очередь из-за того, что (\d*%)? не работает для меня, как выделено в prob1

1 Ответ

0 голосов
/ 23 марта 2020

Используйте следующее для сопоставления строки, содержащей нажатие одной кнопки:

^(a|b|start)(\d+%)?(\d+(s|ms))?$

Я изменил \d* на \d+, чтобы указать, что по крайней мере один di git требуется перед % или s|ms. Я добавил $ в конце, чтобы оно не совпадало, если после матча есть что-то лишнее.

Чтобы сопоставить их последовательность, поместите группу вокруг всего, кроме якорей, и позвольте этому повторяться.

^((a|b|start)(\d+%)?(\d+(s|ms))?)+$

DEMO

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