java和javascript中的正则表达式\ b

时间:2015-05-24 15:29:57

标签: java javascript regex

在java和js中使用正则表达式\ b有什么区别吗?
我试过以下测试:
在javascript:

console.log(/\w+\b/.test("test中文"));//true  

在java中:

String regEx = "\\w+\\b";
text = "test中文";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(text);
while(matcher.find()) {
    System.out.println("matched");//never executed
}

为什么上面两个例子的结果不一样?

2 个答案:

答案 0 :(得分:3)

这是因为默认情况下Java supports Unicode for \b but not for \w,而JavaScript并不支持两者的Unicode。

所以\w只能匹配[a-zA-Z0-9_]个字符(在我们的情况下为test),但\b无法接受地点(标有|

test|中文

在字母和非字母Unicode标准之间,因为t都被Unicode视为字母字符。

如果您希望\b忽略Unicode,可以使用look-around mechanism并将其重写为(?:(?<=\\w)(?!\\w)|(?<!\\w)(?=\\w)),或者在此示例中使用简单(?!\\w)而不是\\b {1}}也可以。

如果您希望\w也支持Unicode,请使用Pattern.UNICODE_CHARACTER_CLASS标志编译您的模式(也可以将其写为标记表达式(?U)

答案 1 :(得分:1)

Jeva正则表达式寻找一系列单词字符,即在单词边界之前[a-zA-Z_0-9]+。但是中文不适合\w。如果单独使用\\b,您将找到两个匹配项:字符串的开头和结尾。

正如georg所指出的那样,Javascript并不像Java的Regex引擎那样解释字符。