Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不是';t[\\s*]相当于\\s*?_Java_Regex - Fatal编程技术网

Java 为什么不是';t[\\s*]相当于\\s*?

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) {

我刚刚开始学习Java中的正则表达式,我正在阅读一本书和Java文档-我不明白为什么-考虑到下面的程序-
“[\\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