java - 仅在由某些字符分隔的文本的某些部分替换子字符串

标签 java regex string substring

我需要替换所有出现的子字符串,前提是它前面有“]”,后面有“[”(前面和后面但不一定紧挨着子字符串)。示例:

这将是我需要进行替换的字符串:

[style and tags info] valid text info [more style info] more info here[styles]

如果要替换的表达式是:info -> change(它可能不止一个单词)

结果应该是:

[style and tags info] valid text change [more style info] more change here [styles]

我的想法是使用正则表达式来隔离我必须更改的单词,然后通过调用 replaceAll 进行替换。

但是我已经尝试了几个正则表达式来隔离搜索表达式,但都没有成功。主要是因为我需要像

这样的东西
(?<=.*)

这是一个在我要查找的词之前有任意数量字符的回溯。 Java 正则表达式(也不支持我所知道的任何其他正则表达式实现)均不支持此功能。

我找到了这个用 matlab 编写的解决方案,但在 Java 中似乎更难复制:

Matlab regex - replace substring ONLY within angled brackets

有没有更简单的方法?一些我没有考虑过的正则表达式?

最佳答案

我认为这里最简单的方法是将字符串拆分为(括号外的部分)和(括号内的部分),然后仅将替换应用于(括号内的部分)。

例如,您可以使用拆分来做到这一点(这假设您的 [] 是均匀平衡的,您没有打开两个 [[ 等):

String[] parts = str.split("[\[\]]");
StringBuilder sb = new StringBuilder(str.length());
for (int i = 0; i < parts.length; i++) {
  if (i % 2 == 0) {
    // This bit was outside [].
    sb.append(parts[i]);
  } else {
    // This bit was inside [], so apply the replacement
    // (and re-append the delimiters).
    sb.append("[");
    sb.append(parts[i].replace("info", "change"));
    sb.append("]");
  }
}
String newStr = sb.toString();

关于java - 仅在由某些字符分隔的文本的某些部分替换子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43224316/

相关文章:

javascript - JS RegExp 中的\u007F 和\uFFFF

regex - 正则表达式用于在一个字符串包含另一个字符串时查找两个字符串之一

python Pandas : Split string into multiple columns and extract data for column from split parameter

c - C 中查找元音计数的字符串

java - 无法使用 selenium webdriver 版本 3.0.0.beta3 单击链接

java - 我在java中的这个递归函数中缺少什么

java - 让我的圆圈随机消失,并在随机几秒后再次出现

jquery - javascript按键函数: case-insensitive a-z,数字和一些特殊字符?

java - Jtable RowSorter 图标

ruby - 使用正则表达式获取 URL 的域