如何匹配不形成特定单词的一系列字符?

时间:2014-07-16 22:27:43

标签: regex vim

正则表达式可能无法实现,如果没有,请解释原因,或提供链接。

最终,当/* */评论包含doc标签(例如/** @param value description */)时,我试图修改我的php语法文件以修复故障。即使文档标记在/* */内是良性的,我也希望保持突出显示。

目前,phpDocTags的一个syn match吃掉评论结束标记(* /)。

# vim syntax line
syn match phpDocTags "@\(var\)\s\+\S\+.*" containedin=phpComment

# example php code
/* @var $something 12 34*/

# vim regex match
@var $something 12 34*/

我想用phpDocTags正则表达式中的.*替换表达式,"匹配任何不构成*/"的字符,或者, "匹配任何非*后跟/的字符。"

目前我有一个使用否定前瞻的部分解决方案,但是,它遇到的问题是它与*/之前的字符不匹配。如果空格总是在*/之前,那么这种方法就足够了。

# vim syntax line v2
syn match phpDocTags "@\(vars\)\s\+\S\+\(.\(\*/\)\@!\)*" containedin=phpComment

# same example php code

# vim regex match v2
@var $something 12 3

因此,对于版本2,新表达式显示,"匹配任何不在*/之前的字符。"

请注意,*/可能位于不同的行,因此必须将其视为可选。以下是测试输入的简要列表。

INPUT                                 EXPECTED MATCH
/* @var $something 1234*/             @var $something 1234
/* @var */                            @var      # but prefer no match if possible
/* @var $something 1234               @var $something 1234
/* @var $something 1 / 2 * 34*/       @var $something 1 / 2 * 34

P.S。如果有一个标志我可以添加到phpComment中,从包含的表达式中隐藏*/,请在评论中提及。这个问题的主要焦点是正则表达式,而不是vim的语法框架。

2 个答案:

答案 0 :(得分:2)

@var\s*\S.*\ze\*/
如果*/“要求之后有任何内容,那么

会按照@ Qeole的附加条件执行您的要求。

\ze是标记实际匹配结束的便捷方式,同时仍为正则表达式引擎提供相关规则。

@var\s*\S.*\ze*/

答案 1 :(得分:-1)

此正则表达式与您的目标匹配:

(?<=\/\* )@var [^*].*?(?=\*\/|$)

请参阅针对您的示例输入进行测试的live demo

它也不像你希望的那样与空评论相匹配。

使用:

  • 设置捕捉开始的背后隐藏
  • 一个不情愿的量词,如果在同一行上有进一步的评论(参见演示链接中的示例)
  • 备用(评论的结尾或行尾)向前看以设置捕获结束

向前看不要捕捉任何东西,所以整场比赛(不是小组)是你的目标输入。