2016-04-13 31 views
0

Javaパターンの問題が発生しています。これが私のパターンです:正規表現の最初の文字が一致しない

"^[\\p{L}\\p{Digit}~._-]+$" 

それは基本的にUS-ASCIIの任意の文字、数字、一部の特殊文字、URLをスクランブルないと何も一致します。

私は、このパターンと一致しない単語の最初の文字を見つけることをお勧めします。基本的に、ユーザーはテキストを入力として送信し、それを検証し、違法な文字を見つけたら例外をスローする必要があります。

このパターンを無効にしようとしましたが、正しくコンパイルできませんでした。またfind()はあまり助けになりませんでした。

法的入力はhelloとなりますが、?helloはそうではないはずです。私の例外は?が適切でないことを指摘しておきます。

util.regexを使用してJavaのMatcher、Patternなどを使用することをお勧めします。その必要はありませんが、文字列内の各文字を個別にチェックすることは解決策ではありません。

編集:私は予約されていないURI文字を一致させるために、より良い正規表現を思い付いた

+0

'!"?hello ".subString(0,1).matches("^[\\ p {L} \\ p {デジット} .'-.'_] + $ ")'? – Ferrybig

+1

あなたは何をしようとしているのでいくつかのコードを共有することはできますか? GET/POSTパラメータをサニタイズしようとしていますか?またはURL全体ですか? – Garfield

+2

1文字クラスで2 '' 'と' .'を使う理由は?また、 '' -.'は範囲を作成し( ''(+ *、 - ) 'にマッチします)、目的に合っていますか?ところで、{if(str.matches( "[^ \\ p {L} \\ p {Digit}。 '_-]。*")){/ * Error! * /} ' –

答えて

1

これを試してみてください:

^[\\p{L}\\p{Digit}.'-.'_]*([^\\p{L}\\p{Digit}.'-.'_]).*$ 

最初の文字以外のマッチングは私が作ったグループN°1

あるいくつかは、ここでは試してみてください。http://fiddle.re/gkkzm61

説明:

あなたのパターンを否定するので、私はこれを作りました:

彼は内部不整合文字

([^\\p{L}\\p{Digit}.'-.'_]) 

非マッチング文字(否定)を満たすまで

^[\\p{L}\\p{Digit}.'-.'_]* 

チェックし、最初の文字から正規表現:

[^\\p{L}\\p{Digit}.'-.'_]  [^...] means every character except for 
^      ^   the following ones. 
| your pattern inside | 

パターンは3つの部分を有していますキャプチャグループ

.*$ 

任意文字列の最後まで

はそれがあなたのお役に立てば幸いです

EDIT:

正しい正規表現があることshoud:

^[\\p{L}\\p{Digit}~._-]*([^\\p{L}\\p{Digit}~._-]).*$ 

それは、私は第一及び第二の部分の内容を同じ方法で変更されました。

私は試して動作するようです。

+0

ありがとうございました。 –

+0

私はそれを受け入れられた答えと呼ぶでしょうが、最初の正規表現は正しく機能していなかったので、私は –

+0

という質問をあなたの提案に基づいて編集しました。編集後、 \\ p {L} \\ p {数字}〜。_-])。* $ " –

0

ない最初の有効な文字を見つけるために、この1つを試してみてください:

Pattern negPattern = Pattern.compile(".*?([^\\p{L}^\\p{Digit}^.^'-.'^_]+).*"); 
Matcher matcher = negPattern.matcher("hel?lo"); 
if (matcher.matches()) 
{ 
    System.out.println("'" + matcher.group(1).charAt(0) + "'"); 
} 
+0

ありがとう助けてくれてありがとう、このJava Matcherが本当に直感的でない方法 –

0

"^[\\p{L}\\p{Digit}.'-.'_]+$"パターンを含む任意の文字列にマッチする1+文字クラス内で定義された文字。 '.の2つが疑わしい場合は、'-.が範囲を作成して'()*+,-.と一致するという事実に気付かない場合があります。目的に合っていない場合は、.'_-を使用すると思います。

は、文字列は文字クラスで定義されたもの以外の文字で始まる場合、あなたは、文字クラスを否定することができますチェックして、唯一の文字列の最初の文字を確認するには:

if (str.matches("[^\\p{L}\\p{Digit}.'_-].*")) { 
    /* String starts with the disallowed character */ 
} 

は私も考えて正規表現を"(?U)[^\\w.'-].*"に短縮することができます。いずれにせよ、\\p{Digit}\\dに置き換えることができます。

関連する問題