在java.util.Scanner中应该使用什么模式来获取下一个字符串标识符?

在java.util.Scanner中应该使用什么模式来获取下一个字符串标识符?,java,pattern-matching,java.util.scanner,Java,Pattern Matching,Java.util.scanner,在一行文本中,我有“*(,identifier1*(identifier2”,我想读取定义为单词字符的标识符([a-zA-Z_0-9]) 我应该使用哪种模式?我想使用: scanner.next( "[\\w]+"); 但是我得到了异常java.util.InputMismatchException扫描仪的默认分隔符是空格,因此扫描仪对象中的第一个(也是唯一一个)标记是整个字符串“*(,identifier1*(identifier2“。通过调用next([\\w]+”)尝试获取的字符串,这会

在一行文本中,我有“
*(,identifier1*(identifier2
”,我想读取定义为单词字符的标识符(
[a-zA-Z_0-9]

我应该使用哪种模式?我想使用:

scanner.next( "[\\w]+");

但是我得到了异常
java.util.InputMismatchException

扫描仪的默认分隔符是空格,因此扫描仪对象中的第一个(也是唯一一个)标记是整个字符串
“*(,identifier1*(identifier2“
。通过调用
next([\\w]+”)尝试获取的字符串
,这会导致引发异常,因为它与您的输入不匹配

您所追求的更像是
findInLine(\\w+”)

产生:

identifier1
identifier2
或者,如果要在一个或多个非(ascii)alpha-num字符(和
\uu
)上拆分输入字符串,请尝试:

它产生与以前相同的输出

请注意,我使用了大写字母
W
,它等于:

\W == [^\w] == [^a-zA-Z0-9_]

除非出于某种原因,您必须使用扫描仪,否则您可以从任何地方获取字符串,然后直接提取单词。当然,这会一次将所有单词加载到内存中,而使用扫描仪,它们一次只能读取一个单词:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        List<String> words = extractWords("*(,identifier1*(identifier2");
        for (String word : words)
            System.out.println(word);
    }

    public static List<String> extractWords(String input) {
        List<String> out = new ArrayList<String>();

        Pattern re = Pattern.compile("\\w+");
        Matcher matcher = re.matcher(input);
        while (matcher.find())
            out.add(matcher.group());

        return out;
    }
}

文本源中用作分隔符的字符是什么?InputMismatchException表示扫描程序无法将标记与字符串匹配。分隔符不是字母、数字或下划线。分隔符可以有几个字符宽。@James,这是一个有效的正则表达式模式。你是对的。忘记了Java Requireres双反斜杠。您的解决方案
findInLine
有效。它似乎是
Scanner.next(regex)
在无法读取(!?)时引发异常@John,是的,如果流中的下一个令牌与您提供的模式不匹配,它将引发异常。如果您将
Scanner.next([\\w]+”)
更改为
Scanner.next(“.+”);
它将正确匹配您的第一个标记(等于整个输入字符串).+1用于使用
\W
作为分隔符。@John:你对Bart的代码有什么异常吗?我用它来解析一些C样式的标识符,不过有一个警告,C允许$in标识符,所以我不能使用它,因为我正在读一个大文件。但是你的解决方案也很有趣。+1。
\W == [^\w] == [^a-zA-Z0-9_]
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        List<String> words = extractWords("*(,identifier1*(identifier2");
        for (String word : words)
            System.out.println(word);
    }

    public static List<String> extractWords(String input) {
        List<String> out = new ArrayList<String>();

        Pattern re = Pattern.compile("\\w+");
        Matcher matcher = re.matcher(input);
        while (matcher.find())
            out.add(matcher.group());

        return out;
    }
}
identifier1
identifier2