Vim 是不是有等效于 \X 来匹配 Unicode“字素簇”?
Posted
技术标签:
【中文标题】Vim 是不是有等效于 \\X 来匹配 Unicode“字素簇”?【英文标题】:Does Vim have an equivalent to \X to match Unicode "grapheme clusters"?Vim 是否有等效于 \X 来匹配 Unicode“字素簇”? 【发布时间】:2012-06-11 12:50:15 【问题描述】:Unicode 指定\X
should match an "extened grapheme cluster" - 例如一个基本字符后跟零个或多个组合字符。 (我相信这是一种简化,但可能足以满足我的需要。)
我很确定至少 Perl 在其常规表达式中支持 \X
。
但是 Vim 定义 \X
来匹配一个非十六进制数字。
Vim 是否有任何等同于 \X
或任何方式来匹配 Unicode 扩展字素簇?
Vim 确实有组合或“组合”字符的概念,但its documentation 并未说明正则表达式是否支持或如何支持它们。
似乎 Vim 还没有直接支持这一点,但我仍然对一种解决方法感兴趣,在这种解决方法中,搜索将突出显示所有字符,其中包括至少在 U+0300
到 U+0364
的最基本范围内的组合字符。
【问题讨论】:
你到底想做什么?你能提供一个样例吗?您要匹配 à 或 Æ 这样的“字符”吗? 我将编写一些 javascript 代码来在格鲁吉亚语言字符和各种官方和临时音译方案之间进行转换。一些这样的字符可能涉及组合字符,所以我想确保我的工具能够使用它们,包括告诉我我在野外找到并粘贴的哪些文本包含这些字符。 例如,我可能需要处理J̌
(004a 030c
)。但更一般地说,我只想知道 Vim 是否已经或计划对此提供支持,因为我们程序员必须处理此类事情变得越来越普遍。
您的示例与/\%u004a\%u030c\Z
匹配。如果你想突出所有可能的组合,你必须想出一个非常大的模式。好处是它可能会以“最小”的努力移植到 JS。何,凯尔的回答非常翔实。
@romainl:事实上,我的示例也仅与 \%u030c
匹配,但是当我尝试使用 [\u0300-\u0364]
将模式从 COMBINING CARON
扩展到整个 Combining Diacritical Marks
范围时,什么都没有不再匹配!
【参考方案1】:
您可以搜索所有字符并忽略使用\Z
组成的字符。或者,您可以搜索一系列 Unicode 字符。阅读:help /[]
了解更多信息。
这里的最后一篇文章可能会提供更多帮助:
http://vim.1045645.n5.nabble.com/using-regexp-to-search-for-Unicode-code-points-and-properties-td1190333.html
但是 Vim 的正则表达式没有像 Perl 这样的字符类。
【讨论】:
虽然\Z
很有趣,但它并没有做 OP 想要的,即匹配,例如004a 030c
但不只是004a
,虽然这不是从问题文本中直接清楚的,而是从 cmets 中的“告诉我哪个文本......包含这样的字符”中明确。
我明白了。我希望有人能够将\Z
与\[]
结合起来得出答案。我曾尝试过\[\Z^\w]
,但没有奏效。 @romainl 能够更进一步,但我们还没有完全做到。【参考方案2】:
如果你的 vim 安装是用perl support 编译的,你也许可以运行:
:perldo s/\X/replacement/g
我在 debian 上安装了 vim-nox
(它包含 perl 支持),并且将 \X
与 perldo
匹配确实有效,但我不确定它会满足你的要求,因为所有普通字符也是匹配,而且 perldo
似乎不会让您在 vim 中突出显示。
虽然它并不完美,但如果您可以获得 perl 支持,则可以使用 unicode 块和类别。这意味着您可以使用\pBlock: Combining_Diacritical_Marks
或\pCategory: Nonspacing_Mark
至少检测某些字符,尽管您仍然不会突出显示。
【讨论】:
我实际上在 Windows 上也有 gVim,所以也不支持 Perl。事实上,我现在只想搜索并突出显示这些字符,而不是替换它们。 感谢您努力了解可能发生的事情! @hippietrail 我在“windows”(wine)上有 vim 和 gvim,可以说它与草莓 perl 配合得很好。虽然我自己编译了它,但之前使用了来自tuxproject 的vim,它也适用于草莓perl。您需要与项目页面上列出的版本相同的 perl 版本。 还要注意,使用 python 或 perl 来突出显示这些字符并非不可能,但它的代码要多得多,而且(如果您需要随着文本的变化不断更新突出显示)非常,非常慢。如果您不需要更新并且在以某种方式编辑文本后突出显示消失(或变得错误)很好,那就慢一点。在后一种情况下,除非文本很大,否则您不太可能提及速度缓慢。以上是关于Vim 是不是有等效于 \X 来匹配 Unicode“字素簇”?的主要内容,如果未能解决你的问题,请参考以下文章
Elixir/Erlang 中的命名函数是不是有等效于 __MODULE__ 的方法?
Itertools 等效于嵌套循环“for x in xs: for y in ys...”
是否有 Python 等效于正则表达式的 Perl "/x" 修饰符?