unicode字符的正则表达式问题

时间:2012-05-11 12:10:02

标签: java regex

我有以下的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 
}

此致 姆兰

2 个答案:

答案 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))”会在最后传递所有字符