好的,所以我一直在阅读有关Java和regex之类的$登录的帖子(alot)。但是由于某种原因,每次我尝试更换它时,都会给我一个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); }} 最佳答案 \u0024是美元符号的Unicode转义序列。您的代码正在检查美元符号(w.charAt(0) == '$'),将其删除(w = w.replace("\u0024", "")),然后再次放回美元符号('\u0024' + i)。编辑:我知道这很奇怪,但我错过了实际的问题。我现在明白了; Matcher.appendReplacement抱怨,因为替换中有$ + number序列,并将其作为对捕获组的引用。这是因为\u0024不会对appendReplacement进行任何转义,因为该转义序列是在编译时进行解析的。在运行时,在源中写为"\u0024"的字符串的长度为1,其唯一字符为文字美元符号。 (实际上,Unicode转义序列几乎是Java编译器在计数行之后首先解析的东西。例如,您可以声明一个变量int $foo;,然后在代码中使用它(在正则表达式甚至字符串之外),其中(或\u0024foo = 123;))。要转为appendReplacement的美元符号,请用反斜杠将其转义。因为字符串的转义序列是在编译时解析的,所以您还必须转义反斜杠。即m.appendReplacement(sb, ChatTweaks.Citrus.get("dollarIn") + "\\$" + i);为了澄清起见,在编译时,编译器会看到\u0024\u0066\u006f\u006f = 123;并创建一个长度为2的字符串。其字符为\和$。在运行时,appendReplacement可以看到它们并仅插入$。方法Matcher.quoteReplacement也可以为您完成此操作,这是一个好主意,以防"\\$"可能还返回任何不应该使用的美元符号,并且这也会使匹配器不正常。例如。,m.appendReplacement(sb, Matcher.quoteReplacement(ChatTweaks.Citrus.get("dollarIn") + "$" + i));关于java - 美元符号替换无法正常运行Java,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14554890/
10-09 09:23