regex 使用正则表达式,如何删除文本开头和结尾的匹配序列,但保留中间的内容?

icomxhvb  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(149)

我的问题很简单,但是我想不出应该用哪个正则表达式。
我有以下变量(Java):

String text = "\033[1mYO\033[0m"; // this is ANSI for bold text in the Terminal

我的目标是用一个正则表达式删除ANSI代码(我只想保留中间的纯文本),我不能以任何方式修改文本,这些ANSI代码将始终在同一个位置(一个在开头,一个在结尾,尽管有时可能没有)。
对于这个正则表达式,我将使用replaceAll方法删除它们:

String plainText = text.replaceAll(unknownRegex, "");

知道未知正则表达式是什么吗?

kq0g1dla

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的值,其在表达式中为(.*?)

ltskdhd1

ltskdhd12#

  • 找到答案感谢消失的评论 *

实际上,我只需要创建一个组来获取字符串中间的内容,并用它($1)替换整个内容:

String plainText = text.replaceAll("\\033\\[.*m(.+)\\033\\[.*m", "$1")

不确定这是否会删除每一个ANSI代码,但这对我想做的事情来说已经足够了。

相关问题