如何在括号内只选择非标题大小写的单词?

时间:2013-08-07 13:33:13

标签: regex vim case

根据要求,我再次提出了我的问题。

我想将非标题案例更改为括号{}

中所有字词的标题案例

为了意识到我想匹配括号内的所有单词,但我不知道将[^}]放在正则表达式中的位置。

这是我的搜索正则表达式,但它不会在括号内选择单个单词,而是在括号内选择整个文本

/{\s*\zs\(\(\<\w[^}]\+\>\ze\)\s*\)\+}

我的正则表达式错了什么?

如果正则表达式只匹配括号内的非标题大小写单词会更好,但这会使它更加复杂。

2 个答案:

答案 0 :(得分:2)

尝试法线贴图,如:

:noremap tc /{<CR>v%:s/\v%V<(\w)(\w*)>%V/\=toupper( submatch(1) ) . tolower( submatch(2) )/g<CR>/}<CR>

它是如何运作的?

/{<CR> :: 搜索大括号。

v% :: 从当前位置(打开大括号)直到结束时,选择内容。

:s/.../g<CR> :: 替换命令,内部视觉选择(%V)标题 - 单词,分为两组,第一个字母和其余组。

/}<CR> :: 替换命令后,如果光标来自不同的行,其位置设置在行的开头,为避免重复相同文本的地图,请在关闭后设置其位置在后续执行中找到下一对。


我用以下文字进行了测试:

Topic One 
=========

This is some text about topic one.

It has {multiple paragraphs.} more more mroe

Topic Two 
=========

This {is some text about topic} two.  It {has only one} paragraph.

普通模式中执行tc命令三次,产生:

Topic One 
=========

This is some text about topic one.

It has {Multiple Paragraphs.} more more mroe

Topic Two 
=========

This {Is Some Text About Topic} two.  It {Has Only One} paragraph.

答案 1 :(得分:2)

要匹配括号内的单个字词,您不能使用\zs / \ze,因为新匹配只能在上一个字词结束后开始,而\zs / \ze是在计算匹配的开始/结束时不考虑它们(它们仅在计算匹配的文本和放置光标的位置时被考虑)。您应该使用预测和后视:

\%({[^}]*\)\@<=\<\l[^ }]\{-}\>\%([^}]*}\)\@=

。但是要将非标题案例更改为标题案例,则有更简单的方法:而不是尝试构建将匹配大括号内的每个单词的正则表达式分别匹配整个大括号内容并使用嵌套替换:

:s/{\zs.\{-}\ze}/\=substitute(submatch(0), '\<\l', '\U\0', 'g')/g