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. P> blockQuote>
J'ai une phrase et j'aime ça. P> BlockQuote>
Dans le premier cas, je veux
"J'ai une phrase" code>. Dans le second cas, je veux"J'ai une phrase et j'aime ça." Code> p>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. P>
Le code qui fonctionne pour le premier cas: p>
xxx pré> L'expression que je souhaite travaillé: p>
xxx pré> Toute suggestion? P> P>
3 Réponses :
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? ne serait-ce pas les deux cas? P> P>
Cela fonctionne également totalement ... je l'ai changé en (. *) (? = Avec) |. * Code> Pour exclure le mot avec. Définitivement upéted!
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.
Bien sûr, n'utilisez pas de groupe de capture et n'utilisez pas de lunettes pour la partie alternative, c'est-à-dire ^. *? (? = Avec | $) code> 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 | $) code>, 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 | $) code> dans mon code et récupéré un groupe capturé: J'ai une phrase avec Code> Pourquoi le mot «avec» inclus dans cette capture?
@James: Je suppose que vous avez utilisé captures [0] code> quand je veux dire groupes [1] code>. Voir
Oui, j'ai fait! Et je savais mieux, je ne savais pas que ce n'est toujours pas clair pour moi pourquoi groupes [0] code> renvoie J'ai une phrase avec code>, et pourquoi groupes [ 1] code> renvoie J'ai une phrase code> quand j'utilise ^ (. *?) (?: avec | $) code>
@James: parce que groupes [0] code> 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 ?: Code> ne crée aucun nouveau groupe, mais il est toujours un match régulier, il sera donc inclus dans le groupe 0.
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));
Cela semble pouvoir fonctionner ... lui donner un uppote d'une manière différente de le faire. Merci!
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.