7
votes

Expressions régulières: correspond à un mot optionnel

besoin de faire correspondre la première partie d'une phrase, jusqu'à un mot donné. Cependant, ce mot est facultatif, auquel cas je veux correspondre à la phrase entière. Par exemple:

J'ai une phrase avec une clause que je ne veux pas.

J'ai une phrase et j'aime ça.

Dans le premier cas, je veux "J'ai une phrase" . Dans le second cas, je veux "J'ai une phrase et j'aime ça."

Les regards surounds me donneront le premier cas, mais dès que j'essaie de le faire facultatif , pour couvrir le second cas, je reçois toute la première phrase. J'ai essayé de faire l'expression paresseuse ... pas de dés.

Le code qui fonctionne pour le premier cas: xxx

L'expression que je souhaite travaillé: xxx

Toute suggestion?


1 commentaires

Si ce ne sont en effet que des mots (un «motif« trivial »), envisagez d'utiliser simplement une recherche d'index de sous-chaîne au lieu de regex.


3 Réponses :


1
votes

Si je comprends votre besoin correctement, vous souhaitez correspondre à la phrase jusqu'au mot «avec» ou, si ce n'est pas là, correspond à l'ensemble de la chose? Pourquoi ne pas écrire le regexp pour rechercher explicitement les deux cas? XXX

ne serait-ce pas les deux cas?


1 commentaires

Cela fonctionne également totalement ... je l'ai changé en (. *) (? = Avec) |. * Pour exclure le mot avec. Définitivement upéted!



11
votes

Il y a plusieurs façons de faire cela. Vous pouvez faire quelque chose comme ceci:

I have a sentence with a clause I don't want.
I have a sentence and I like it.


7 commentaires

Bien sûr, n'utilisez pas de groupe de capture et n'utilisez pas de lunettes pour la partie alternative, c'est-à-dire ^. *? (? = Avec | $) rubular.com/r/1jvjxdk30t ; Ce sont des variations mineures de la même idée de base.


Beau. Utilisé cela avec le groupe de non-capture, mais (? :) a toujours capturé le groupe pour une raison quelconque ... (? = Avec | $) , a fait exactement ce dont j'avais besoin de faire. Merci!


@James: Il y a une différence entre la non-capture et l'affirmation. L'affirmation ne consomme pas dans le cadre du match. La non-capture ne signifie pas non-correspondance. Il est toujours assorti, mais cela n'est pas capturé dans un groupe.


Hmm, pas sûr de comprendre ... je mets (. *?) (?: avec | $) dans mon code et récupéré un groupe capturé: J'ai une phrase avec Pourquoi le mot «avec» inclus dans cette capture?


@James: Je suppose que vous avez utilisé captures [0] quand je veux dire groupes [1] . Voir Stackoverflow.com/questions/3320823/...


Oui, j'ai fait! Et je savais mieux, je ne savais pas que ce n'est toujours pas clair pour moi pourquoi groupes [0] renvoie J'ai une phrase avec , et pourquoi groupes [ 1] renvoie J'ai une phrase quand j'utilise ^ (. *?) (?: avec | $)


@James: parce que groupes [0] est le groupe "Par défaut" qui renvoie la chaîne correspondante. Il n'y a pas de crochets explicites nécessaires pour capturer pour le groupe 0. Tout ce que vous avez assorti est ce qu'il contiendra. En utilisant ?: ne crée aucun nouveau groupe, mais il est toujours un match régulier, il sera donc inclus dans le groupe 0.



1
votes
string optional = "with a clause I don't want" 

// displays "I have a sentence"
string foo = "I have a sentence with a clause I don't want.";
int idxFoo = foo.IndexOf(optional);
Console.WriteLine(idxFoo < 0 ? foo : foo.Remove(idxFoo));

// displays "I have a sentence and I like it."
string bar = "I have a sentence and I like it.";
int idxBar = bar.IndexOf(optional);
Console.WriteLine(idxBar < 0 ? bar : bar.Remove(idxBar));

1 commentaires

Cela semble pouvoir fonctionner ... lui donner un uppote d'une manière différente de le faire. Merci!