为什么[\\ s *]不等于\\ s *?

时间:2013-03-10 02:30:26

标签: java regex

我刚刚使用Java进入正则表达式,我正在阅读一本书和Java文档 - 我无法理解为什么 - 考虑到以下程序 - "[\\s*]"不等同于{{1当用作分隔符时。似乎"\\s*"相当于"[\\s*]",有人可以逻辑地告诉我为什么会这样吗?

"\\s+"

对我来说有意义的输出是每个非空白字符作为单独的标记。当分隔符更改为import java.util.Scanner; import java.util.regex.Pattern; public class ScanString { public static void main(String[] args) { String str = "Smith , where Jones had had 'had', had had 'had had'."; String regex = "had"; System.out.println("String is:\n" + str + "\nToken sought is " + regex); Pattern had = Pattern.compile(regex); Scanner strScan = new Scanner(str); strScan.useDelimiter("\\s*"); int hadCount = 0; while(strScan.hasNext()) { if(strScan.hasNext(had)) { ++hadCount; System.out.println("Token found!: " + strScan.next(had)); } else { System.out.println("Token is : " + strScan.next()); } } System.out.println("Count is: " + hadCount); } }"\\s+"时,输出为:

"[\\s*]"

2 个答案:

答案 0 :(得分:4)

括号[]包含一个字符类。在他们内部,关于特殊字符的规则是不同的。唯一的特殊字符是“结束括号(]),反斜杠(\),插入符号(^)和连字符(-)。” (取自this page

因此,在这种情况下,[\\s*]表示“空格或*”。

当您处理正则表达式时,您可以使用RegexPlanet等网站(以测试您的代码)或Regexper(以图形方式显示正则表达式)。

答案 1 :(得分:1)

[]characters class。请看一下这些示例:[abc]表示a|b|c。如果您创建类似[a*]的内容,则表示a|\\*a*字符。)