在Java中替换没有特定前缀和后缀的字符串

时间:2015-11-02 02:28:33

标签: java regex string replaceall

我试图替换给定字符串的所有事件,但我必须确保它不被字母或数字包围。

例如:

// Directive's block
BIT EQU $1111
BIT0 EQU $0000

// Instruction's block
ADD BIT, (**BIT**0)+

当我的解析器在第一行找到EQU时,它会读取指令块,试图找到给定的标签(" BIT",在这种情况下),并用它的值替换它。然后结果是(这是错误的):

ADD $1111, (**$1111**0)+

覆盖另一个标签的名称,因为它是它的子字符串。因此,我必须确保包围的字符不是字母或数字,然后我可以确定它不会覆盖另一个标签ID。

我现在的代码是:

output += operand.replace(label, value)+" ";

操作数:包含整个操作数的字符串 label:要替换的标签 value:要用该标签替换的值

现在我尝试使用ReplaceAll()和一些正则表达式:

String regex = "(?<![a-zA-Z_])"+label+"[^a-zA-Z_]";

output+= operand.replaceAll(regex, value)+" ";

但它引发了以下异常:

IndexOutOfBoundsException:非组1(java.util.regex.Matcher.start)

即使我只留下后缀,它也会抛出相同的错误。

有人知道这是什么意思吗?

谢谢你们。

1 个答案:

答案 0 :(得分:1)

如果您正在使用replaceAll(),并且您尝试使用$1111替换某些内容,则无法正常工作,因为$具有特殊含义在replaceAll。在Matcher.quoteReplacement(value)电话中使用value代替replaceAll(); quoteReplacement确保所有特殊字符都被引用&#34;这样他们就不再有特殊的意义了。 (替换是将$1解释为&#34;替换为第1组&#34;的内容,这就是您收到错误的原因。)