正则表达式查找除模式以外的所有内容

Regular expression to find everything except a pattern

我对正则表达式还很陌生,正在寻找一个可以匹配除所有匹配给定正则表达式之外的任何内容的表达式。我找到了找到除特定字符串以外的任何内容的方法,但我需要它不匹配正则表达式。它还必须在 Java.

中工作

背景:我正在使用 Ansi 色字符串。我想获取一个字符串,其中包含一些可能使用 Ansi 颜色代码格式化的文本,并删除除这些颜色代码之外的所有内容。这应该给我附加到字符串上的任何字符的当前颜色格式。

格式化的字符串可能如下所示:

Hello \u001b[31;44mWorld\u001b[0m!

这将显示为 Hello World!,其中世界将在蓝色背景上显示为红色。

我查找代码的正则表达式是

\u001b\[\d+(;\d+)*m

现在我想要一个匹配除了颜色代码之外的所有内容的正则表达式,所以它匹配

你好\u001b[31;44m世界\u001b[0m!

正则表达式并不是真正要给 'everything but' 正则表达式匹配。通常执行此类操作的最简单方法是匹配您想要的内容(例如您的情况下的颜色代码),然后获取您拥有的字符串,并删除您找到的匹配项,这将留下 'everything but' 匹配项。

快速示例(非常未经测试)

String everythingBut = "string that has regex matches".replaceAll("r[eg]+x ", "");

应该导致 string that has matches 即正则表达式的倒数

你可以这样做。它只是找到所有匹配项并将它们放入一个数组中,如果需要,该数组可以连接到一个字符串。

String pat = "\u001b\[\d+(;\d+)*m";
String html = "Hello \u001b[31;44mWorld\u001b[0m!";

Matcher m = Pattern.compile(pat).matcher(html);
String[] s =  m.results().map(mr->mr.group()).toArray(String[]::new);
String text="Hello \u001b[31;44mWorld\u001b[0m!";
Arrays.asList( text.split("\[([;0-9]+)m"))
.stream()
.forEach(s -> aa.replaceAll(s,""));

输出:

[31;44m[0m

上下文中的正则表达式:

public static void main(String[] args) {
    String input = "Hello \u001b[31;44mWorld\u001b[0m!";
    String result = Pattern.compile("\u001b\[\d+(;\d+)*m").matcher(input).replaceAll("");
    System.out.println("Output: '" + result + "'");
}

输出:

Output: 'Hello World!'