2012-12-21 77 views
0

我用这个正则表达式来话转换成的首字母大写,并确认各替代:正则表达式的话转换成首字母大写

:s/\%V\<\([A-Za-z0-9àäâæèéëêìòöôœùüûçÀÄÂÆßÈÉËÊÌÖÔŒÙÜÛ]\)\([A-Za-z0-9àäâæèéëêìòöôœùüûçÀÄÂÆßÈÉËÊÌÖÔŒÙÜÛ]*\)\>/\u\1\L\2/gc 

然而,这也符合谁已经在首字母大写的单词。

有谁知道如何改变上面的正则表达式,以跳过已经在TitleCase中的单词?

+1

第一个捕获组(第一个字母?)中的模式包括'A-Z'和大量重音首字母。如果你放下它们,你的搜索将只匹配以小写字母开头的单词,我想。 – romainl

回答

1

要仅匹配非标题字,您希望匹配那些以大写字母开头(a)与小写字母或(b)与两个。下面将做(添加重音的字母和数字的味道):

\b([A-Z])([A-Z][A-Za-z]*)|\b([a-z])([a-zA-Z]+) 

但有些话在小组\1\2,其他匹配在\3\4。我不使用vim,所以我不能说它是否会让你用这种模式来替代。 (例如,\u\1\3\L\2\4;四个中只有两个将是非空的)

+0

是的,我调整了一下Vim,它工作的\\ \ \ \ [[AZ] \ [AZ] \ <[az] \)\([a-zA-Z] \ + \> \)'但是..我不知道如何用正则表达式中的'OR'语句替换。有人可以帮助我吗? – Reman

+0

Oeps。它不匹配'HEllO' – Reman

+0

找到它。这是一个作品,其中一个作品是[a-zA-Z0-9aäâêèéëêìòöôœùüûçÀÄÂÆßÈÉÊÊÖÔÙÙÙÛ] * [a-z0-9ÀÆßÈÉËÊÌÖÔŒÙÜÛ] \ + [a-zA-Z0- 9àäâæèéëêìòöôœùüûçÀÄÂÆßÈÉËÊÌÖÔŒÙÜÛ] * \> \)\ | \ C \%V \(\ <[A-zàäâæèéëêìòöôœùüûç] \)\([A-ZA-Z0-9àäâæèéëêìòöôœùüûçÀÄÂÆßÈÉËÊÌÖÔŒÙÜÛ] \ + \> \)/ \ U \ 1 \大号\ 2 \ u \ 3 \ L \ 4/gc' – Reman

2
:s/\%V\<\([a-z0-9àäâæèéëêìòöôœùüûç]\)\([A-Za-z0-9àäâæèéëêìòöôœùüûçÀÄÂÆßÈÉËÊÌÖÔŒÙÜÛ]*\)\>/\u\1\L\2/gc 

似乎要做的伎俩,在这里。

因为你已经明确地列入你的第一个字母捕获组在使用范围大写字符,你的模式是要匹配fooFoo。从该范围删除大写字符似乎解决您的直接问题。

+0

Hi romainl,你的解决方案不匹配FOo和FoO或FOO – Reman

+0

@Remonn,“title case”中的一段文字是一段文字,其中*几乎*每个单词以大写字母开头。正如您所问,您的替换现在会跳过已经以大写字母开头的单词。试图处理每一个角落会让你的模式变得更加复杂。如果你补充说,像连词这样的词经常在标题句子句中没有大写,那么你就进入了“功能领域”。 – romainl

+0

@Remonn,你的初始模式分为两部分:第一个字符和所有其他字符。我无法想象一个简单的方法来排除'Foo'而不是'FoO'。 – romainl

相关问题