Java 美元符号替换不起作用

Java 美元符号替换不起作用,java,regex,Java,Regex,好的,我已经读了很多关于$登录java和regex之类的帖子。但出于某种原因,每次我尝试替换它时,它都会给我一个索引outofboundsexception 我试图将以$符号开头的字符串解析为整数 当我执行$test时,它会给我一个NumberFormatException(这是我想要的),但当我执行$5时,它会给我另一个异常(IndexOutOfBoundsException),尽管我正在将其更改为\0024并添加后面的数字。。。有人介意帮我吗?谢谢 if (w.charAt(0) == '$

好的,我已经读了很多关于
$
登录java和regex之类的帖子。但出于某种原因,每次我尝试替换它时,它都会给我一个
索引outofboundsexception

我试图将以
$
符号开头的字符串解析为整数

当我执行
$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);
    }
}

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

w = w.substring(w.length()-1)
另外,对于代码可读性,“$”和“$”也可以-因为“$”是一个单字节字符,它应该等同于“\u002”-或者您有什么特殊要求吗


请参阅,以获得一个半幽默的观点,了解在您试图解决文本操作问题时,为什么不首先想到正则表达式。

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

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

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

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

m.appendReplacement(sb, ChatTweaks.Citrus.get("dollarIn") + "\\$" + i);
为了澄清这一点,编译器在编译时会看到
“\\$”
,并创建一个长度为2的字符串;其字符为\和$。在运行时,appendReplacement可以看到它们并只插入$

该方法也可以为您做到这一点,这对于case
chatweaks.Citrus.get(“dollarIn”)
也可以返回任何不应该返回的美元符号,这也会让匹配者感到不安。例如:

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

替换和解析代码对我来说很有用<代码> String。替换(string,string)不会将参数视为正则表达式。如果要将正则表达式作为参数传递,请使用
String.replaceAll(String,String)
String.replaceFirst(String,String)

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

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

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

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


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

问题是,当我使用$符号时,它认为我在使用正则表达式。。。。所以idk如何取消它D:如果说“it”,你指的是String.replace(String,String)方法,它只适用于正则表达式。因此,您必须通过在美元符号前面加反斜杠来转义美元符号,使其成为文字,如
w.replace(\$”,“”)
中所示,但我仍然建议使用substring方法。@greybearedgeek:“如果您所说的“it”是指String.replace(String,String)方法,它只适用于regex”。这是不对的
String.replaceAll
String.replaceFirst
是正则表达式方法
String.replace
执行普通的文本查找和替换@你不需要取消任何东西。正如我在回答中指出的,您的代码工作得非常完美,因为它成功地删除了美元符号;只是无缘无故,你在两行后又把美元符号放回去了。是的,但我想把美元符号拿出来。。。如果有更简单的方法来确定美元符号后的数字是整数,把它扔给我哈哈。。。我只是不明白为什么它总是在寻找一个组,即使我使用转义序列(或将其用作字符串)。。。顺便说一句,它说错误是@
m.appendReplacement(…)