我对正则表达式不熟悉并对他们的力量感兴趣。我想提出一个正则表达式来生成标题案例约定。一般来说,书籍,电影和其他作品的英文标题中的每个单词都需要初始资本,除了文章(" a","","" ;),"到"作为不定式的一部分,介词和协调连词短于五个字母("在","在","来自","和" ;," with"),除非他们开始或结束标题或副标题。
话虽如此,我想要做的事实上是将字符串(标题)中每个单词的第一个字母大写,除了单词:
a
an
the
to
in
on
from
and
with
当这是第一个或最后一个单词时,这些单词将首字母大写,否则它们将全部为小写。
Examples:
A New Kind of Science (uppercase A - first word)
Once in a While (lowercase a - not first/last word)
The World We Live In (uppercase The - first word)
Ghost in the Shell (lowercase the - not first/last word)
To Be or Not to Be (uppercase and lowercase To, to)
理想情况下,罗马数字(1-5000)将全部大写:
I, II, III, ... (ones)
IV, V, VI, ... (fives)
IX, X, XI, ... (tens)
XL, L, LX, ... (fifties)
XC, C, CX, ... (hundreds)
XD, D, DX, ... (five hundreds)
CM, M, MC, ... (thousands)
对于所有排列,请参阅:Roman Numerals
有关从哪里开始的任何建议?
答案 0 :(得分:1)
正则表达式是强大的,真实的。但在这种情况下,您最终会得到一页正则表达式来定义所有这些规则。这是不切实际的。
但如果你介意,我还有另一个想法。
少于50行的Java代码可以完成这项工作。
答案 1 :(得分:0)
首先,没有一个“正则表达式”,每个工具和语言都有自己的正则表达式实现。您将无法在大多数正则表达式中完成任务,因为它们不支持匹配操作(将大写转换为小写,反之亦然)。
但是Boost Regex Engine,Notepad++(我在其中测试过)和C ++中使用的lookahead and lookbehind可以做这种事情。
所以让我们先从匹配的部分开始
\b(?<!^)(a(?:nd?)?|the|to|[io]n|from|with)(?!$)\b|\b(?=[ivxlcdm]+\b)(m{0,4}(?:cm|cd|d?c{0,3})(?:xc|xl|l?x{0,3})(?:ix|iv|v?i{0,3}))(?<=\w)\b|\b(\w)(\w*)\b
如果它们支持\b(javascript没有),你可以使用它来匹配大多数正则表达式。在某些情况下,你必须加倍反斜杠(例如java)。您还需要包含多行匹配的修饰符(锚点^和$匹配每行的开头/结尾)和不区分大小写的匹配。 Notepad ++自动包含多行,并具有案例密度的复选框。
我经常在这里使用this answer,因为它会检查单词的开头/结尾,所以我们只会在匹配中获得完整的单词。
基本上我正在检查3种不同的情况:
因此\b(?<!^)(a(?:nd?)?|the|to|[io]n|from|with)(?!$)\b
与您的某个关键字匹配,如果它不在开头((?<!^)
)和结束((?!$)
),则使用负前瞻和后视以及锚点
\b(?=[ivxlcdm]+\b)(m{0,4}(?:cm|cd|d?c{0,3})(?:xc|xl|l?x{0,3})(?:ix|iv|v?i{0,3}))(?<=\w)\b
匹配罗马数字。实际检查((m{0,4}(?:cm|cd|d?c{0,3})(?:xc|xl|l?x{0,3})(?:ix|iv|v?i{0,3}))
)取自{{3}},因此作者的所有学分。我在开始时添加了一个前瞻((?=[ivxlcdm]+\b)
),以确保只有字母跟随,可以构建一个罗马数字(这是纯粹的速度优化)和最后的(?<=\w)
,以确保我们不匹配空字符串。 (对于像ill这样的单词,只包含有效字母,但实际上并不是罗马数字)
\b(\w)(\w*)\b
匹配之前未匹配的每个单词,将第一个字母放在一个捕获组中,其他单词放在一个捕获组中。需要拆分成这些组才能将第一个转换为大写,将最后一个转换为小写
替换非常简单:\L$1\U$2\U$3\L$4
它使用\L
和\U
,在强制正则表达式中强制将以下字母设为小写或大写。 $1
是第一个捕获组的反向引用,依此类推。
因此,如果我们有一个示例文本,如:
a NEw kinD of ScIENce
ONCE IN A WHILE
the world we live in
GHOST in the Shell
To Be Or Not To Be
Louis xiv and Edward IV
In Year mmXII we will all die
ILL till we die
我们会将其转换为
A New Kind Of Science
Once in a While
The World We Live In
Ghost in the Shell
To Be Or Not to Be
Louis XIV and Edward IV
In Year MMXII We Will All Die
Ill Till We Die