【问题标题】:Dangling meta character悬空元字符
【发布时间】:2013-05-30 07:35:18
【问题描述】:

当我使用“+”、“*”、“(”和“)”时,我不断收到关于悬空元字符的错误。

我已经尝试在正则表达式中转义这些字符,但我仍然得到错误。这就是我所拥有的:

"[-\\+\\*/%\\(\\)]"

更新:

测试:

String input = "+";

String vals = new WNScanner(input).getNextToken();    //**********
System.out.println("token: " + vals);
System.out.println(vals.matches("[-+*/%()]"));

来自另一个班级:

    ...

    String expression = input;
    ...

public String getNextToken() {

    String[] token = {""};

    if (expression.length() == 0)
        return "";

    token = expression.split("\\s");
    recentToken = token[0];
    expression = expression.replaceFirst(token[0], "");     //*************
    expression = expression.trim();

    return token[0];


}

*这些行有例外。

【问题讨论】:

  • 这些都不需要在“[]”中转义反斜杠(但是,“-”必须是“[]”中的第一个字符)。
  • @ShadowCreeper 哦。但如果我不包含反斜杠,我仍然会收到错误消息。有什么想法吗?
  • 在问题中发布您的尝试(代码)并带有错误消息(您可以将其缩减为一个简单的类或单个函数)。
  • @ShadowCreeper 我更新了我的帖子。希望清楚
  • 什么是输入?什么是表达?为什么 getNextToken 不返回一些东西?

标签: java regex


【解决方案1】:

好的,我不知道你想在那里实现什么......尤其是在这一行:

expression = expression.replaceFirst(token[0], "");

如果你的输入字符串是"+",那么你的整个正则表达式就是+。这是不合法的。

您需要引用输入字符串才能在任何与正则表达式相关的操作中使用它,包括String.replaceFirst().replaceAll()(但不是 .replace() ...)。

因此,这样做:

final String re = Pattern.quote(token[0]);
expression = expression.replaceFirst(re, "");

【讨论】:

  • 哇。谢谢。这解决了这个问题。但是你能解释一下什么是模式吗?
  • Pattern 是 JDK 用于正则表达式处理的基础类。您可以通过调用静态工厂方法Pattern.compile() 创建一个正则表达式对象。这个类的另一个静态方法是这里使用的方法.quote(),给定String作为输入,它将引用其中的所有元字符,以便从该字符串创建的正则表达式自动有效。 Full javadoc for Pattern here。注意:不要忘记接受答案;)
猜你喜欢
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2010-10-29
  • 1970-01-01
相关资源
最近更新 更多