我的以下程序打印出我不理解的奇怪结果,我想这是由于我对Java Regex缺乏了解。所以我希望先将testStr
按时间段分割,然后检查每个句子是否包含字母或数字。但令人惊讶的是,我得到了以下输出,这与我的愿望相反:
blah blah1 is not a character!
blah blah2 is not a character!
blah blah3 is not a character!
??** is not a character! // only this output is expected
我的代码如下:
String testStr = "blah blah1. blah blah2. blah blah3. ??**...";
String[] myStrArray = testStr.split("[.]");
System.out.println("length of myStrArray is: " + myStrArray.length);
for (String str : myStrArray) {
if (!Pattern.matches("\\w+", str)) {
System.out.println(str + " is not a character!");
continue;
}
System.out.println("got a meaningful sentence " + str.trim());
}
答案 0 :(得分:3)
你的程序使用dot作为分隔符来分割字符串,所以你得到:
blah blah1
blah blah2
blah blah3
??**...
然后,您尝试使用正则表达式\w+
匹配每一行。请注意,match()
的来电相当于find()
的来电,但包含^
和$
的正则表达式,即认为您的正则表达式为^\w+$
。
我认为现在很明显,你的任何一个字符串都不匹配这个模式,因为3个第一个字符串包含空格,而最后一个不包含字母字符或数字。
答案 1 :(得分:2)
将您的正则表达式更改为:^[a-zA-Z0-9\s]+$
它将仅根据需要允许使用字符,数字和空格。注意“魔法”的一部分是使用强制完全匹配的^
和$
(从开始到结束)。
此外,我使用a-zA-Z0-9
代替\w
的原因是\w
包含不符合要求的_
。
答案 2 :(得分:0)
您可以使用字符集。将正在使用的正则表达式("\\w+"
)更改为:
"[\\s&&[^\\W_]]"
这样可以匹配字母数字[^\W_]
=> a-zA-Z0-9
)和空格(\s
),而不仅仅是单词字符。