regex implementation to replace group with its lowercase version

╄→гoц情女王★ 提交于 2019-11-27 13:24:13

问题


Is there any implementation of regex that allow to replace group in regex with lowercase version of it?


回答1:


In Perl, you can do:

$string =~ s/(some_regex)/lc($1)/ge;

The /e option causes the replacement expression to be interpreted as Perl code to be evaluated, whose return value is used as the final replacement value. lc($x) returns the lowercased version of $x. (Not sure but I assume lc() will handle international characters correctly in recent Perl versions.)

/g means match globally. Omit the g if you only want a single replacement.




回答2:


If your regex version supports it, you can use \L, like so in a POSIX shell:

sed -r 's/(^.*)/\L\1/'



回答3:


If you're using an editor like SublimeText or TextMate1, there's a good chance you may use

\L$1

as your replacement, where $1 refers to something from the regular expression that you put parentheses around. For example2, here's something I used to downcase field names in some SQL, getting everything to the right of the 'as' at the end of any given line. First the "find" regular expression:

(as|AS) ([A-Za-z_]+)\s*,$

and then the replacement expression:

$1 '\L$2',

If you use Vim (or presumably gvim), then you'll want to use \L\1 instead of \L$1, but there's another wrinkle that you'll need to be aware of: Vim reverses the syntax between literal parenthesis characters and escaped parenthesis characters. So to designate a part of the regular expression to be included in the replacement ("captured"), you'll use \( at the beginning and \) at the end. Think of \ as—instead of escaping a special character to make it a literal—marking the beginning of a special character (as with \s, \w, \b and so forth). So it may seem odd if you're not used to it, but it is actually perfectly logical if you think of it in the Vim way.


1 I've tested this in both TextMate and SublimeText and it works as-is, but some editors use \1 instead of $1. Try both and see which your editor uses.

2 I just pulled this regex out of my history. I always tweak regexen while using them, and I can't promise this the final version, so I'm not suggesting it's fit for the purpose described, and especially not with SQL formatted differently from the SQL I was working on, just that it's a specific example of downcasing in regular expressions. YMMV. UAYOR.




回答4:


Several answers have noted the use of \L. However, \E is also worth knowing about if you use \L.

\L converts everything up to the next \U or \E to lowercase. ... \E turns off case conversion.

(Source: https://www.regular-expressions.info/replacecase.html )

So, suppose you wanted to use rename to lowercase part of some file names like this:

artist_-_album_-_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a
artist_-_album_-_Another_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a

you could do something like:

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



回答5:


In Perl, there's

$string =~ tr/[A-Z]/[a-z]/;



回答6:


Most Regex implementations allow you to pass a callback function when doing a replace, hence you can simply return a lowercase version of the match from the callback.



来源:https://stackoverflow.com/questions/427654/regex-implementation-to-replace-group-with-its-lowercase-version

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!