2

次の入力を受け入れると思われる次の正規表現があります

yes
no
b 03211111111 10

パターン:

Pattern.compile(
    "^((B\\s(92|0)?(3[0-9]{2,9})\\s([1-9][0-9]|1[0-9]{2}|200))|(y)|(yes)|(n)|(no))$",
    Pattern.CASE_INSENSITIVE
);

しかし、今日、次のような1つの入力を受け入れることがわかりました

b 03211111111 10?

上記の行では、疑問符が反対方向にあり、ここに入力する方法がわかりません。

ユニコード文字のように見えます。正規表現を制限して、次のような入力を取得したいだけです

b 03211111111 10

以下はコードです

balShareReq =   Pattern.compile("^((B\\s(92|0)?(3[0-9]{2,9})\\s([1-9][0-9]|1[0-9]{2}|200))|(y)|(yes)|(n)|(no))$",Pattern.CASE_INSENSITIVE);
Matcher matcher   =   balShareReq.matcher(vo.getMessage());             
            if( matcher.find() ) {
//my business logic 
}

よろしく、イムラン

4

2 に答える 2

1

プログラムに他のエラーがあります:

Pattern p = Pattern.compile(
"^((B\\s(92|0)?(3[0-9]{2,9})\\s([1-9][0-9]|1[0-9]{2}|200))|(y)|(yes)|(n)|(no))$",
Pattern.CASE_INSENSITIVE
);

p.matcher("b 03211111111 10?").matches();  // false
p.matcher("b 03211111111 10¿").matches();  // false
p.matcher("b 03211111111 10⸮").matches();  // false

アップデート

find()おそらく使用するはずの場所を使用していますmatches()。java docから、matches

領域全体をパターンと照合しようとします。

一方find

パターンに一致する入力シーケンスの次のサブシーケンスを見つけようとします。

ただし、メインパターンの後の行にあるfind場合を除いて、指定されたパターンと一致しないようにする必要があります(パターンの最後にあるため)。¿$

于 2012-05-11T12:35:00.113 に答える
0

末尾に $ があるため、正規表現は失敗します。$ は、文字列の末尾に到達するまで正規表現を通過する必要があることを意味します。$ を削除するか、文字列の末尾の前に他の文字を許可します。

-> "...|(y)|(yes)|(n)|(no))¿?$" は ¿ 文字を渡します (? は正規表現でオプションを意味します)

-> "...|(y)|(yes)|(n)|(no))" は最後にすべての文字を渡します

于 2012-05-11T12:38:47.923 に答える