Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用.NET正则表达式查找所有特殊标记_.net_Regex_Vb.net_String Formatting - Fatal编程技术网

使用.NET正则表达式查找所有特殊标记

使用.NET正则表达式查找所有特殊标记,.net,regex,vb.net,string-formatting,.net,Regex,Vb.net,String Formatting,使用正则表达式,我需要收集有效的顶级令牌{…},并忽略带引号的字符串“…”(包括可能的“)内的令牌边界 简化样本: TEXT{bbbbb}TEXT{cccc{dddddd}TEXT{eeee{ff{gg}hh}ii{jj}“kk}{ll”“mm{nn}”oo{pppp}TEXT 预计有3个匹配项: {bbbbb} {cccc{dddddd} {eeee{ff{gg}hh{ii{jj}“kk}{ll”“mm{nn}”oo{pppp} 请注意,忽略字符串“kk}{{{}ll”“mm{nn}”的内容

使用正则表达式,我需要收集有效的顶级令牌
{…}
,并忽略带引号的字符串
“…”
(包括可能的
)内的令牌边界

简化样本:

TEXT{bbbbb}TEXT{cccc{dddddd}TEXT{eeee{ff{gg}hh}ii{jj}“kk}{ll”“mm{nn}”oo{pppp}TEXT

预计有3个匹配项:

  • {bbbbb}
  • {cccc{dddddd}
  • {eeee{ff{gg}hh{ii{jj}“kk}{ll”“mm{nn}”oo{pppp}

    请注意,忽略字符串
    “kk}{{{}ll”“mm{nn}”
    的内容
  • 每个令牌应遵循以下语法:

    '{'[a1]['|'[a2| c1]('='|''''')c2]['|'c3['|'c4]]]}'

    其中,
    aX
    是简单的正则表达式(
    (,-?\d+(:*):*)
    )和
    cX
    可以包含匹配的
    {
    -
    }
    ,纯文本和字符串
    “…”
    ,其中的特殊字符如
    {/code>,
    被视为纯文本

    我不理解这个正则表达式中需要的平衡和逃逸。对于相对初学者来说可能太难了

    其他详情: 我已经完成了部分解决方案,我的问题是平衡和引用

    我正在尝试将
    输入中包含的扩展标记创建为字符串,该字符串类似于,但也允许条件计算。例如,在文件名模板中使用这些标记,用户可以在批处理中配置文件名的自定义部分。标记具有字母数字名称和格式部分(包括可选条件、真部分和假部分)。格式化部分可以是:

    • “本机格式”-如
      String.format()
      所述,但使用字母数字名称代替占位符
      {0}
      {1}
      {2}
      ,…
      正则表达式是
      (,-?\d+(:.*)?:.*)

      .
      示例:
      ,3
      (转换为标准
      {0,3}

      :d
      (转换为标准
      {0:d}

      -3:d
      (转换为标准
      {0,-3:d}

    • “复杂格式”-本机格式,
      或者使用固定的文本
      {0}
      作为字符串
      ..{0}…

      正则表达式是:
      ”(“
      &nativeFormatSpec&
      ”|*({0.*}.*)”

      .
      示例:
      -4:d
      (仅本机格式)
      前缀{0,-4:d}&再次将{0}后缀
      转换为
      ..
      String.Format(“prefix{0,-4:d}”和}}}一次“more{0}后缀”,value)

    现在,有效令牌的整个语法是:

    '{'[quickFormat]['|'[complexFmt1]('='|''')值][complexFmt2 |[complexFmt3]]'}'

    我的代码使用了许多命名组,但正则表达式可能太简单了:

    ”***匹配令牌名称(稍后用作match.Group(groupName))
    Const tokenGroup As String=NameOf(tokenGroup)
    Const compareFormatGroup As String=NameOf(compareFormatGroup)
    常量quickFormatGroup As String=NameOf(quickFormatGroup)
    常量compareOperatorGroup As String=NameOf(compareOperatorGroup)
    Const compareValueGroup As String=NameOf(compareValueGroup)
    Const defaultFormatGroup As String=NameOf(defaultFormatGroup)
    常量elseFormatGroup As String=NameOf(elseFormatGroup)
    '***子模式
    Const nativeFormatSpec As String=“(,-?\d+(:.*));:.*”
    Const complexFormatSpec As String=“(”&nativeFormatSpec&“|.*({0.}.*))”值允许一个标记{0}多次
    Dim matches As MatchCollection=Regex.matches(输入,
    $“\{{(?{Regex.Escape(token)})({nativeFormatSpec}?”&
    $“(\\\;(?{complexFormatSpec}))?(?=!=?)(?*)”&
    $“(\\\;(?{complexFormatSpec})(\\\\;({complexFormatSpec}))?)?\}”)
    
    根据您的简化数据,以下是处理提取的正则表达式:

    \{(?>(?:"[^"]*(?:""[^"]*)*"|[^{}]+)|\{(?<n>)|\}(?<-n>))*(?(n)(?!))\}
    
    \{(?>(?:“[^”]*(?:“[^”]*)*“[^{}]+)\{(?)\{(?)\{(?)*(?(n)(?!)\}
    


    这基本上是一个平衡的大括号正则表达式,与类似VB.NET的字符串文字匹配正则表达式
    “[^”]*(?:“[^”]*)*”
    。请注意,在查找成对大括号(带引号的字符串和非大括号)时,实际上忽略了这一部分-
    (?:“[^”]*(?:“[^”]+)
    .

    对于此类数据,您最好使用自定义解析器。@Shar1er80–了解正则表达式,我知道它仍然在其合理范围内,因为语法中没有任何奇怪之处。我只是需要在这方面有更多技能的人的帮助。答案中显示的解决方案简单有效。非常感谢&+1。在样本,我已经忘记了忽略问题字符的功能,忘记了忽略问题字符的功能,忘记了样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我忘记了功能,忘记了忽略问题字符的功能,忽略了问题字符的功能,有问题字符<代码,代码,代码,我的样本,我的忘忘了功能,有问题字符<代码,有问题字符<代码,代码,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的样本,我的忘了功能,忘记了功能,忘记了功能,忘记了功能,忽略了了有有问题字符,有问题字符<代码,有问题字符<代码,有问题字符<代码<<<代码,代码,代码,代码,代码<<<<代码<代码,代码,代码,代码,代码,代码,代码,代码,代码,代码,代码,代码,我的样本,我}ll“mm{nn}”oo{pppp}TEXT}{{pppp}{TEXT
    (预期与之前的3次相同。)我试图增强您的正则表达式,但我找不到如何添加上述忽略引用内容的部分。我可以向您寻求其他帮助吗?如果您愿意,我还可以为其发布单独的问题。.使用
    .Groups(1).Value
    。谢谢,我正在从中学习。更新的正则表达式实际上与添加的引用部分匹配,而不是忽略它们,但是,当以编程方式检查匹配时,很容易忽略它们。这种方法是有效解决这类问题的常用方法之一吗?(现在我看到您对
    组(1)的编辑).Value
    。它回答了
    :)
    )匹配和不捕获您不需要的内容,以及匹配和捕获您需要的内容是一种有效的正则表达式技术,如中所述。