2017-06-28 4 views
-3

Je cherche une expression régulière qui correspondent à ces deux exemples:Regex qui correspond à deux phrases différentes par un mot

Hello I am really him.

Hello I am him.

En général, comment définissez-vous un regex qui correspond à la fois une chaîne, et un sous-ensemble de cette chaîne qui manque un mot?

Mise à jour:

C'était donc juste une phrase d'exemple pour voir si je pouvais reproduire le même motif sur ma chaîne réelle. Cela n'a cependant pas fonctionné, alors ils sont là. je dois correspondre à la phrase:

Ulcerative colitis patient, biopsy taken from the descending colon, macroscopic inflammation vissible

où le mot descending peut ou ne pas être là, et le mot no qui peut apparaître après la virgule. Il pourrait donc être:

Ulcerative colitis patient, biopsy taken from the descending colon, macroscopic inflammation vissible

Ulcerative colitis patient, biopsy taken from the descending colon, no macroscopic inflammation vissible

Ulcerative colitis patient, biopsy taken from the colon, macroscopic inflammation vissible

Ulcerative colitis patient, biopsy taken from the colon, no macroscopic inflammation vissible

+0

Quelque chose comme 'Bonjour je suis (?: vraiment)? Lui. » – sln

+0

Je ne comprends pas ce poste. Je pensais que vous utilisiez l'exemple original comme une sorte de modèle, pas le texte textuel, l'espacement et les majuscules d'une énorme phrase littérale. Rien n'est statique dans le texte !! Vous feriez mieux d'utiliser quelques mots littéraux intercalés avec '. *?' Pour obtenir des correspondances. – sln

+0

@sln Pour la plupart, il est statique. La seule chose qui change est la présence (ou non) des mots "descendant" et "non" –

Répondre

1
Hello I am (\w*\s?)him. 

Vous pouvez t is il here

Modifier après la mise à jour de la question avec la chaîne réelle et tous les cas de test:

Ulcerative colitis patient, biopsy taken from the(\s?\w*\s?)colon,(\s?\w*\s?)macroscopic inflammation vissible

Ceux-ci peuvent être vérifiés sur le lien regex101 suivant: regex101.com/r/4QRJDx/3

+0

Est-ce que cela fonctionnera à nouveau? Par exemple, pour correspondre 'Bonjour je suis lui.',' Bonjour je suis vraiment lui.', et 'Bonjour je suis vraiment lui encore.' Pourrait l'expression rationnelle' Bonjour je suis (\ w * \ s?) Lui (\ w * \ s?). 'Parce que cela ne semble pas fonctionner quand je le teste sur mes phrases. –

+0

Non, bien sûr, ma solution ne fonctionnerait pas si le mot manquant est à la fin de la phrase. Je n'ai pas eu aussi ce cas de test de votre question –

+0

@KyleWeise vous devriez inverser \ w et \ s dans le second cas. Essayez ceci: 'Bonjour je suis (\ w * \ s?) Lui (\ s? \ W *).' J'ai mis à jour le lien regex101: https://regex101.com/r/4QRJDx/2 et il correspond aussi à la cas de test supplémentaire –

0

ainsi le mot 'vraiment' et l'espace suivant en option:

/Hello I am (?:really)?him\./ 
      ^  ^   group 
      ^     non-matching 
        ^  make the whole group optional 
         ^ escape the '.' so it only matches a literal '.' 

Demo

2

Pour cet exemple, vous souhaitez utiliser "?" pour désigner un élément optionnel. Aussi, vous voudrez utiliser "()" pour rendre plus d'un caractère optionnel en même temps.

est ici l'expression régulière (syntaxe exacte peut varier légèrement en fonction de votre programme):

/Hello I am (really)?him/ 

syntaxe Exemple avec egrep:

Exemple de syntaxe avec sed:

echo "Hello I am him" | sed "s/Hello I am \(really \)\?him//" 
0

Les réponses existantes couvrent la lecture la plus évidente et la plus naturelle de la question.

Mais pour l'intérêt, une autre interprétation pourrait être: comment faire correspondre une séquence de deux phrases, dont la deuxième a au plus un mot manquant, par rapport à la première?

Dans ce cas, vous êtes à la recherche de quelque chose comme:

(\w+\b\s*)*?(?:\w+\b\s*)(\w+\b\s*)*[.?!]+\1\2[.?!] 

Trois séquences de mots (zéro ou plus, l'un et zéro ou plus); ponctuation de fin de phrase; alors seulement les séquences du premier et du dernier mot.

Cependant, l'efficacité pourrait probablement être améliorée.