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

标签 java regex string replaceall

我正在尝试替换给定字符串的所有出现,但我必须确保它没有被字母或数字包围。

例如:

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

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

当我的解析器在第一行找到 EQU 时,它会读取指令的 block ,尝试找到给定的标签(在本例中为“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)

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

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

谢谢你们。

最佳答案

如果您使用 replaceAll() 并尝试用 $1111 替换某些内容,那么这是行不通的,因为 $ > 在 replaceAll 中具有特殊含义。在 replaceAll() 调用中使用 Matcher.quoteReplacement(value) 而不是 valuequoteReplacement 确保任何特殊字符都被“引用”,以便它们不再具有特殊含义。 (替换将 $1 解释为“替换为组 1 的内容”,这就是您收到错误的原因。)

关于java - Java中替换没有特定前缀和后缀的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33469844/

相关文章:

java - 如果我将测试放在单独的模块中,如何在多模块 Maven 设置中运行单元测试?

ios - ORKTextAnswerFormat 正则表达式验证

javascript - 带有新行 '\n' 的 php echo 警报消息不起作用

Kotlin中双数的字符串插值

java - 有没有办法在本地时间之前触发一个 Action ?

java - 如何使用 Apache POI 重写 .xlsm 文件?

regex - 为什么@+ 和@{^CAPTURE} 的长度不同?

php - 使用部分 _id 字符串查找 mongodb 文档

将特殊字符 * 重新插入字符串中的预定义位置

java - 我的 TestCircle java 代码运行不正确