Frage

Ich arbeite an einer Anwendung, die Suche Text auf Eingabe von einem Benutzer basierend regulären Ausdrücken. Eine Option hat der Benutzer ist enthalten ein „Match 0 oder mehr Zeichen“ wildcard das Sternchen verwenden. Ich brauche dies nur zwischen Wortgrenzen zu entsprechen. Mein erster Versuch war es, alle Sterne zu (?:(?=\B).)* konvertieren, die gut für die meisten Fälle funktioniert. Wo es nicht ist, dass anscheinend .Net hält die Position zwischen einem Unicode-Zeichen mit einem diakritischen und einem anderen Zeichen eines Wortbruch. Ich halte dies für einen Fehler, und habe es in der Microsoft Feedback Website eingereicht .

In der Zwischenzeit aber ich brauche die Funktionalität zu erhalten implementiert und Produkt ausgeliefert. Ich erwäge [\p{L}\p{M}\p{N}\p{Pc}]* als Ersetzungstext verwenden, aber, ehrlich gesagt, bin in „Ich weiß nicht wirklich verstehen, was diese tun werden“ Land. Ich meine, kann ich die technischen Daten lesen, aber ich bin nicht sicher, dass ich dies ausreichend, um sicherzustellen, testen könnte es das tut, was ich erwarte. Ich würde einfach nicht kennen alle Randbedingungen zu testen. Die Anwendung wird durch interkulturelle Arbeiter eingesetzt, von denen viele in Stammes-Standorten, so müssen alle und alle Schriftsysteme unterstützt werden, darunter einige, die Null-Breite Wortumbrüche verwenden.

Hat jemand eine elegantere Lösung, oder könnte bestätigen / korrigieren Sie den Code oben, oder bieten einige Hinweise?

Danke für Ihre Hilfe.

War es hilfreich?

Lösung

Das Äquivalent von /(?:(?=\B).)*/ in einem Unicode-Kontext wäre:

/
(?:
  (?: (?<=[\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}])
  )
  .
)*
/

... oder etwas vereinfacht:

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

Dies würde entsprechen entweder ein Wort oder ein Nicht-Wort (Abstand, Zeichensetzung, etc.) -Sequenz, möglicherweise eine leeren.

Eine normale oder negierten Wortgrenze (\b oder \B) ist im Grunde ein Doppel Umsehen. Ein Blick zurück, um sicherzustellen, von der Art des Zeichens, dass geht die aktuelle Position. Ebenso ein Blick auf die Zukunft.

In dem zweiten regex, entfernte ich den Look-arounds und gebrauchte einfache Zeichenklassen statt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top