首页 > 解决方案 > 大括号内每个单词的首字母大写

问题描述

我正在尝试为 Tagscanner(Windows 上的音乐标记器)编写一些有用的正则表达式,并在 regex101.com 上花费了大量时间来实现我的想法。

在像法语这样的语言中,如果你把每个单词都大写,让标题看起来不错是一件非常痛苦的事情。我只想将圆括号中每个单词的第一个字母大写。我会收到这样的字符串:

Edith Piaf - La vie en rose(路易斯·阿姆斯特朗 2015 版)

我从这个基础开始:

/([a-z])([\w-']*)([\s\)\]\,;\d]*|$)/gi
that I replace by \U\1\E\2\3

([a-z]) I try to capture the letter I want in uppercase
([\w-']*) What I expect to be the rest of the word
([\s\)\]\,;\d]|$) Delimiters

这实际上会在标题中正确地大写,然后问题就来了......

我试图忽略一切,直到遇到'('

\(\K or \({1} or with \(\A or \((*SKIP) etc...

积极的后视 (?<=() 也不起作用,因为在我的第一次比赛之后,如果我再次有 '(' ,它会看起来。

还尝试捕获整个内容并将 * 放在后面也不起作用。

我只是不知道该怎么做。非常感谢您的帮助!

标签: regex

解决方案


Perl 从@Wiktor Stribiżew 的正则表达式重命名:

rename -n 's/(?:\G(?!^)|\()[^()]*?\K\b(\p{Ll})(\w*)/\U$1\E$2/gmu'  Edith*

当输出看起来不错时移除-n开关。

警告 还有其他同名的工具可能会也可能不会这样做,所以要小心。

cpan 独立脚本


推荐阅读