9
votes

Expression régulière - Match Word seulement une fois en ligne

cas:

  1. Ehello Goodbye Hellot Hello Goodbye
  2. Ehello Goodbye Bonjour Hello Goodbye

    Je veux faire correspondre la ligne 1 (seulement "Bonjour" une fois!) Ne voulez pas correspondre à la ligne 2 (contient 'Hello' plus d'une fois)

    Essayé d'utiliser un regard négatif à l'avance regarder derrière et ce qui n'est pas ... sans aucun succès réel ..


0 commentaires

3 Réponses :


8
votes

Une option simple est ceci (à l'aide du drapeau multiligne et non pas-tous): xxx

premier, vérifiez que ne n'ai pas "bonjour" deux fois , puis vérifiez que vous l'avez au moins une fois.
Il y a d'autres moyens de vérifier pour la même chose, mais je pense que celui-ci est assez simple.

Bien sûr, vous pouvez faire une correspondance simple pour \ bhello \ b et compter le numéro des matchs ...


4 commentaires

Pourquoi ne pas simplement le trouver une fois et vérifier qu'il n'existe plus après cela? Semble un peu moins répétitif de cette façon.


@Wiseguy - une patten comme ^. * Bonjour (?!. * Bonjour) ne fonctionnerait pas, car il correspondra toujours au dernier Hello de la ligne. Vous auriez besoin de quelque chose comme ^ (? :( ?! Bonjour).) * Bonjour (?!. * Bonjour) , qui n'est pas beaucoup plus élégant. J'ai peut-être manqué quelque chose de simple si ...


@Wiseguy - non. Le moteur Regex tente de correspondre à ne pas échouer. Cela peut correspondre, alors ça le fera.


Travaux simples, compréhensibles.



1
votes

Puisque vous ne vous inquiétez que des mots (jetons c.-à-d. Jetons séparés par WhitSpace), vous pouvez simplement vous séparer des espaces et voir combien de fois "bonjour" apparaît. Puisque vous n'avez pas mentionné une langue, voici une implémentation en Perl: xxx

la sortie est xxx


0 commentaires

2
votes

Une regex générique serait la suivante:

\b(\w+)\b(?=.*?\b\1\b)


1 commentaires

Doh, j'ai mal interprété la question, pensée Bonjour pourrait être n'importe quel mot, et le but de la regex était de s'assurer qu'aucun mot ne se répète. Laissera la réponse en cas de tout intérêt pour quiconque.