Question

Je travaille sur une application qui recherche du texte en utilisant des expressions régulières basées sur l'entrée d'un utilisateur. Une option que l'utilisateur a est d'inclure un « match 0 ou plusieurs caractères » joker en utilisant l'astérisque. Je dois établir une correspondance avec seulement entre les limites de mots. Ma première tentative a été de convertir tous les astérisques à (?:(?=\B).)*, qui fonctionne très bien pour la plupart des cas. Lorsqu'il échoue est que, apparemment, .Net considère la position entre un caractère unicode avec un diacritique et un autre caractère un mot-break. Je considère cela comme un bug, et ont soumis à la site commentaires Microsoft .

En attendant, cependant, je dois obtenir la fonctionnalité mise en œuvre et le produit livré. J'envisage d'utiliser [\p{L}\p{M}\p{N}\p{Pc}]* comme le texte de remplacement, mais, franchement, je suis dans « Je ne comprends pas vraiment ce que cela va faire » terre. Je veux dire, je peux lire les spécifications, mais ne suis pas convaincu que je pouvais suffisamment tester pour vous assurer qu'il est en train de faire ce que je pense. Je ne sais tout simplement pas toutes les conditions aux limites de test. L'application est utilisée par les travailleurs transculturels, dont beaucoup sont dans des endroits tribaux, de sorte que tout et tous les systèmes d'écriture doivent être pris en charge, y compris certains qui utilisent les pauses mot zéro largeur.

Quelqu'un at-il une solution plus élégante, ou pourrait confirmer / corriger le code ci-dessus, ou offrir quelques conseils?

Merci pour votre aide.

Était-ce utile?

La solution

L'équivalent de /(?:(?=\B).)*/ dans un contexte unicode serait:

/
(?:
  (?: (?<=[\p{L}\p{M}\p{N}\p{Pc}]) (?=[\p{L}\p{M}\p{N}\p{Pc}])
  |   (?<![\p{L}\p{M}\p{N}\p{Pc}]) (?![\p{L}\p{M}\p{N}\p{Pc}])
  )
  .
)*
/

... ou un peu simplifiée:

/(?:[\p{L}\p{M}\p{N}\p{Pc}]+|[^\p{L}\p{M}\p{N}\p{Pc}]+)?/

correspondrait à un mot ou une séquence non-mot (espacement, signes de ponctuation, etc.), éventuellement un vide.

Un mot-frontière normale ou niée (\b ou \B) est essentiellement un double regard autour. Un regarder derrière, en vous assurant du type de caractère qui précède la position actuelle. De même, on recherche à venir.

Dans la seconde regex, j'ai enlevé le look contournements et utilisé des classes simples de caractère au lieu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top