14

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

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

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

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

4

2 に答える 2

20

これを試して:

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

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

それ以外の場合は、次のいずれかを選択できます。

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

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

OK、私は php の PCRE のフレーバーでユニコードをとても楽しんでいました:D Peekaboo は、利用可能な簡単な解決策があると言います:

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

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

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

ここで、「Pd」は句読点ダッシュであり、マイナス ダッシュのものを含みますが、これに限定されません。(ここでもアンダースコアがないことに注意してください)。

于 2010-01-14T04:50:14.750 に答える
3

どの言語を使用しているかわかりませんが、PERL では、正しいロケールが設定されている場合は [[:alnum:]-]+ と書くだけです。

于 2010-01-14T05:33:30.743 に答える