正则表达式在TitleCase中转换单词

时间:2012-12-21 13:41:42

标签: regex vim case

我使用此正则表达式转换TitleCase中的单词并确认每个替换:

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

然而,这也与已经在Titlecase中的词语相符。

是否有人知道如何更改上述正则表达式以跳过已经在TitleCase中的单词?

2 个答案:

答案 0 :(得分:2)

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

似乎可以解决这个问题。

由于您在第一个字母捕获组中使用的范围内明确包含大写字符,因此您的模式将匹配 foo { {1}}。从该范围中删除大写字符似乎可以解决您当前的问题。

答案 1 :(得分: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;四个中只有两个永远不是空的)