Vim Regex分裂线来自小写字符

时间:2013-12-25 13:16:56

标签: regex vim

我正在尝试从文本中分隔标题,标题和第一段文字是内联的。

<p>GUSLÜN SÜNNETLERİ VE BAZI İNCELİKLERİ Gusle niyet ederek, Besmele ve misvâk ile başlamak. Evvelâ elleri, oyluk yerlerini yıkamak, bedende meni vesâire eseri varsa gidermek.</p>

下面的regex命令只捕获第一个大写单词。我需要明确定义字符集,因为非ascii字符(如Â, Î, Û)。我使用了!而不是正斜杠/

%s!\v(<[ABCÇDEFGĞHIİJKMLMNOÖPRSŞTUÜVYZÎÂÛ]{2,}>{-1,})(.*)$!<h2>\1</h2>\r\r\2!g

例外结果是

<p>
<h2>GUSLÜN SÜNNETLERİ VE BAZI İNCELİKLERİ</h2>

Gusle niyet ederek, Besmele ve misvâk ile başlamak.Evvelâ elleri, oyluk yerlerini yıkamak, bedende meni vesâire eseri varsa gidermek.</p>

提示:查找大写单词的最后一次出现,也可以帮助我。

2 个答案:

答案 0 :(得分:1)

试试这个

%s!\v((<[ABCÇDEFGĞHIİJKMLMNOÖPRSŞTUÜVYZÎÂÛ]{2,}>{-1,}\s*)+)\s+(.*)$!<h2>\1</h2>\r\r\3!g

答案 1 :(得分:1)

什么是“非unicode unicode”?也许你想编辑这个问题?

$中的(.*)$是多余的,因为*是贪婪的。由于您最终将\2放在替换模式的末尾,因此您可以通过不捕获和替换第二部分来简化命令:

:s!<pattern>!<h2>\1</h2>\r\r!

(最后的g标志也是多余的。)

如果您正确设置了'iskeyword',则\k会正确匹配单词字符,但遗憾的是\u会忽略此设置,只能固定地匹配ASCII大写字母。但是您可以将角色类简化为[A-ZÇĞİÖŞÜÎÂÛ](除非排除Q,W和X很重要)。通过这些简化,rednaw的答案变为

:s!\v((<[A-ZÇĞİÖŞÜÎÂÛ]{2,}>{-1,}\s*)+)\s+!<h2>\1</h2>\r\r!

要查找一行中的最后一个大写字词,请尝试

 /\v.*\zs<[A-ZÇĞİÖŞÜÎÂÛ]{2,}

详情请见

:help /\k
:help 'iskeyword'
:help /[]
:help /\zs
:help pattern