Java 为什么不是';t[\\s*]相当于\\s*?
我刚刚开始学习Java中的正则表达式,我正在阅读一本书和Java文档-我不明白为什么-考虑到下面的程序-Java 为什么不是';t[\\s*]相当于\\s*?,java,regex,Java,Regex,我刚刚开始学习Java中的正则表达式,我正在阅读一本书和Java文档-我不明白为什么-考虑到下面的程序-“[\\s*]”在用作分隔符时并不等同于“\\s*”。似乎“[\\s*]”相当于“\\s+”,有人能从逻辑上告诉我为什么会这样吗 import java.util.Scanner; import java.util.regex.Pattern; public class ScanString { public static void main(String[] args) {
“[\\s*]”
在用作分隔符时并不等同于“\\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*]”
时,输出为:
字符串是:
史密斯,琼斯曾经“有过”,曾经“有过”。
寻找的代币是有的
代币是:史密斯
令牌是:,
令牌是:哪里
代币是:琼斯
找到令牌!:有
找到令牌!:有
标记是:“had”,
找到令牌!:有
找到令牌!:有
标记是:“had”
标记是:had”。
计数为:4
方括号[]
括起一个字符类。在它们里面,关于特殊字符的规则是不同的。唯一的特殊字符是“结束括号(]
)、反斜杠(\
)、插入符号(^
)和连字符(-
)。(取自)
因此在本例中,[\\s*]
表示“一个空格或*
”
在处理正则表达式时,可以使用(测试代码)或(以图形方式可视化regexp)等网站。看看这些例子:
[abc]
意味着a | b | c
。如果你创造了像[a*]
这样的东西,那就意味着a |\\*
(a
或*
字符)。有趣-我的书的作者误导了我!他在括号内使用*作为特殊字符,但这个例子起了作用anyway@svenoaks-是的。使用[*]
有点不合常规。但是它在功能上等同于\*
,它需要以Java字符串文本形式编写为\\*
。你可以说括号内的版本更具可读性。
String is:
Smith , where Jones had had 'had', had had 'had had'.
Token sought is had
Token is : Smith
Token is : ,
Token is : where
Token is : Jones
Token found!: had
Token found!: had
Token is : 'had',
Token found!: had
Token found!: had
Token is : 'had
Token is : had'.
Count is: 4