当前位置: 首页 > 知识库问答 >
问题:

vim-模式仅匹配文字字符串的第一个字符

熊朝
2023-03-14

我正在尝试编写一个模式,该模式将只匹配按字面解释的字符串的第一个字符(可以是任何字符,也可以是空白)。

给定这个函数,它使用“非常没有魔力”来匹配作为参数给出的字符串,然后高亮显示该字符串,我如何修改它,使它只高亮显示第一个字符?

function! MatchFirst(i)
  highlight Red ctermbg=red ctermfg=0 guibg=#ff0000 guifg=#000000
  call matchadd('Red', '\V' . escape(a:i, '\'))
endfunction

例如,在下面的文本中调用MatchFirst('{^(se'),只会在{后面跟着*(se,而不是在任何其他地方突出显示{。目前,它突出显示整个给定字符串{^(se

Lorem ipsum do{^(lor sit amet, consecte ur adipiscing elit, e{^(se do eiusmod temor interdidunt ut labore et dolore magna aliqua.这是一个非常小的问题,当然也可以锻炼身体。在rep{^(rehenderit在Vilit esse Cillum dolore EU fugiat nulla pariatur.例外的情况下,不存在,必须在错误的地方,在错误的地方,莫利特和其他地方。

稍后编辑

为了提供一点上下文信息,MatchFirst函数的参数是用户可视选择的文本,因此它可以是任何内容,可以是foobarfoo\ze\bar


共有1个答案

邢皓
2023-03-14

在Vim模式中仅选择匹配的一部分的最简单方法是使用\ze标记匹配结束。有关详细信息,请参见:help/\ze

您可以直接在“非常正常”模式下使用\ze。您可以在:help/\V下找到:

使用\V意味着在它之后,只有反斜杠和终止字符(通常是/)具有特殊含义:“非常正常”

因为\ze已经以反斜杠开始,所以您根本不需要修改它,它就可以在\V下工作。

在您的{^(se示例中,您可以使用\V{\ze^(se来匹配第一个{,但仅当它是{^(se的一部分时。

把它们都放在你的函数中,你可以使用:

call matchadd('Red',
    \ '\V' .  escape(strcharpart(a:i, 0, 1), '\') .
    \ '\ze' . escape(strcharpart(a:i, 1), '\'))

注意:您可能会遇到这样一种情况,a:i是一个空字符串,在这种情况下,您可能需要执行一些不同的操作。

 类似资料:
  • 我有一根这样的绳子 余额:“5048543747”,余额:“5119341413”,帐号:“0001000918”, 我使用了REGEX (.*?), 结果我收到的第一个子字符串是 余额:“5048543747” 实际上,我想要得到的结果是数组包括 { 余额:“5048543747” Baldefovd:“5119341413” 账号:“0001000918” } 有人能帮我吗。多谢。 编辑 我使

  • 我正在处理一个关于codingbat的问题,这个问题说:给定一个字符串和第二个“单词”字符串,我们会说这个单词匹配字符串,如果它出现在字符串的前面,除了它的第一个字符不需要完全匹配...在匹配时,返回字符串的前面,或以其他方式返回空字符串。所以,所以用字符串“河马”,“嗨”这个词返回“嗨”,“xip”返回“臀部”。单词长度至少为1。我不能解决它,但在网上找到了一个解决方案,代码如下所示。代码工作,

  • 问题内容: 我想在输入字符串中搜索给定的字符串模式。 例如 现在,我需要搜索字符串URL是否包含“ ”。请帮我。 这是一个例子。实际上,我需要检查URL是否包含匹配“ / {a-zA-Z0-9} /”的字符串。 问题答案: 您可以为此使用类。如果您只想在中匹配单词字符,则可以使用以下正则表达式。是的简写。如果您可以,请使用或。

  • 我面临着与Java的匹配器的其他问题。我试图使用正则表达式匹配我的JSON的内容,而不使用外部库。我的JSON看起来像这样: 但是,我只想匹配上半部分中的单词,即在第一个匹配。我试图创建一个新的模式和匹配器,但我不知道如何进行,也不知道如何在第一次出现

  • 我对正则表达式是新手。 以下是我到目前为止在C#中所做的工作 显然,这并不违反所有指定的规则。有人能给点提示吗?

  • 问题内容: 我想获得正则表达式的第一场比赛。 在这种情况下,我得到了一个列表: [‘33’,‘44’] 我可以提取列表的第一个元素: ‘33’ 但这仅在至少有一个匹配项的情况下有效,否则我将收到错误消息: IndexError:列表索引超出范围 在这种情况下,我可以定义一个函数: 是否有一种无需定义新功能即可获得该结果的方法? 问题答案: 您可以通过添加默认值到您的正则表达式中: 也可以与其他人指