我有以下的reqular表达式,它接受以下输入
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
}
此致 姆兰
答案 0 :(得分: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
也不应与您的指定模式匹配,除非¿
位于主模式之后的一行(因为您在模式结尾处有$
)。
答案 1 :(得分:0)
你的正则表达式失败是因为你最后的$。 $表示正则表达式必须通过,直到到达字符串的末尾。 在字符串结束之前删除$或允许其他一些字符。
- &GT; “... |(y)|(是)|(n)|(不))¿?$”会传递¿char(?表示正则表达式中的可选项)
- &GT; “... |(y)|(是)|(n)|(no))”会在最后传递所有字符