正则表达式实现用其小写版本替换组

52 regex replace lowercase

是否有任何正则表达式的实现允许用小写版本替换正则表达式中的组?

Kim*_*and 59

如果你的正则表达式版本支持它,你可以在POSIX shell中使用\ L,就像这样:

sed -r 's/(^.*)/\L\1/'
Run Code Online (Sandbox Code Playgroud)

  • 这似乎适用于数量惊人的正则表达式套件,即使您不在类似shell的环境中. (3认同)
  • @Tim:同意,甚至Notepad ++都支持它. (3认同)
  • +1非Perl解决方案.在凯特工作:"\ L\1" (2认同)
  • 这在OSX上的`zsh`或`bash`中不起作用(是的,我使用`-E`而不是`-r`). (2认同)

j_r*_*ker 35

在Perl中,您可以:

$string =~ s/(some_regex)/lc($1)/ge;
Run Code Online (Sandbox Code Playgroud)

/e选项使替换表达式被解释为要计算的Perl代码,其返回值用作最终替换值. lc($x)返回小写版本$x.(不确定,但我认为lc()在最近的Perl版本中会正确处理国际字符.)

/g意味着全球匹配.g如果你只想要一次更换,请省略.

  • Perl还支持“ \ L”语法,例如在5.26上测试的“ s /(some_regex)/ \ L $ 1 / g”。 (2认同)

ico*_*ast 15

如果您使用的是SublimeText或TextMate 1之类的编辑器,那么您很有可能会使用它

\L$1
Run Code Online (Sandbox Code Playgroud)

作为你的替代,其中$1指的是正则表达式中你放括号的东西.例如2,这里是我用来在某些SQL中对字段名称进行下调的东西,在任何给定行的末尾将所有内容都放在'as'的右侧.首先是"查找"正则表达式:

(as|AS) ([A-Za-z_]+)\s*,$
Run Code Online (Sandbox Code Playgroud)

然后是替换表达式:

$1 '\L$2',
Run Code Online (Sandbox Code Playgroud)

如果您使用Vim(或者可能是gvim),那么您将需要使用\L\1而不是\L$1,但是还需要注意另一个皱纹:Vim会反转字面括号字符和转义括号字符之间的语法.因此,要指定要包含在替换("捕获")中的正则表达式的一部分,您将\(在开头和\)结尾使用.想想\作为,而不是转义特殊字符,使其文字标记特殊字符的开头(如\s,\w,\b等等).所以如果你不习惯它可能看起来很奇怪,但如果你以Vim的方式想到它,它实际上是完全合乎逻辑的.


1我已经在TextMate和SublimeText中对它进行了测试,它按原样工作,但有些编辑使用\1而不是$1.尝试两者并查看编辑器使用的内容.

2我把这个正则表达式从我的历史中删除了.我总是在使用它们时调整regexen,我不能保证这是最终版本,所以我并不是说它适合所描述的目的,特别是不能使用与我正在处理的SQL不同的SQL格式,只是它是正则表达式中下行的特定示例.因人而异.UAYOR.


sam*_*per 8

有几个答案指出的使用\L。但是,\E如果使用,也是值得了解的\L

\L将所有内容转换为下一个\U\E小写形式。... \E关闭大小写转换。

(来源:https : //www.regular-expressions.info/replacecase.html

因此,假设您想使用rename某些文件名的小写形式,例如:

artist_-_album_-_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a
artist_-_album_-_Another_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a
Run Code Online (Sandbox Code Playgroud)

您可以执行以下操作:

rename -v 's/^(.*_-_)(.*)(_-_.*.m4a)/$1\L$2\E$3/g' *
Run Code Online (Sandbox Code Playgroud)