Как я могу использовать два подстановочных знака в этом регулярном выражении?

#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. Я совершенно уверен, что он пытается подобрать строку, которая соответствует шаблону, где его шаблон не является правильным регулярным выражением, но он использует звездочку в качестве подстановочного знака.