使用 sublime 的正则表达式问题(查找/替换)

Regex question using sublime (Find/Replace)

提问人:Derek Rickmon 提问时间:11/1/2023 最后编辑:zdimDerek Rickmon 更新时间:11/11/2023 访问量:49

问:

好的,使用 bash 终端或在 sublime 之类的东西中查找/替换,我想找到:

BLK=$'\e[0;30m'
RED=$'\e[0;31m'
GRN=$'\e[0;32m'
YEL=$'\e[0;33m'
BLU=$'\e[0;34m'
MAG=$'\e[0;35m'
CYN=$'\e[0;36m'
WHT=$'\e[0;37m'

前 3 个字母和 =$,并用前 3 个别名替换它,前 3 个字母=“echo -e(引号之后和最后一个引号之前的所有内容)。到目前为止,甚至还没有:

这是我卡住的地方:

我可以找到/替换为别名(前 3 个字母),但无法完成其余部分。该正则表达式如下所示:

Find: ([A-Z]{3,5})(\=\$)(?:\')(\\e\[\d\;?\d{1,3}m)(?:\')
Replace: alias  \1

但似乎无法完成整个事情。使用崇高的文本编辑器。

正则表达式 替换 查找

评论

0赞 zdim 11/1/2023
为什么是标签?perl
0赞 zdim 11/1/2023
删除了标签,因为该问题与该语言完全无关。请查看哪些与“崇高”相关的标签是合适的,并添加这些标签。perl

答:

0赞 Sree Kumar 11/1/2023 #1

它可能与替换字符串一起使用;模式是正确的。(我只熟悉 Java,并在此处发布一个有效的解决方案。请查看它是否有助于您创建等效的 Sublime 替代品。

String s = "BLK=$'\\e[0;30m'\nRED=$'\\e[0;31m'\nGRN=$'\\e[0;32m'";

Pattern p = Pattern.compile( "([A-Z]{3,5})(\\=\\$)(?:\\')(\\\\e\\[\\d\\;?\\d{1,3}m)(?:\\')" );
Matcher m = p.matcher( input );

while( m.find() ){
    String repl = m.replaceAll( "alias $1='echo -e $3'" );
    System.out.println( repl );
}

如果您不熟悉 Java:

  • 由于有许多转义字符,该模式可能看起来令人困惑。但是我使用了与您发布的完全相同的模式,即.\([A-Z]{3,5})(\=\$)(?:\')(\\e\[\d\;?\d{1,3}m)(?:\')
  • 在 Java 中,这些组被标识为 、 等,而不是 、 等。$1$2\1\2

结果

对于代码中的值,我从您的问题中获取,以下是输出:input

alias BLK='echo -e \e[0;30m'
alias RED='echo -e \e[0;31m'
alias GRN='echo -e \e[0;32m'
1赞 The fourth bird 11/1/2023 #2

使用 Sublime,您可以使用 2 个捕获组,而不是将捕获组添加到第一个捕获组,并将关闭添加到第二个捕获组,因为您希望保留这些捕获组。='

您可以找到:

([A-Z]{3,5}=)\$'(\\e\[\d\;?\d{1,3}m')

并替换为:

alias $1'echo -e $2

观看正则表达式演示

请注意,您不必转义引号,您可以省略非捕获组,因此只是(?:\')'

0赞 Reilas 11/11/2023 #3

请尝试以下捕获模式

(.+?)=\$'(.+?)'

以及以下替换文本。

alias $1='echo -e $2'

输出

alias BLK='echo -e \e[0;30m'
alias RED='echo -e \e[0;31m'
alias GRN='echo -e \e[0;32m'
alias YEL='echo -e \e[0;33m'
alias BLU='echo -e \e[0;34m'
alias MAG='echo -e \e[0;35m'
alias CYN='echo -e \e[0;36m'
alias WHT='echo -e \e[0;37m'