【问题标题】:JAVA replace all but variable stringJAVA替换除变量字符串之外的所有内容
【发布时间】:2018-05-12 00:48:35
【问题描述】:

这是我的第一篇文章。我对 Java 中的 String 有疑问。我想使用正则表达式。提前感谢您的帮助。

我的字符串是:

String str = "abXYxyzXYZabXasdfggXYZ".

我想用“+”替换所有字符,但下面不可变:

String word = "XYZ"

所以输出应该是这样的:

+++++++XYZ+++++++++XYZ.

我一开始是:

str.replaceAll("[^" + word + "]", "+")

但是我得到了不同的输出:

++XY+++XYZ++X++++++XYZ

【问题讨论】:

  • java.util.regex 不支持匹配除特定 multicharacter 文本字符串之外的任何文本的构造。几乎所有的正则表达式都不支持它。
  • 这是因为正则表达式中的[...] 表示单个字符集。你不能那么容易地表示整个单词的倒数。所以[^XYZ] 匹配不是X、不是Y 和不是Z 的每个字符,所以除了X, Y, Z 之外的整个字母表。它确实不匹配不等于单词XYZ的整个单词。

标签: java regex string replace


【解决方案1】:

简介

这个可以其实是可以实现的。这是一种有趣的方法,因为 Java 不允许正则表达式 If 子句,但您实际上可以在负前瞻中使用前瞻和后瞻的组合来模仿一种 If 子句。


代码

See regex in use here

(?!(?:(?=XYZ)|(?<=X)(?=YZ)|(?<=XY)(?=Z))).

替换:+

用法

下面的代码是从regex101自动生成的。
请参阅下面的代码使用here

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "(?!(?:(?=XYZ)|(?<=X)(?=YZ)|(?<=XY)(?=Z))).";
final String string = "abXYxyzXYZabXasdfggXYZ";
final String subst = "+";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

// The substituted value will be contained in the result variable
final String result = matcher.replaceAll(subst);

System.out.println("Substitution result: " + result);

结果

输入

abXYxyzXYZabXasdfggXYZ

输出

+++++++XYZ+++++++++XYZ


说明

  • (?!(?:(?=XYZ)|(?&lt;=X)(?=YZ)|(?&lt;=XY)(?=Z))) 负前瞻确保后面的内容不匹配
  • (?:(?=XYZ)|(?&lt;=X)(?=YZ)|(?&lt;=XY)(?=Z)) 匹配以下任意一项
    • (?=XYZ) 积极的前瞻确保后面的内容与 XYZ 字面上的匹配
    • (?&lt;=X)(?=YZ) 匹配以下
      • (?&lt;=X) 正面向后看,确保前面是 X 字面意思
      • (?=YZ) 正向前瞻确保接下来的内容是 YZ 字面意思
    • (?&lt;=XY)(?=Z) 匹配以下
      • (?&lt;=XY) 正面向后看,确保前面是 XY 字面意思
      • (?=Z) 积极的前瞻确保接下来是 Z 字面意思
  • .匹配任意字符

【讨论】:

  • 您发布的 regex101 链接中包含另一个正则表达式,而不是您的帖子
  • @MichaelA.Schaffrath 谢谢,我将正则表达式更新到版本 2,但忘记在此处更新链接。现已修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多