gpt4 book ai didi

c# - 匹配包含 {word} 但不包含 {2ndword} 的文本

转载 作者:行者123 更新时间:2023-11-28 21:58:28 25 4
gpt4 key购买 nike

我写了一个正则表达式(经过一些很大的帮助 here ),它从 python 文件中过滤所有函数。所以现在,我的老板只想要包含 OpenSession 但不包含 Session.Close() 的函数。

我读了article about Lookarounds , 但老实说,我看了很多遍,还是不习惯。但我认为它普遍缺乏对正则表达式的理解。随便……

我的尝试都失败了,最后一个是:(?is)def\s*(?<name>\w+)\s*\((?<parameter>[^)]+)\)\s*:\s*(?:\r?\n)+(?<body>(?<=OpenSession?).*?(?=Session\.Close?))(?=\r?\ndef|$)

谁能帮我解释一下步骤,以便我从中学习?

最佳答案

获取所有函数然后根据它们是否包含 OpenSession 和不包含 Session.Close()< 来过滤它们肯定会更容易(更具可读性,更易于维护)/。这是可能的。我在这里只关注表达式的 body 部分。为检查是否有 OpenSession 即将到来,我们将其置于 ahead 中。但是前瞻只检查当前位置,所以我们需要允许中间有任意多个字符:

(?=.*OpenSession)

问题是,这会在下一个函数中找到OpenSession。所以我们需要确保 .* 不能超过下一个 def。为此,在使用每个字符之前,我们需要检查它是否标记了 def 的开始(使用另一个 negative lookahead):

(?=(?:(?!def).)*OpenSession)

所以现在模式将不匹配一个函数,如果它不包含 OpenSession。为了排除确实包含 Session.Close 的函数,我们使用了与在前瞻中使用的类似的技巧。我们尝试在不超出 Session.Close 的情况下进入下一个 def:

(?=(?:(?!def).)*OpenSession)(?:(?!Session[.]Close).)*?

原始模式末尾的前瞻将确保您能够以这种方式使用整个函数体。另请注意,通过避免非贪婪重复,您可能会略微提高性能。您也可以通过将 def 添加到第二个 lookahead 来做到这一点:

(?=(?:(?!\r?\ndef).)*OpenSession)(?:(?!Session[.]Close|\r?\ndef).)*

所以表达式看起来像:

(?is)def\s+(?<name>\w+)\s*\((?<parameter>[^)]+)\)\s*:\s*(?:\r?\n)+(?<body>(?=(?:(?!\r?\ndef).)*OpenSession)(?:(?!Session[.]Close|\r?\ndef).)*)(?=\r?\ndef|$)

我不知道你想用 ? 在你的环视结束时完成什么,但他们所做的只是让最后一个字符成为可选的。

另请注意,该模式通常有点危险,因为函数中可能有一个包含 \ndef 的多行字符串,在这种情况下,正则表达式不会返回整个函数。

正如 HamZa 在评论中提到的,您可能希望在每个 OpenSessionSession.Close 周围放置单词边界 \b >def,以免在 getOpenSession()Session.Closeddefine 上出错。

关于c# - 匹配包含 {word} 但不包含 {2ndword} 的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18248115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com