#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:
((["0"-"9"]) ("-")*)*
(["0"-"9"])*
["a"-"z"]
( ["a"-"z","0"-"9"] )*
( ("-") (["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- а
Возможности, выходящие за рамки самого простого захвата, практически безграничны…