質問

私は、ユーザーからの入力に基づいて、正規表現を使用してテキストを検索するアプリケーションに取り組んでいます。ユーザーが持っている1つのオプションは、アスタリスクを使用して「一致0文字以上」のワイルドカードを含めることです。私はワード境界の間の唯一の試合にこれを必要とします。私の最初の試みは、ほとんどの場合、正常に動作します(?:(?=\B).)*にすべてのアスタリスクを変換することでした。どこでそれが失敗したが、明らか.NETは発音区別符号と別の文字の単語ブレークでUnicode文字間の位置を考慮することです。私はこのバグを検討し、、Microsoftのフィードバックサイトにそれを提出しています。

一方で、しかし、私は機能実装と製品出荷を取得する必要があります。私は率直に言って、土地を「私は本当にこれを行うには何が起こっているか理解できない」で午前、置換テキストとして[\p{L}\p{M}\p{N}\p{Pc}]*を使用して検討したが、しています。私は仕様を読むことができ、意味が、私は十分に私が期待して何をしていることを確認するために、これをテストすることができると確信していないです。私は単純にテストするために、すべての境界条件を知ることはできません。アプリケーションは、部族の場所にあり、多くの人の異文化の労働者によって使用されているので、任意およびすべての書き込みのシステムがゼロ幅単語の区切りを使用しているいくつかを含めて、サポートする必要があります。

誰もがよりエレガントな解決策を持っている、またはいくつかのポインタを確認/上記のコードを修正し、または提供することができますか?

ご協力いただきありがとうございます。

役に立ちましたか?

解決

Unicodeの文脈における/(?:(?=\B).)*/の同等物は、次のようになります。

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

...またはやや単純化します:

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

これは、単語または非ワード(スペーシング、句読点等)配列、おそらく空のどれかに一致します。

正常または否定ワード境界(\bまたは\B)は、基本的には、二重周りを見ています。一つは、現在の位置の前の文字の種類の確認しながら、背後に見て。同様に1を見据えています。

は、第二の正規表現では、私は、ルックアラウンドを削除し、代わりに、単純な文字クラスを使用します。

scroll top