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
);

但今天我发现它接受一个输入,如下所示

b 03211111111 10?

在上面的行中,问号方向相反,我不知道如何在这里输入。

它看起来像一些 unicode 字符,我只想限制我的正则表达式以获取输入

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文档,matches

尝试将整个区域与模式匹配。

虽然find

尝试查找与模式匹配的输入序列的下一个子序列。

但甚至find不应该与您给定的模式匹配,除非在¿主模式之后的一行上(因为您$在模式的末尾有)。

于 2012-05-11T12:35:00.113 回答
0

你的正则表达式失败,因为你的 $ 最后。$ 表示正则表达式必须通过,直到到达字符串的末尾。删除 $ 或在字符串结尾之前允许一些其他字符。

-> "...|(y)|(yes)|(n)|(no))¿?$" 将传递 ¿ 字符(?在正则表达式中表示可选)

-> "...|(y)|(yes)|(n)|(no))" 将在最后传递所有字符

于 2012-05-11T12:38:47.923 回答