在没有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>
等仅用于命名变量word
和anySymbol
是保存特定符号的字符串。在word
中是'w
、-
和"
。在anySymbol
中,它几乎是每个字符MODULE-IDENTITY
是要搜索的关键字anySymbol + @"]*?)
之后的::=
是要查找的第二个关键字
现在,复杂部分出现在MODULE-IDENTITY
之后和::=
之前的部分中,可能会出现::=
,但它们只会出现在双引号"in here"
内。现在我想要的是忽略引号中的::=
,有人知道吗?
基于注释中的regex101链接,我制作了这个regex,它可以匹配""
之外::=
之前""
中::=
的多个实例:
IMPORTS(?<data>(?:[^:"]|:(?!:=)|"[^"]*")*)::=
我不太明白它是如何与你的原始C#代码联系在一起的,但这应该会帮助你走上正轨。基本上是在IMPORTS
:之后这样说的
[^:"]
不是:
或"
的任何字符|
或:(?!:=)
一个不是的:
,后面紧跟着的是:=
(一起形成你不想匹配的::=
(|
或"[^"]*"
一个"
,然后是任何不是"
的东西(但很可能是::=
(,然后是"
整个过程被放入一个可以重复0次或更多次的(?:...)
组中,其结果被捕获为<data>
。
一些一般提示:
- 你可以编辑你的问题,使用它!:(添加regex101链接,添加您开始使用的文本,添加您想要查找的完全匹配(不是描述,而是实际匹配(
- 避免使用
.
而使用负类([^...]
(