web-dev-qa-db-ja.com

正規表現:\ w-UTF-8の「_」+「-」

UTF-8の文字と数字に一致する正規表現、ダッシュ記号(-)が必要ですが、アンダースコア(_)には一致しません。これらのばかげた試みを試みましたが、成功しませんでした。

  • ([\w-^_])+
  • ([\w^_]-?)+
  • (\w[^_]-?)+

\w[A-Za-z0-9_]の省略形ですが、u修飾子が設定されている場合は、UTF-8文字にも一致します。

誰かがこれで私を助けることができますか?

13
Alix Axel

これを試して:

(?:[\w\-](?<!_))+

\ w(またはダッシュ)としてエンコードされたものすべてに対して単純な一致を行い、その後、一致したばかりの文字がアンダースコアではないことを保証するゼロ幅のルックビハインドがあります。

そうでなければ、これを選ぶことができます:

(?:[^_\W]|-)+

これはよりセットベースのアプローチです(大文字のWに注意してください)

OK、私はphpのPCREフレーバーのUnicodeをとても楽しんだ:D Peekabooは、利用可能な簡単な解決策があると言っている:

[\p{L}\p{N}\-]+

\ p {L}は、文字として適格なすべてのUnicodeに一致します(注:Word文字ではないため、アンダースコアはありません)。一方、\ p {N}は、数字のように見えるもの(ローマ数字や、よりエキゾチックなものを含む)に一致します。
\-はエスケープされたダッシュです。厳密に必要というわけではありませんが、文字クラスではダッシュをエスケープするようにしています...ユニコードには数十の異なるダッシュがあるため、次のバージョンが発生することに注意してください。

[\p{L}\p{N}\p{Pd}]+

「Pd」は句読点ダッシュです。これには、マイナスダッシュが含まれますが、これに限定されません。 (ここでもアンダースコアはありません)。

18
gha.st

どの言語を使用しているかはわかりませんが、Perlでは、正しいロケールが設定されていれば、[[:alnum:]-] +と簡単に書くことができます。

3
Jiri Klouda