#regex
#регулярное выражение
Вопрос:
пытаюсь получить следующее регулярное выражение: <- плохой английский от меня: (
Я пытаюсь преобразовать следующий входной текст в регулярное выражение…
xx.*.aaa.bbb*
где * находятся подстановочные знаки .. как в .. для меня они представляют подстановочные знаки.. не синтаксис регулярного выражения.
Какие-либо предложения, пожалуйста?
Обновление — пример входных данных.
- xx.zzzzzzzzz.aaa.bbb = совпадение
- xx.eee.aaa.bbbzzzz = совпадение
- xx.eee.aaa.bbb.zzzz = совпадение
- xx.aaa.bbb = не соответствует
Комментарии:
1. Можете ли вы привести мне несколько примеров строк, которым вам нужно сопоставить?
2. Вы должны указать, может ли при написании
*
быть включен.
символ или нет, или вообще, какие символы разрешены…
Ответ №1:
Вы неправильно поняли концепцию *
в регулярных выражениях.
Я думаю, что вы ищете:
xx..*.aaa.bbb.*
Дело в том:
- a
.
не является реальным.
. Это означает любой символ, поэтому, если вы хотите сопоставить.
, вы должны его экранировать:.
*
означает, что символ, который предшествует ему, будет совпадать 0 или много раз, так как же эмулировать подстановочный знак, который вы ищете? Используя.*
. Он будет соответствовать любому символу 0 или много раз.
Если вы хотите сопоставить точно всю строку, а не любую подстроку, которая соответствует шаблону, вы должны включить ^
в начале и $
в конце, так что ваше регулярное выражение будет:
^xx..*.aaa.bbb.*$
Комментарии:
1. Как ты думаешь,
xx.*.aaa.bbb*
это та строка, которую он хочет сопоставить? Я интерпретировал это как его регулярное выражение (но я не уверен)2. Это не самое подходящее регулярное выражение для решения проблемы. Добавление .* в середине строки сделает ее крайне неэффективной. Конкретика всегда предпочтительнее. В конце концов, мы не знаем контекста. Ему может понадобиться это для работы с огромными текстовыми строками.
3. @stema дело в том, что он использовал
xx.*.aaa.bbb*
как выражение, подобное тем, которые используются проводником Windows, когда вы хотите найти файл. Я думаю, он имел в виду:xx.
тогдаwhatever
, затем.aaa.bbb
и потом что угодно, и он хочет преобразовать это в регулярное выражение 🙂4. @DavidFells Но вы предполагаете, что, когда он пишет,
*
он не включает там.
, и он этого не сказал.5. @Oscar ЭТО правда. Хотя я не думаю, что это так. Но он должен был бы сказать нам!
Ответ №2:
Попробуйте это выражение:
^xx.[^.] .aaa.bbb.*
Комментарии:
1. @David Fells: xxx.eee.aaa.bbb = совпадение (когда этого не должно быть). Обратите внимание на три крестика в начале…
2. @David Fells — wicked 🙂 не могли бы вы объяснить части регулярного выражения, которые что делают? Ответ потрясающий, но мне также нужно учиться, вместо того, чтобы просто получать ответ, а затем снова спрашивать в будущем 🙂
3. @Pure ^ означает начало строки. . соответствует периоду — его нужно экранировать, потому что сама точка означает «вообще любой символ». Скобки со знаком плюс после означают по крайней мере один символ, определенный внутри этих скобок. ^ . означает что угодно, кроме точки. .* в конце означает вообще что угодно — оно будет соответствовать чему угодно после bbb.
4. @DavidFells Здесь также вы заставляете его иметь что-то среднее
xx.
и.aaa
5. @Оскар, это то, о чем он просил
Ответ №3:
Предполагая, что вы говорите, что * является подстановочным знаком в «обычном смысле», и что ваша строка не является попыткой регулярного выражения, я бы сказал, что xx.. .aaa.bbb.
это то, что вам нужно.
Ответ №4:
То, что вы называете «подстановочный знак — не синтаксис регулярных выражений», взято из globbing. Это метод сопоставления с шаблоном, который был популяризирован в первой версии Unix в конце 60-х годов. Первоначально это была отдельная программа, называемая glob, которая выдавала результат, который можно было передавать другим программам. Теперь bash, MS-Dos и почти любая оболочка имеют встроенную эту функцию. В globbing *
обычно означает совпадение с любым символом любое количество раз.
Синтаксис регулярных выражений отличается. .*
Идиома в regex похожа на *
в globbing, но не совсем такая же. Обычно .*
не соответствует разрывам строк. Обычно вам приходится устанавливать однострочный режим (в Ruby называется многострочным), если вы хотите .*
сопоставлять любой символ любое количество раз в регулярном выражении.
Ответ №5:
*
это не подстановочные знаки, они означают, что предшествующий символ повторяется 0 или 1 или много раз.
И точка может быть любым символом.
Обновить:
Вы можете попробовать это
^xx.[a-z] .aaa.bbb.?[a-z]*
и вы можете протестировать это, например, здесь, онлайн, на rubular
[a-z]
Это группы символов, внутри которых вы можете определить, какой символ разрешен (или не разрешен с помощью [^a-z]
). итак, если вы ищете только строчные буквы, вы можете использовать [a-z]
.
Означает, что оно должно быть там хотя бы один раз.
.?
Ближе к концу означает, что там может быть точка или нет
^
В начале означает совпадение в начале строки
Хороший учебник (для Perl, но, по крайней мере, основы почти везде одинаковы) — это PerlReTut
Комментарии:
1. Я совершенно уверен, что он пытается подобрать строку, которая соответствует шаблону, где его шаблон не является правильным регулярным выражением, но он использует звездочку в качестве подстановочного знака.