在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
}
为什么上面两个例子的结果不一样?
答案 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引擎那样解释字符。