首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex表达式-匹配特定字符(多次)并忽略注释

Regex表达式-匹配特定字符(多次)并忽略注释
EN

Stack Overflow用户
提问于 2020-01-22 17:24:49
回答 1查看 111关注 0票数 0

我不是regex的专家,我需要一些帮助来建立一个。

我使用的是Powershell及其regex类型,这是一个C#类,最终目标是读取一个toml文件(底层的示例数据,或者使用这个链接到regex101),在其中我需要:

  • 匹配一些值(“__”之间的值)
  • 忽略评论。(注释以“#”开头)

为了匹配这些值并将它们放入捕获组,以下regex工作:

代码语言:javascript
复制
match the template value (values between "__" ):
__(?<tokenName>[\w\.]+)__

我也想忽略那些评论行,我想出了以下内容:

代码语言:javascript
复制
Ignore lines that start with a comment (even if "#" is preceded by spaces or tabs):
^(?!\s*\t*#).*

当我把它们放在一起时,问题就开始了。

代码语言:javascript
复制
^(?!\s*\t*#).*__(?<tokenName>[\w\.]+)__

该表达式存在以下问题:

  1. 每行最多匹配一次,最后一行(即:在"Prop5 =.“行中)我得到一支而不是两支)
  2. 不考虑行尾的注释(即:"Prop4 =.“行)。有两支火柴而不是一支)

我也试过

代码语言:javascript
复制
add this at the end of the expression, it should stop the match on the first occurrence of the character
[^#]

add this at the beginning, which should check if the matched string has the given char before it and exclude it
(?<!^#)

这是我的数据样本

代码语言:javascript
复制
#templateFile
[Agent]
    Prop1 = "__Data.Agent.Prop1__"
    Prop2 = [__Data.Agent.Prop2__]
    #I'm a comment
    #Prop3 = "__NotUsed__"
    Prop4 = [__Data.Agent.Prop4__] #sample usage comment __Data.Agent.xxx__
    Prop5 = ["__Data.Agent.Prop5a__","__Data.Agent.Prop5b__"]

我认为更容易的解决方案是匹配给定的字符串,只有在同一行的字符串之前没有"#“。有可能吗?

编辑:

@ The -4-bird提出的第一个表达式工作得很好,它只需要指定多行修饰符。最后(可运行的)结果在PowerShell中如下所示。

代码语言:javascript
复制
[regex]$reg = "(?m)(?<!^.*#.*)__(?<tokenName>[\w.]+)__"

$text = '
#templateFile
[Agent]
    Prop1 = "__Data.Agent.Prop1__"
    Prop2 = [__Data.Agent.Prop2__]
    Prop5 = ["__Data.Agent.Prop5a__","__Data.Agent.Prop5b__"]
    #a comment
    #Prop3 = "__Data.Agent.Prop3__"
    Prop4 = [__Data.Agent.Prop4__] #sample usage comment __Data.Agent.xxx__
'

$reg.Matches($text) | Format-Table
#This returns
Groups         Success Name Captures Index Length Value
------         ------- ---- -------- ----- ------ -----
{0, tokenName}    True 0    {0}         31     20 __Data.Agent.Prop1__
{0, tokenName}    True 0    {0}         62     20 __Data.Agent.Prop2__
{0, tokenName}    True 0    {0}         94     21 __Data.Agent.Prop5a__
{0, tokenName}    True 0    {0}        118     21 __Data.Agent.Prop5b__
{0, tokenName}    True 0    {0}        194     20 __Data.Agent.Prop4__
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-22 17:51:25

我认为您可以使用无限重复来检查前面的内容是否包含一个#来解释Prop4中的注释。

代码语言:javascript
复制
(?<!^.*#.*)__(?<tokenName>[\w.]+)__

.Net regex演示

如果Prop4应该有两个匹配项,则可以使用:

代码语言:javascript
复制
(?<!^[ \t]*#.*)__(?<tokenName>[\w.]+)__

.NET regex演示

这两个表达式都需要多行修饰符才能正常工作。它可以通过在开头添加(?m)来内联指定。(或者通过在支持它的构造函数中指定它)

代码语言:javascript
复制
(?m)(?<!^.*#.*)__(?<tokenName>[\w.]+)__
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59865142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档