1

私は正規表現の専門家ではありませんが、制御できない入力を解析する必要があります。また、Azや0〜9のない文字列をすべてフィルターで除外する必要があります。

これを実行すると、

Pattern p = Pattern.compile("^[a-zA-Z0-9]*$"); //fixed typo
if(!p.matcher(gottenData).matches())
       System.out.println(someData); //someData contains gottenData

特定のスペース+不明な記号がどういうわけかフィルターをすり抜けます(gottenDataは赤い長方形です): スクリーンショット

ご参考までに、テキストも表示されますが、すべてがそうであるわけではありません。

今のところ、[?]には文字列も含まれている限り、問題ありません。

助けてください。

[編集](非常に大きい)入力からわかる限り、[?]は空白であるか、まったく何もないかのどちらかです。ある種のエンコーディングの問題があるかもしれませんし、#textノードと関係があるかもしれません(入力はxmlです)

4

7 に答える 7

7

*数量詞は「ゼロ以上」に一致します。これは、クラス内のどの文字も含まない文字列に一致することを意味します。+数量詞を試してください。これは、「1つ以上」を意味^[a-zA-Z0-9]+$します。英数字のみで構成される文字列に一致します。 ^.*[a-zA-Z0-9]+.*$先頭の。*を使用すると速度が大幅に低下しますが、1つ以上の英数字を含む任意の文字列に一致します。Matcher.lookingAt()の代わりにを使用する場合Matcher.matchesは、完全な文字列の一致は必要なく、正規表現を使用できます[a-zA-Z0-9]+

于 2011-01-13T14:58:30.730 に答える
4

正規表現にエラーがあります: 代わり[a-zA-z0-9]*[a-zA-Z0-9]*.

正規表現の周りは 必要^ありません。常に完全な文字列に一致します。$Matcher.matches()

String gottenData = "a ";
Pattern p = Pattern.compile("[a-zA-z0-9]*");
if (!p.matcher(gottenData).matches())
    System.out.println("doesn't match.");

これは印刷します"doesn't match."

于 2011-01-13T14:46:59.087 に答える
2

正解は上記の答えの組み合わせです。まず、意図したキャラクターの一致は[a-zA-Z0-9]だと思います。Azは、AからzまでのASCII範囲のすべての文字を含むと思うほど悪くはないことに注意してください。これは、文字にいくつかの余分な文字を加えたものです(具体的には、[、\、]、^、_、 `)。

Martinが述べたように、2番目の潜在的な問題は、文字列を文字と数字のみで構成する場合は、開始修飾子と終了修飾子を入力する必要がある場合があることです。

最後に、0以上を意味する*演算子を使用します。したがって、0文字を一致させることができ、一致はtrueを返すため、パターンは事実上すべての入力と一致します。必要なのは+数量詞です。だから私はあなたが探している可能性が最も高いパターンを提出します:

^ [a-zA-Z0-9] + $

于 2011-01-13T15:01:07.057 に答える
2

"^[a-zA-Z0-9]*$"文字列全体と一致するように正規表現を変更する必要があります

于 2011-01-13T14:46:24.817 に答える
1

「a-zA-z0-9」ではなく「a-zA-Z0-9」のようです。修正してみてください...

于 2011-01-13T14:47:07.307 に答える
1

regex にスペースを追加することを検討した人はいますか[a-zA-Z0-9 ]*? これは、文字、数字、およびスペースを含む通常のテキストと一致する必要があります。引用符やその他の特殊文字が必要な場合は、それらも正規表現に追加してください。

http://www.regexplanet.com/simple/で正規表現をすばやくテストできます。

于 2011-01-13T15:14:02.480 に答える