我的问题很简单,但是我想不出应该用哪个正则表达式。
我有以下变量(Java):
String text = "\033[1mYO\033[0m"; // this is ANSI for bold text in the Terminal
我的目标是用一个正则表达式删除ANSI代码(我只想保留中间的纯文本),我不能以任何方式修改文本,这些ANSI代码将始终在同一个位置(一个在开头,一个在结尾,尽管有时可能没有)。
对于这个正则表达式,我将使用replaceAll
方法删除它们:
String plainText = text.replaceAll(unknownRegex, "");
知道未知正则表达式是什么吗?
2条答案
按热度按时间kq0g1dla1#
好吧,我们使用一个正则表达式,它的开头和结尾可选地包含ansi代码,捕获其间的任何内容,并将整个字符串替换为group的值:
text.replaceAll("^(?:\\\\\\d+\\[1m)?(.*?)(?:\\\\\\d+\\[0m)?$", "$1")
。(这可能不会捕获每个ANSI代码-如果需要,进行调整)。分解表达式(注意,上面的示例转义了Java字符串的反斜杠,因此它们是双斜杠):
^
是字符串的开头(?:\\\d+\[1m)?
与可选的\<at least 1 digit>[1m
匹配(.*?)
尽可能少地匹配任何文本,并将其捕获到组1中(?:\\\d+\[0m)?
匹配可选的\<at least 1 digit>[0m
$
是输入的结尾在替换中,
$1
指捕获组1的值,其在表达式中为(.*?)
。ltskdhd12#
实际上,我只需要创建一个组来获取字符串中间的内容,并用它($1)替换整个内容:
不确定这是否会删除每一个ANSI代码,但这对我想做的事情来说已经足够了。