在没有lookaheads/lookbehinds的情况下,C#中有什么复杂的正则表达式可以完成?如果不是这样的话

本文关键字:正则表达式 这样的话 如果不 复杂 lookaheads lookbehinds 情况下 什么 | 更新日期: 2023-09-27 18:14:36

这是我在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"内。现在我想要的是忽略引号中的::=,有人知道吗?

在没有lookaheads/lookbehinds的情况下,C#中有什么复杂的正则表达式可以完成?如果不是这样的话

基于注释中的regex101链接,我制作了这个regex,它可以匹配""之外::=之前""::=的多个实例:

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

我不太明白它是如何与你的原始C#代码联系在一起的,但这应该会帮助你走上正轨。基本上是在IMPORTS:之后这样说的

  • [^:"]不是:"的任何字符
  • |
  • :(?!:=)一个不是:,后面紧跟着的是:=(一起形成你不想匹配的::=(
  • |
  • "[^"]*"一个",然后是任何不是"的东西(但很可能是::=(,然后是"

整个过程被放入一个可以重复0次或更多次的(?:...)组中,其结果被捕获为<data>

一些一般提示:

  • 你可以编辑你的问题,使用它!:(添加regex101链接,添加您开始使用的文本,添加您想要查找的完全匹配(不是描述,而是实际匹配(
  • 避免使用.而使用负类([^...](