0

Type Stringの任意の長さのリストがあります。リスト内の各文字列要素が、スペースや特殊文字などを含まない英数字または数値であることを確認する必要があります- \ / _

受け入れられる文字列の例は次のとおりです。

J0hn-132ss/sda
Hdka349040r38yd
Hd(ersd)3r4y743-2\d3
123456789

許容できない文字列の例は次のとおりです。

Hello
Joe
King

など基本的に言葉はありません。

私は現在使用してstringInstance.matches("regex")いますが、適切な式の書き方がよくわかりません

if (str.matches("^[a-zA-Z0-9_/-\\|]*$")) return true; 
else return false;

trueこのメソッドは、私が言及した形式に準拠していない単語に対して常に返されます。

私が英語で探している正規表現の説明は次のようになります。
任意の文字列。文字列には(a-zA-Z AND 0-9 AND特殊文字)
OR(0-9 AND特殊文字)
ORの文字が含まれます。 (0-9)

編集:私はうまくいく次の表現を思いついたが、それが不明瞭または複雑であるという点で悪いかもしれないと感じている。

表現:

(([\\pL\\pN\\pP]+[\\pN]+|[\\pN]+[\\pL\\pN\\pP]+)|([\\pN]+[\\pP]*)|([\\pN]+))+

私はこのウェブサイトを使用して私を助けました:http://xenon.stanford.edu/~xusch/regexp/analyzer.html
私はまだ正規表現に慣れていないことに注意してください

4

4 に答える 4

11

警告: 「絶対に」AZと書かないでください

A-ZRFC 定義のような、または0-9RFC 定義の外で発生する範囲のすべてのインスタンスは、事実上、Unicode では事実上常に間違っています特に、次のようなもの[A-Za-z]恐ろしいアンチパターンです。これらは、プログラマーが、ミレニアムのこちら側ではほぼ完全に不適切なテキストについて、穴居人の考え方を持っていることを示しています。Unicode パターンは ASCII で機能しますが、ASCII パターンは Uniocode で機能しません。セキュリティ違反が発生する場合があります。1970 年代のデータを使用しているか、最新の Unicode を使用しているかに関係なく、パターンの Unicode バージョンを常に記述してください。これは、実際の Java 文字データを実際に使用するときに失敗しないためです。これは、後ろに誰もいないことを「知っている」場合でも方向指示器を使用する方法に似ています。7 つの Unicode カテゴリの使用に慣れてください。

  1. \pL文字用。\pLよりも入力するのがはるかに短いことに注意してください[A-Za-z]
  2. \pN数字のために。
  3. \pM他のコード ポイントと結合するマークの場合。
  4. \pSシンボル、サイン、シジル用。:)
  5. \pP句読点用。
  6. \pZスペースなどの区切り記号 (ただし制御文字は除く)
  7. \pC割り当てられていないコード ポイントを含む、その他の非表示の書式設定および制御文字の場合。

解決

パターンだけが欲しい場合は、

 ^[\pL\pN]+$

Java 7ではこれを行うことができます:

 (?U)^\w+$

アンダースコアと任意の結合記号を含む文字を気にしないと仮定します。そうでなければ、非常に厄介なことを書かなければなりません:

 (?U)^[[:alpha:]\pN]+$

は Java 7の(?U)新機能です。Pattern クラスのUNICODE_CHARACTER_CLASSESコンパイル フラグに対応します。これは POSIX 文字クラスを切り替え、[:alpha:]単純なショートカットは\w実際に完全な Java 文字セットで動作するようにします。通常、これらは 1970 年代の ASCII セットでのみ機能するため、セキュリティ ホールになる可能性があります。

Java 7 に指示なしに常にそのパターンでこれを行うようにする方法はありませんが、これを行うフロントエンド関数を作成することはできます。代わりに自分に電話することを忘れないでください。

v1.7 より前の Java のパターンは、Unicode 正規表現の UTS#18 で規定されている方法に従って動作させることはできないことに注意してください。このため、新しい Unicode フラグを使用しないと、さまざまなバグ、不運、パラドックスにさらされることになります。たとえば、些細で一般的なパターン\b\w+\bは、 string 内のどこにも一致しないことがわかり"élève"、ましてや全体が一致することはありません。

したがって、1.7 より前の Java でパターンを使用している場合は、これまで以上に注意を払う必要があります。\w\s、およびを含む POSIX charclasses または charclass ショートカットを使用することはできません\b。これらはすべて、石器時代の ASCII データ以外で壊れます。Java のネイティブ文字セットでは使用できません。

Java 7 では可能ですが、正しいフラグを使用する必要があります。

于 2011-08-24T14:06:37.343 に答える
1

必要な正規表現の説明を「少なくとも 1 つの数字を含む」ように書き換えることができるため、次のようになります/.*[\pN].*/。または、検索を文字数と句読点に限定したい場合は、 を使用する必要があります/[\pL\pN\pP]*[\pN][\pL\pN\pP]*/。私はあなたの例でそれをテストしましたが、うまくいきます。

このような遅延量指定子を使用して、正規表現をさらに洗練することができます/.*?[\pN].*?/。このようにして、数字がない場合はより速く失敗します。

正規表現に関する優れた本をお勧めしたいと思います:正規表現のマスターには、優れた紹介、正規表現の仕組みの詳細な説明、および Java での正規表現に関する章があります。

于 2011-08-25T03:50:53.297 に答える
0

これは、0-9 と特殊文字または 0-9 を行う部分的な回答です。

^([\d]+|[\\/\-_]*)*$

これは ((1 以上の数字) OR (0 以上の特殊文字\ / -'_')) として 0 回以上読み取ることができます。数字が必要で、数字のみを受け取り、特殊文字のみで構成される文字列は拒否します。

正規表現テスターを使用して、いくつかの文字列をテストしました。

アルファベット文字を追加するのは簡単に思えますが、指定された正規表現の繰り返しが必要になる場合があります。

于 2011-08-24T18:44:44.327 に答える
0

文字列にスペースがないことを確認したいだけのようです。もしそうなら、これは非常に簡単にできます:

return str.indexOf(" ") == -1;

これは、スペースがない場合は true を返し (ルールを理解している場合は有効です)、文字列のどこかにスペースがある場合は false を返します (無効)。

于 2011-08-24T13:47:29.870 に答える