Регулярное выражение, которое соответствует слову, или ничего

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

Я ищу следующее:

  • Автоответ
  • Автоматический ответ
  • AutomaticReply

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

.*[aA]uto(?:matic)[ ]*[rR]eply.*

Думая, что (?:matic) приведет к тому, что мое выражение будет соответствовать Auto или Automatic. Однако это соответствует только Automatic.

  • Что я делаю неправильно?
  • Какая здесь правильная терминология?

Это использует Perl для механизма регулярных выражений (я думаю, что PCRE но я не уверен).

Ответ 1

(?:...) предназначен для регулярного выражения шаблонов, как (...) для арифметики: он просто переопределяет приоритет.

 ab|cd        # Matches ab or cd
 a(?:b|c)d    # Matches abd or acd

Квантор ? - это то, что делает сопоставление необязательным.

 a?           # Matches a or an empty string
 abc?d        # Matches abcd or abd
 a(?:bc)?d    # Matches abcd or ad

Вы хотите

(?:matic)?

Без ненужного продвижения вперед и в конце .* мы получаем следующее:

/[aA]uto(?:matic)?[ ]*[rR]eply/

Как указывает @adamdc78, это соответствует AutoReply. Этого можно избежать, используя следующее:

/[aA]uto(?:matic[ ]*|[ ]+)[rR]eply/

или

/[aA]uto(?:matic|[ ])[ ]*[rR]eply/

Ответ 2

Это должно работать:

/.*[aA]uto(?:matic)? *[rR]eply/

вам просто не хватало ? после (?:matic)

Ответ 3

[Aa]uto(?:matic ?| )[Rr]eply

Это предполагает, что вы не хотите, чтобы AutoReply был действительным ударом.

Вам просто не хватает необязательный ( "?" ) в регулярном выражении. Если вы хотите совместить всю строку после ответа, то в конце концов .* в конце все в порядке, но в вашем вопросе не указано, что вы искали.

Ответ 4

Вы можете использовать это регулярное выражение с якорями начала/конца строки:

^[aA]uto(?:matic)? *[rR]eply$

Объяснение:

^ assert position at start of the string
[aA] match a single character present in the list below
aA a single character in the list aA literally (case sensitive)
uto matches the characters uto literally (case sensitive)
(?:matic)? Non-capturing group
Quantifier: Between zero and one time, as many times as possible, giving back as needed 
[greedy]
matic matches the characters matic literally (case sensitive)
 * matches the character   literally
Quantifier: Between zero and unlimited times, as many times as possible, giving back 
as needed [greedy]
[rR] match a single character present in the list below
rR a single character in the list rR literally (case sensitive)
eply matches the characters eply literally (case sensitive)
$ assert position at end of the string

Ответ 5

Немного отличается. Тот же результат.

m/([aA]uto(matic)? ?[rR]eply)/

Протестировано:

Some other stuff....
    Auto Reply
    Automatic Reply
    AutomaticReply

Now some similar stuff that shouldn't match (auto).