gpt4 book ai didi

RegEx - 匹配分隔符,除非在(嵌套)尖括号内

转载 作者:行者123 更新时间:2023-12-03 15:52:43 25 4
gpt4 key购买 nike

我试图通过命名空间分隔符 . 分割以下内容(Delphi RTTI 输出) :

System.Generics.Collections.TEnumerator<Utils.TPair<System.string,System.string>>

正确的分割应该是[System, Generics, Collections, TEnumerator<Utils.TPair<System.string,System.string>>] .

首先我尝试了否定前瞻 \.(?!\<*[a-zA-Z0-9_.,]*\>) ,但这与 Utils.TPair 中的句点相匹配最左边的System.string 。我可能会补充一点,我有点惊讶它(正确)匹配 Collections.TEnumerator 中的句点。 。我想这证明了我对正则表达式语言的掌握。

所以我尝试通过这样说让它变得“贪婪”:\.(?!\<*[a-zA-Z0-9_.,<>]*\>) ,但随后没有找到匹配项。 (我知道这不是正则表达式通常所说的“贪婪”的意思,但我想不出更合适的描述。)

所以我决定回到从头开始。据我了解,我应该能够使用消极的环视来解决我的情况。特别是:< 之后的任何匹配项可以有效地被忽略。所以我决定 (?<!\<[a-zA-Z0-9_]*)\. 应该可以解决我的问题。事实并非如此。这可能是因为(许多)负向后查找实现不支持可变长度字符串。 (具体来说,PCRE - 这基本上是 Delphi 使用的,显然支持可变长度替代。不过,每个替代都必须在执行时固定。)

因此,我向社区求助。

谁能解释一下这个问题,实际上应该很简单?那就太好了!

最佳答案

尝试这个正则表达式:

\.(?![^.]*[\w_.,]*>)

它的基本意思是:匹配所有 .后面没有 .那是在 > 之前因此在 <> 内。它实际上非常限于您的示例。

参见rubular

消极的lookbehind可以更好地解决这个任务:

(?<!<.{0,1000})\.

表示匹配任意.没有<在它之前。

我在java中尝试过这个并且它有效。 Java 不允许有无限的后向查找,这就是为什么我使用 1000 {0,1000} 的限制而不是* 。不知道PCRE是否支持。

关于RegEx - 匹配分隔符,除非在(嵌套)尖括号内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12461757/

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