首页 > 解决方案 > 我可以使用带有前缀条件的正则表达式检测字符位置吗?

问题描述

我有一个代表方程式语句的字符串:a = b * c在我正在编写的工具中。

该字符串可能包含用于*表示注释的语句的“注释”后缀。

我正在将 AvalonEdit 用于文本编辑器对象,并尝试编写正确的 XSHD 文件定义以匹配检测注释字符串以进行突出显示。

我不确定这可以通过正则表达式检测到,因为*char 根据其使用的上下文有两种含义。

例如,

  1. a = b * c:*是匹配乘字符,并且没有发出评论信号(没有评论突出显示)
  2. abcdef abcd * a comment:这*是一个注释字符,字符串a comment应突出显示为注释
  3. a = b * c * a comment:这里第一个*是匹配运算符,但第二个是注释字符......所以字符串a comment应该突出显示为注释

我在 XSHD 文件中尝试了以下评论检测定义:

<Span color="Comment" begin="\*" end="\n" /> 这清楚地解决了第二个示例......但它会错误地设置c为示例 1 下的注释。

然后我尝试<Span color="Comment" begin="^(?!.*=.*\*).*?\*.*" end="\n" />使用否定前瞻方法来解决示例 1,但随后它将整个字符串捕获为示例 2 的注释。

两种定义都无法检测示例 3 场景。

我想知道我的问题是否不能通过正则表达式(如 XSHD 要求)来解决,因为*它有两种不同的含义。

我正在使用 AvalonEdit 5.0.4。

有解决办法吗?

标签: c#regexavalonedit

解决方案


好吧,这实际上取决于您的语法有多灵活。但是,根据您提供的内容,试试这个:

\*\s?\w( ?[\w]+)+

随意在这里测试它。有了这个,你不需要空格分隔任何东西,但它会允许空格。我在下面的 regex101 中提供了两条测试线,看看这是否适合您的需要。


推荐阅读