gpt4 book ai didi

regex - RegEx模式可在这些情况下限制破折号

转载 作者:行者123 更新时间:2023-12-03 15:30:19 26 4
gpt4 key购买 nike

情境

我正在使用用Delphi编写并具有pascal脚本支持的第三方文件重命名软件:http://www.den4b.com/?x=products&product=renamer

该应用程序允许使用正则表达式来重命名文件。这意味着,如果仅使用一个RegEx不能完成文件名的处理,那么我可以同时使用各种表达式或pascal脚本代码来容纳文件名,直到我可以为此格式正确格式化文件名为止。问题或其他...

问题

我需要格式化如下的歌曲文件名,在这些文件名中,“ ... featureing artist”部分位于字符串的右侧,我需要将其匹配并将其放置在字符串的左侧。


Carbin和Sirmark-对不起。 Sevener
Kristjan Cash Cash-带我回家壮举。 Bebe Rexha(撤销混音)


为了使这一点易于理解,我们可以用虚构的方式标记文件名,如下所示:

[0]ARTIST   [1]DASH   [2]TRACK   [3]FEAT_ARTIST   [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}


然后,我需要使用RegEx格式化文件名,以按以下顺序放置令牌:

[0]ARTIST   [3]FEAT_ARTIST   [1]DASH   [2]TRACK   [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}


我实际上是使用此RegEx做到的:


  \ A([^-]?)\ s- \ s *(。?)\ s([([[])?((ft [。\ s] | feat [。\ s] | featuring [。\ s] )[^(){} []] *)([]]])?(。+)?\ Z


替换为:


  $ 1 $ 4-$ 2 $ 7


问题从这里开始,因为 [0]ARTIST[2]TRACK标记可能包含短划线,例如以下文件名:


Dj E-nergy C-21-我的超级英雄曲目!壮举Dj屁眼


然后,如果我错了,请纠正我,但我认为以任何方式都无法解决该问题,因为机器无法预测何时将一个令牌与另一个令牌分开,是什么名称,什么不是,我不知道包含文件名的破折号的数量。


  因此,与其寻找可能会导致不良后果的独创性完美方法,不如
  文件名,因为里面的破折号很多,我宁愿寻找
  通过限制表达式中的破折号来排除文件名
  应与文件名匹配。




以上面显示的扩展/改进RegEx为例,如何排除包含 [0]ARTIST或带有破折号的 [2]TRACK标记的文件名?

...或者换句话说,当文件名在“ ... featureing artist”部分之前包含多个破折号时,如何告诉我的RegEx避免修改文件名? (不晚于)

基本上,正则表达式应该确定在 [1]DASH之前是否多次找到 [3]FEAT_ARTIST,如果是,则排除该文件名(不要修改它)。

我知道如何或多或少像这样的 ([\-]){1}来限制正则表达式组的出现,以仅匹配1个破折号出现,但是我不确定如何在我使用的表达式中实现它。



预期成绩

只是一些随机的例子...

仅在 [3]FEAT_ARTIST之前加一个破折号,这样我们才能知道何时将 [0]ARTIST[2]TRACK标记分开。


来自:“ Carbin和Sirmark-对不起,壮举。 Sevener'
致:'Carbin和Sirmark Feat。 Sevener-对不起


仅在 [3]FEAT_ARTIST之前加一个破折号,这样我们才能知道何时将 [0]ARTIST[2]TRACK标记分开。使用 [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}


来自:“飞行设施-心脏病发作。猫头鹰的眼睛(混响)
要:'飞行设施壮举。猫头鹰的眼睛-心脏病发作(贪吃蛇混音)'


仅在 [3]FEAT_ARTIST之前加一个破折号,这样我们才能知道何时将 [0]ARTIST[2]TRACK标记分开。用 [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}也包含破折号。


来自:“飞行设施-心脏病发作。猫头鹰的眼睛[Snake--hip Remix]'
要:'飞行设施壮举。猫头鹰的眼睛-心脏病[蛇-髋关节Remix]'


[0]ARTIST[2]TRACK标记之间只有一个破折号,但是文件名没有 [3]FEAT_ARTIST,所以我们不要碰它。


来自:“联邦大剧院-电影”
至:'Fedde Le Grand-Cinematic'


[0]ARTIST[2]TRACK标记之间只有一个破折号,但是 [3]FEAT_ARTIST[1]DASH之前,因此我们不要碰它。


来自:'Fedde Le Grand Feat。丹尼·怀特-电影
致:Fedde Le Grand Feat。丹尼·怀特-电影


[0]ARTIST带破折号,因此我们不知道何时分隔 [0]ARTIST[2]TRACK标记,因此Regex应该排除此标记,以免修改此文件名。


来自:“艺术家姓名-曲目名称专长于某人”
致:“艺术家姓名-曲目名称专长于某人”


[2]TRACK带破折号,因此我们不知道何时分隔 [0]ARTIST[2]TRACK标记,因此Regex应该排除此标记,以免修改此文件名。


来自:“艺术家名称-曲目名称专长”
致:“艺术家姓名-曲目名称专长”


[0]ARTIST[2]TRACK标记带有破折号,因此我们不知道何时分隔它们,因此Regex应该排除此标记,以免修改此文件名。


来自:'Dj E-nergy C-21-我的超级英雄曲目!壮举Dj Ass-hole'
发送至:'Dj E-nergy C-21-我的超级英雄曲目!壮举Dj Ass-hole'


[0]ARTIST[2]TRACK标记带有破折号,并且 [3]FEAT_ARTIST不存在,在此也无需执行任何操作。


来自:“ Dj E-nergy C-21-我的超级英雄曲目!”
转至:'Dj E-nergy C-21-我的超级英雄曲目!


我希望这有助于了解我的需求。

最佳答案

尝试:

^(.+)\s+-\s+(.+?)\s+[fF](t|eat(uring)?)?\.?([^([\])\n]+)(.+)?$


DEMO

并使用替换为: $1 Feat.$5 - $2$6

我用ReNamer和Regex101进行了尝试,并且如果艺术家名称中有 - + - + ),例如 artist - name,它也可以工作,但是如果其中有这样的片段,它将失败。标题部分。

^(.+)\s+-\s+部分在序列空格-短划线-空格之前使用贪婪的量词 .+,该空格被视为艺术家名称和曲目标题之间的分隔符。因此,它将尽可能地匹配,直到最后一次出现 -,因此,它将“忽略”艺术家名称中带有空格的破折号,但是如果这种元素出现在轨道中,则它将无效匹配标题。所以:


Artist - name - track title feat. someone-将被匹配并且
正确修改,
Artist name - track - title feat. someone-将失败,显示为文本
将在最后一个破折号处分割。


我使用的是与 (ft[.\s]|feat[.\s]|featuring[.\s])相似的匹配项,而不是 [fF](t|eat(uring)?)?\.?,但是应能更快地工作(它应该限制一点回溯)。

在我的演示中,有一个 +而不是 \s+(如上),因为它将与演示中的多行匹配,并显示无效的结果,但是在单行的情况下(如您的问题),它应该可以正常工作。

关于regex - RegEx模式可在这些情况下限制破折号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32807698/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com