令牌化错误:java.util.regex.PatternSyntaxException,悬挂的元字符“ *”

我正在使用*按照以下格式令牌化一个用*分隔的字符串:

name*lastName*ID*school*age
%
name*lastName*ID*school*age
%
name*lastName*ID*school*age

我正在使用以下代码从名为“ entrada.al”的文件中读取此信息:

static void leer() {

    try {
        String ruta="entrada.al";
        File myFile = new File (ruta);
        FileReader fileReader = new FileReader(myFile);

        BufferedReader reader = new BufferedReader(fileReader);

        String line = null;

        while ((line=reader.readLine())!=null){
            if (!(line.equals("%"))){
                String [] separado = line.split("*"); //SPLIT CALL
                names.add(separado[0]);
                lastNames.add(separado[1]);
                ids.add(separado[2]);
                ages.add(separado[3]);
            }
        }

        reader.close();
    }

我得到这个异常:

线程“主”中的异常java.util.regex.PatternSyntaxException:索引0附近悬挂元字符'*'   *

我的猜测是,老化后的原始文本文件缺少*导致了此问题。 我该如何解决?

andandandand asked 2020-01-14T12:54:20Z
4个解决方案
142 votes

不,问题在于PatternSyntaxException是正则表达式中的保留字符,因此您需要对其进行转义。

String [] separado = line.split("\\*");

PatternSyntaxException的意思是“先前表达式的零个或多个”(请参阅PatternSyntaxException Javadocs),并且您没有给它任何先前的表达式,因此拆分表达式是非法的。 这就是为什么错误是PatternSyntaxException的原因。

Michael Myers answered 2020-01-14T12:54:44Z
6 votes

我在regex = "?"中遇到了类似的问题。对于在正则表达式中具有某些含义的所有特殊字符,都会发生这种情况。 因此,您需要将"\\"作为正则表达式的前缀。

String [] separado = line.split("\\*");
Aniket Thakur answered 2020-01-14T12:55:04Z
3 votes

第一个答案涵盖了它。

我想您可能决定将信息存储在不同的类/结构中。 在这种情况下,您可能不希望结果从split()方法进入数组。

您没有要求,但是我很无聊,所以这里有个例子,希望对您有所帮助。

这可能是您编写的代表一个人的课程:


然后,您最初发布的解析代码的版本将如下所示:(这将它们存储在LinkedList中,您可以使用Hashtable等其他名称。)


jdc0589 answered 2020-01-14T12:55:42Z
3 votes

这是因为*被用作元字符来表示一个或多个先前字符的出现。 因此,如果我写M *,那么它将查找文件MMMMMM .....! 在这里,您使用*作为唯一字符,因此编译器正在寻找该字符以查找多次出现的字符,因此它将引发异常。

Vishal Joshi answered 2020-01-14T12:56:03Z
translate from https://stackoverflow.com:/questions/917822/tokenizing-error-java-util-regex-patternsyntaxexception-dangling-metacharacter