2

データベースにデータを送信したい場所からこのフォームがあります。データはUTF8です。改行の一致に問題があります。私が使用しているパターンは次のようなものです:

~^[\p{L}\p{M}\p{N} ]+$~u

このパターンは、ユーザーがテキスト ボックスに新しい行を入力するまで問題なく機能します。クラス内で使用しようとし\p{Z}ましたが、成功しませんでした。「s」も試しましたが、うまくいきませんでした。

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

3

Unicodeの改行は、キャリッジリターンの直後に改行が続くか、垂直方向の空白プロパティを持つ任意の文字です。

しかし、そこにある一般的な空白を一致させようとしているようです。Javaでは、それは

 [\u000A\u000B\u000C\u000D\u0020\u0085\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000]

これは、範囲を使用してこれを「のみ」短縮することができます。

 [\u000A-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]

\h水平方向の空白( )と垂直方向の空白()の両方を含める\vこと。これは、一般的な空白()と同じ場合と同じでない場合があります\s

また、英数字を一致させようとしているようです。

  • アルファベットだけが通常[\pL\pM\p{Nl}]です。
  • 数値は\pN、それらがちょうど\p{Nd}または時々そうであるほど頻繁ではありません[\p{Nd}\p{Nl}]
  • 識別子の文字にはコネクタの句読点などが必要です。したがって[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]、正規表現エンジンがこれらの種類の操作をサポートしている場合(Javaの場合)。これ\wが、Unicode対応の正規表現言語(Javaは1つではありません)でうまくいくことです。

古いバージョンのPerlでは、次のように改行を書き込む可能性があります。

 (?:\r\n|\p{VertSpace})

今では次のように書く方が良いですが

 (?:(?>\r\n)|\v)

これはまさに何ですか

 \R

一致します。

Javaはこれらのことに非常に不器用です。そこで、改行を次のように記述する必要があります

  (?:(?>\u000D\u000A)|[\u000A-\u000D\u0085\u2028\u2029])

もちろん、文字列として記述する場合は、追加のbbaacckkssllasshheessが必要です。

14の一般的な文字クラスの正規表現のその他のJavaの同等物は、この回答で示したUnicodeで動作するようにエスケープします。Unicodeを十分に認識していない他のJavaのような正規表現言語でそれらを使用する必要があるかもしれません。

于 2010-12-08T15:28:03.700 に答える