C#中的一些复杂的正则表达式可以在没有前瞻/外观的情况下完成吗?如果不是如何与他们?

时间:2014-07-24 06:26:11

标签: c# regex

这是我目前在C#中的正则表达式

"(?<name>" + word + @"[ \n]+MODULE-IDENTITY(?<data>[" + anySymbol + @"]*?)::=[ \n]*\{[ \n]*" + "(?<parent>" + word + " " + "(?<oid>" + word

以下是对所有内容的解释,它并不复杂:

  • ?<name>?<data>等仅用于命名变量
  • wordanySymbol是保存特定符号的字符串。在word \w-"。在anySymbol,它几​​乎是每个角色。
  • MODULE-IDENTITY是搜索
  • 的关键字
  • ::=之后的anySymbol + @"]*?)是第二个要查找的关键字

现在复杂的部分来自MODULE-IDENTITY之后和::=之前的部分,可能会出现::=,但它们只出现在双引号"in here"内。现在我想要的是忽略那些::=引号内的任何人都有想法?

1 个答案:

答案 0 :(得分:2)

根据评论中的regex101链接,我制作了此正则表达式,可以匹配::= ""之外的::=中的""的多个实例:

IMPORTS(?<data>(?:[^:"]|:(?!:=)|"[^"]*")*)::=

我不太了解它与原始C#代码的关系,但这可以帮助您走上正确的道路。基本上它是在IMPORTS之后说的:

  • [^:"] 不是 :"
  • 的任何字符
  • |
  • :(?!:=) : 不是 跟随<{em} :=(一起制作::=你不想匹配)
  • |
  • "[^"]*"一个"后跟任何不是"的内容(但很可能是::=),然后是"

整个事情不是放在(?:...)组中,可以重复0次或更多次,其结果被捕获为<data>

一些一般提示:

  • 您可以编辑您的问题,使用它! :)添加regex101链接,添加您开始使用的文字,添加您要查找的完全匹配项(不是说明,但实际匹配)
  • 避免使用.支持使用否定类([^...]