1

好的,所以我一直在阅读有关$Java 和正则表达式等符号的帖子(很多)。但由于某种原因,每次我尝试更换它时,它都会给我一个IndexOutOfBoundsException.

$我正在尝试将以符号开头的字符串解析为整数。

当我这样做$test时,它给了我一个NumberFormatException(这就是我想要的),但是当我这样做时,$5它给了我另一个异常(IndexOutOfBoundsException),尽管我将其更改为\0024并添加了它后面的数字...有人介意帮助我吗?谢谢!

if (w.charAt(0) == '$') {
    try {
        w = w.replace("\u0024", "");
        int i = Integer.parseInt(w);
        m.appendReplacement(sb, ChatTweaks.Citrus.get("dollarIn") + "" + '\u0024' + i);
    } catch (NumberFormatException nume) {
        ChatTweaks.showMsg(ChatTweaks.prefix + "Please use numbers after your dollar signs ($)w=" + w);
        return;
    } catch (Exception ex){
        ChatTweaks.showMsg(ChatTweaks.prefix + "Unknown exception ex: " + ex + " w:" + w);
    }
}
4

3 回答 3

2

您的替换代码对我来说很好,但是......为什么要使用正则表达式来删除第一个字符?这更简单,也同样有效:

w = w.substring(w.length()-1)

另外,为了代码的可读性,'$' 和 "$" 很好——因为 '$' 是一个单字节字符,它应该等同于 '\u002' - 或者你有什么特殊要求?

请参阅http://www.codinghorror.com/blog/2008/06/regular-expressions-now-you-have-two-problems.html以半幽默的观点了解为什么 regex 可能不应该是第一件事当您尝试解决文本操作问题时会想到。

于 2013-01-28T03:22:40.213 回答
1

\u0024是美元符号的 Unicode 转义序列。您的代码正在检查美元符号 ( w.charAt(0) == '$'),将其删除 ( w = w.replace("\u0024", "")),然后再将其放回 ( '\u0024' + i)。

编辑:我知道这很奇怪,但我错过了实际问题。我现在明白了; Matcher.appendReplacement 抱怨,因为替换中有一个 $+number 序列,并将其视为对捕获组的引用。

这是因为就 appendReplacement 而言不会\u0024转义任何内容,因为转义序列是在编译时解析的。在运行时,源代码中写入的字符串 as的长度为1,其唯一字符是文字​​美元符号。(事实上​​,Unicode 转义序列几乎是 Java 编译器解析的第一件事,就在计算行数之后。例如,您可以声明一个变量,然后在代码(正则表达式甚至字符串之外)中使用它(或)) ."\u0024"int $foo;\u0024foo = 123;\u0024\u0066\u006f\u006f = 123;

要为 appendReplacement 转义美元符号,请使用反斜杠转义它。因为字符串中的转义序列是在编译时解析的,所以您还必须对反斜杠进行转义。IE,

m.appendReplacement(sb, ChatTweaks.Citrus.get("dollarIn") + "\\$" + i);

澄清一下,在编译时,编译器会看到"\\$"并创建一个长度为 2 的字符串;其字符为 \ 和 $。在运行时,appendReplacement 可以看到它们并只插入一个 $。

方法Matcher.quoteReplacement也可以为您执行此操作,这是一个好主意,以防万一ChatTweaks.Citrus.get("dollarIn")还可能返回任何不应该返回的美元符号,这也会扰乱匹配器。例如,

m.appendReplacement(sb,
    Matcher.quoteReplacement(ChatTweaks.Citrus.get("dollarIn") + "$" + i));
于 2013-01-28T03:30:30.670 回答
0

在您编码时替换和解析对我有用。String.replace(String,String)不会将参数视为正则表达式。如果您想将正则表达式作为参数传递,请使用String.replaceAll(String,String)or String.replaceFirst(String,String)

String.replaceAll将与作为第一个参数给出的正则表达式匹配的所有模式替换为作为第二个参数给出的字符串。

String.replaceFirst替换与作为第一个参数给出的正则表达式匹配的第一个模式。

因此w.replace("$", ""),如果您想替换每个$登录名,请使用w. 在这里,"$"不被视为正则表达式。

或使用w.replaceAll("\\$",""). 这里"\\$"被视为正则表达式。

或者w.replaceFirst("\\$",""),如果您只想替换$字符串中的第一个,请使用。

于 2013-01-28T05:10:48.827 回答