c# - 我可以使用带有前缀条件的正则表达式检测字符位置吗?
问题描述
我有一个代表方程式语句的字符串:a = b * c
在我正在编写的工具中。
该字符串可能包含用于*
表示注释的语句的“注释”后缀。
我正在将 AvalonEdit 用于文本编辑器对象,并尝试编写正确的 XSHD 文件定义以匹配检测注释字符串以进行突出显示。
我不确定这可以通过正则表达式检测到,因为*
char 根据其使用的上下文有两种含义。
例如,
a = b * c
:*
是匹配乘字符,并且没有发出评论信号(没有评论突出显示)abcdef abcd * a comment
:这*
是一个注释字符,字符串a comment
应突出显示为注释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。
有解决办法吗?
解决方案
好吧,这实际上取决于您的语法有多灵活。但是,根据您提供的内容,试试这个:
\*\s?\w( ?[\w]+)+
随意在这里测试它。有了这个,你不需要用空格分隔任何东西,但它会允许空格。我在下面的 regex101 中提供了两条测试线,看看这是否适合您的需要。
推荐阅读
- python - 按频率和值对列表进行排序
- indexing - Keras 嵌入位置信息
- rabbitmq - 具有单个连接对象的 RabbitMQ 多个消费者
- sql - SQL Server:来自 JSON 对象数组的连接字符串
- flutter - 为什么 Flutter ListTile onTap 似乎被缓存了?
- sql-server - ASP.NET Core MVC 接受来自用户的列表并更新与该列表匹配的数据库记录
- php - ImageMagick 动画 GIF 压缩
- asp.net - 由于多对多关系MVC,如何设置链接到关联表的多个复选框的值
- android - 想知道我的架构组件是否正确
- unity3d - 在 Unity 2017 中查找子网格