web-dev-qa-db-fra.com

Expression régulière qui correspond à un mot, ou rien

J'ai vraiment du mal à mettre une étiquette à ce sujet, c'est probablement pourquoi je n'ai pas pu trouver ce dont j'ai besoin lors d'une recherche.

Je cherche à faire correspondre les éléments suivants:

  • Réponse automatique
  • Réponse automatique
  • Réponse automatique

La plate-forme que j'utilise ne permet pas la spécification de recherches insensibles à la casse. J'ai essayé l'expression régulière suivante:

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

Pensant que (?:matic) ferait correspondre mon expression à Auto ou Automatic. Cependant, il ne correspond qu'à Automatic.

  • Qu'est-ce que je fais mal?
  • Quelle est la terminologie appropriée ici?

Ceci utilise Perl pour le moteur d'expression régulière (je pense que c'est PCRE mais je ne suis pas sûr).

14
crush

(?:...) consiste à regexer des motifs comme (...) est à l'arithmétique: il remplace simplement la priorité.

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

UNE ? quantifier est ce qui rend la correspondance facultative.

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

Tu veux

(?:matic)?

Sans le début et la fin inutiles .*, nous obtenons ce qui suit:

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

Comme le souligne @ adamdc78, cela correspond à AutoReply. Cela peut être évité en utilisant les éléments suivants:

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

ou

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

Cela devrait fonctionner:

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

vous manquiez simplement le ? après (?:matic)

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

Cela suppose que vous ne voulez pas que AutoReply soit un hit valide.

Vous manquez juste le facultatif ("?") dans l'expression régulière. Si vous cherchez à faire correspondre la ligne entière après la réponse, ajoutez le .* à la fin, c'est bien, mais votre question n'a pas précisé ce que vous cherchiez.

4
adamdc78

Vous pouvez utiliser cette expression régulière avec des ancres de début/fin de ligne:

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

Explication:

^ 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
2
anubhava

Légèrement différent. Même résultat.

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

Testé contre:

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

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