Застрял в понимании этого регулярного выражения

#regex

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

Вопрос:

Я застрял с этим регулярным выражением

 ((["0"-"9"])  ("-")*)*
    (["0"-"9"])* ["a"-"z"] ( ["a"-"z","0"-"9"] )*
    ( ("-")  (["a"-"z","0"-"9"]) )*
  

Что я понимаю до сих пор, так это:

  ((["0"-"9"])  ("-")*)*
  

может быть числом от 0 до 9. Плюс означает, что его можно повторить (например, 1157). Не уверен в том, что делает звезда: S Я думаю, что примером этой первой строки может быть 1157- ?

 (["0"-"9"])* ["a"-"z"] ( ["a"-"z","0"-"9"] )*
  

начинается с числа, за которым следуют буквы и цифры, например 1test5

  ( ("-")  (["a"-"z","0"-"9"]) )*
  

необязательно начинается с минуса и сопровождается буквами и цифрами. например -54

Если бы кто-нибудь мог привести мне пример строки, которая соответствует регулярному выражению, это было бы полезно. Трудно понять это. 🙂

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

1. Какой язык вы используете? Обычно не требуется заключать символы в кавычки.

2. Возможно, вам будет полезно проанализировать его с помощью бесплатного инструмента RegExr — вы найдете его здесь: gskinner.com/RegExr

3. Основываясь на ваших предыдущих вопросах, возможно, вам следует внимательно изучить: javacc.java.net/doc/javaccgrm.html .

Ответ №1:

  1. ((["0"-"9"]) ("-")*)*
  2. (["0"-"9"])*
  3. ["a"-"z"]
  4. ( ["a"-"z","0"-"9"] )*
  5. ( ("-") (["a"-"z","0"-"9"]) )*

где:

 * is 0 or more
  is one or more
  

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

Для сегмента 1:
1 или более цифр, за которыми следует от 0 до многих дефисов ‘-‘, которые могут повторяться 0 или более раз.

сегмент 2:
0 или много цифр

сегмент 3:
только 1 символ нижнего регистра ( "abcdefghijklmnopqrstuvwxyz" )

сегмент 4:
0 или много символов нижнего регистра или цифр.

сегмент 5:
дефис 1 или более раз, за которым следует один или несколько символов нижнего регистра или цифр, повторяющихся 0 или более раз.

Объединив это, мы можем получить минимальную строку, необходимую для соответствия этому регулярному выражению: 0a-a

где сегменты 2 и 4 можно игнорировать, потому что они включают 0 или более.

Еще несколько примеров будут:

 9-0a0a-a0
4456---4456---890aasd-asda-a434
  

до бесконечной длины.

Ответ №2:

означает хотя бы одно из предыдущих выражений

* означает 0 или более из предыдущего выражения

Итак ((["0"-"9"]) ("-")*)* (я буду игнорировать кавычки) означает:

По крайней мере, 1 цифра, пробел 0 или более - , и все это может повторяться 0 или более раз.

это означает, что оно будет соответствовать:

  • Пустая строка
  • 1 ——234 —
  • 1 2 3

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

Вы можете увидеть свое регулярное выражение здесь в Regexr (очищенное от кавычек) с некоторыми соответствующими примерами

Ответ №3:

Эти кавычки странные, но я бы предположил, что

  • (0-9 один или несколько раз, за которыми следует «-«) ноль или более раз.
  • затем 0-9 ноль или более раз.
  • затем a-z, за которым следует a-z или 0-9 любое количество раз
  • затем («-» хотя бы один раз, за которым следует a-z или 0-9 хотя бы один раз) ноль или более раз.

Таким образом, вы можете найти такие совпадения, как

0-a-a

9123-9123-312346-1412312-123223abcd992-a90898-z08333218457

123-1a92 ——abcdef———123456- а

Возможности, выходящие за рамки самого простого захвата, практически безграничны…