替换 Java 中没有特定前缀和后缀的字符串
Replace a string without certain prefix and suffix in Java
我正在尝试替换给定字符串的所有出现,但我必须确保它没有被字母或数字包围。
例如:
// Directive's block
BIT EQU 11
BIT0 EQU [=11=]00
// Instruction's block
ADD BIT, (**BIT**0)+
当我的解析器在第一行找到 EQU 时,它会读取指令块以尝试找到给定的标签("BIT",在本例中)并将其替换为它的值。那么结果是(错误的):
ADD 11, (**11**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)
即使我只留下后缀,它也会抛出同样的错误。
有人知道这是什么意思吗?
谢谢大家。
如果您正在使用 replaceAll()
并试图用 11
替换某些内容,那将不起作用,因为 $
在 [=13] 中具有特殊含义=].在 replaceAll()
调用中使用 Matcher.quoteReplacement(value)
而不是 value
; quoteReplacement
确保任何特殊字符都是 "quoted" 以便它们不再具有特殊含义。 (替换将
解释为 "replace with the contents of group 1",这就是您收到错误的原因。)
我正在尝试替换给定字符串的所有出现,但我必须确保它没有被字母或数字包围。
例如:
// Directive's block
BIT EQU 11
BIT0 EQU [=11=]00
// Instruction's block
ADD BIT, (**BIT**0)+
当我的解析器在第一行找到 EQU 时,它会读取指令块以尝试找到给定的标签("BIT",在本例中)并将其替换为它的值。那么结果是(错误的):
ADD 11, (**11**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)
即使我只留下后缀,它也会抛出同样的错误。
有人知道这是什么意思吗?
谢谢大家。
如果您正在使用 replaceAll()
并试图用 11
替换某些内容,那将不起作用,因为 $
在 [=13] 中具有特殊含义=].在 replaceAll()
调用中使用 Matcher.quoteReplacement(value)
而不是 value
; quoteReplacement
确保任何特殊字符都是 "quoted" 以便它们不再具有特殊含义。 (替换将 解释为 "replace with the contents of group 1",这就是您收到错误的原因。)