首先,请允许我澄清一下我对正则表达式一无所知,但我需要写一个" Tagger脚本"对于MusicBrainz Picard来说,它并没有弄乱我格式化曲目某些方面的方式。标题。
这是我需要做的事情: - 查找括号内的所有子字符串 - 然后,对于符合给定条件且仅匹配的匹配,将括号更改为括号
例如,考虑这个字符串: DJ Fresh - 大声(Sian Evans)(Flux Pavilion& Doctor P Remix)
需要像这样改变: DJ Fresh - 大声(Sian Evans)[Flux Pavilion&医生P Remix]
条件是如果括号内的字符串包含子字符串" dj"或"混合"或"版本"或"英寸"等...然后围绕它的括号需要更改为括号。
所以,问题是: 是否可以创建一个可以执行此操作的正则表达式?
非常感谢你。
答案 0 :(得分:3)
假设 没有嵌套括号 ,您可以使用以下正则表达式搜索文本:
(?i)\((?=[^()]*(?:dj|mix|version|inch))([^()]+)\)
请注意,正则表达式不区分大小写,因为前面有(?i)
- 通过删除它使区分大小写。
检查您的语言的语法,看看您是否可以使用r
前缀,例如r'literal_string'
,指定文字字符串。
并使用以下作为替代:
[$1]
您可以通过向(?:dj|mix|version|inch)
部分添加关键字来添加更多关键字,每个关键字由|
分隔。如果关键字包含(
,)
,[
,]
,|
,.
,+
,{{1} },?
,*
,^
,$
,\
,{
你需要逃避他们(我99%肯定列表是详尽的)。考虑它的一种更简单的方法是:如果关键字仅包含空格和字母数字(但请注意空格的数量是严格的),您可以将它们添加到正则表达式中而不会产生副作用。
解析正则表达式:
}
:不区分大小写模式
(?i)
:\(
是正则表达式中的特殊字符,需要通过预先(
来转义它。
\
:积极前瞻(?=[^()]*(?:dj|mix|version|inch))
:
(?=pattern)
:我需要检查文本是否在括号内,而不在外部或其他括号中,因此我使用否定字符类[^()]*
来避免匹配{{1}并溢出当前括号。我所做的假设也在这里发挥作用。
[^characters]
:非捕获组 ()
中的关键字列表。 (?:dj|mix|version|inch)
表示更改。
(?:pattern)
:关于没有嵌套括号的假设可以更轻松地匹配括号内的所有字符。文本被捕获以供日后替换,因为|
正在捕获组,而不是([^()]+)
。
(pattern)
:(?:pattern)
是正则表达式中的特殊字符,需要通过预先\)
来转义它。