0

首先,让我澄清一下,我对正则表达式一无所知,但我需要为 MusicBrainz Picard 编写一个“标记脚本”,这样它就不会影响我格式化曲目标题某些方面的方式。

这是我需要做的: - 查找括号内的所有子字符串 - 然后,对于符合给定条件的匹配项和仅匹配项,将括号更改为括号

例如,考虑这个字符串:DJ Fresh - Louder (Sian Evans) (Flux Pavilion & Doctor P Remix)

它需要像这样改变:DJ Fresh - Louder (Sian Evans) [Flux Pavilion & Doctor P Remix]

条件是如果括号内的字符串包含子字符串“dj”或“mix”或“version”或“inch”等......那么围绕它的括号需要更改为括号。

所以,问题是:是否有可能创建一个可以执行此操作的正则表达式?

非常感谢您提前。

4

1 回答 1

3

假设没有嵌套括号,您可以使用以下正则表达式来搜索文本:

(?i)\((?=[^()]*(?:dj|mix|version|inch))([^()]+)\)

请注意,正则表达式不区分大小写,因为(?i)在前面 -通过删除它使其区分大小写。

检查你的语言的语法,看看你是否可以使用r前缀,例如r'literal_string',来指定文字字符串。

并使用以下内容作为替换:

[$1]

您可以通过向部件添加关键字来包含更多关键字(?:dj|mix|version|inch),每个关键字用 . 分隔|。如果关键字包含(, ), [, ], |, ., +, ?, *, ^, $, \, {}则需要转义它们(我 99% 确定该列表是详尽的)。一个更简单的考虑方法是:如果关键字只包含空格和字母数字(但请注意空格的数量是严格的),您可以将它们添加到正则表达式中而不会产生副作用。


剖析正则表达式:

  • (?i):不区分大小写模式

  • \(:(是正则表达式中的特殊字符,需要通过前置来转义它\

  • (?=[^()]*(?:dj|mix|version|inch)): 积极展望(?=pattern):

    • [^()]*:我需要检查文本是否在括号内,而不是在括号外或其他括号内,所以我使用否定字符类[^characters]来避免匹配()和溢出当前括号之外。我所做的假设也在这里发挥了作用。

    • (?:dj|mix|version|inch):非捕获组 中的关键字列表(?:pattern)|意思是交替。

  • ([^()]+): 关于没有嵌套括号的假设使得匹配括号内的所有字符更容易。捕获文本以供以后替换,因为(pattern)是捕获组,而不是(?:pattern).

  • \):)是正则表达式中的特殊字符,需要通过前置来转义它\

于 2013-01-12T05:08:39.110 回答