gpt4 book ai didi

regex - RegEx-捕获组中OR值的顺序更改结果

转载 作者:行者123 更新时间:2023-12-03 16:04:45 40 4
gpt4 key购买 nike

Visual Studio / XPath / RegEx:

给定表达式:

(?<TheObject>(Car|Car Blue)) +(?<OldState>.+) +---> +(?<NewState>.+)


给定搜索字符串:

Car Blue Flying ---> Crashed


我期望:

TheObject = "Car Blue"
OldState = "Flying"
NewState = "Crashed"


我得到的是:

TheObject = "Car"
OldState = "Blue Flying"
NewState = "Crashed"


鉴于新的RegEx:

(?<TheObject>(Car Blue|Car)) +(?<OldState>.+) +---> +(?<NewState>.+)


结果是(我想要的):

TheObject = "Car Blue"
OldState = "Flying"
NewState = "Crashed"


我从概念上了解了幕后发生的一切; RegEx将在OR'd列表中找到的第一个(从左到右)匹配项放入 <TheObject>组,然后继续。

OR'd列表是在运行时生成的,不能保证将“ Car”或“ Car Blue”添加到 <TheObject>组中的OR'd列表的顺序。 (这是大大简化的OR'd列表)

我可以通过对OR'd列表从最长到最短进行排序来强行使用它,但是,我一直在寻找更优雅的东西。

有没有一种方法可以使 <TheObject>组捕获在OR'd列表中找到的最大列表而不是它找到的第一个? (无需担心订单)

谢谢,

最佳答案

我通常会自动同意ltux之类的答案,但在这种情况下不会如此。

您说交替组是动态生成的。它多久动态生成一次?如果是每个用户的请求,那么对表达式生成对象进行快速排序(首先是最长的长度,或者是反向字母顺序的)可能比编写将(Car|Car Red|Car Blue)转换为(Car( Red| Blue)?)的对象更快。

正则表达式可能会花费更长的时间(您可能甚至不会注意到正则表达式的速度有所不同),但是汇编操作可能会更快(取决于替换列表数据源的体系结构)。

在具有702个选项的简单测试中,在三种方法中,使用这样的选项集可以得到可比的结果,但是这些结果都没有考虑构建字符串的时间,该时间随着字符串的复杂性而增加成长。

选项都是一样的,只是格式不同


扎普


扎普

复印
...
苹果




扎普

复印
...
苹果

复印


扎普

复印
...
苹果

...
苹果


扎普

复印
...
苹果



使用Google Chrome和Javascript,我尝试了三种(编辑:四种)不同的格式,并在0到2毫秒之间看到了一致的结果。


'Optimized factoring'a(?:4|3|2|1)?
Reverse alphabetically sorting (?:a4|a3|a2|a1|a)
Factoring a(?:4)?|a(?:3)?|a(?:2)?|a(?:1)?。所有这些始终以0到2ms的间隔进入(我想这是我的机器目前可能还在做什么)。
更新:我找到了一种方法,可以使用超前like this (?=a|a1|a2|a3|a4|a5)(.{15}|.(14}|.{13}|...|.{2}|.)而不用正则表达式排序,其中15是上限,一直向下计数。


在这种方法上没有任何限制,我觉得它会导致很多问题和误报。这将是我最不喜欢的结果。如果超前匹配,捕获组(.{15}|...)将在任何可能的情况下捕获超出您期望的捕获量。换句话说,它将超越比赛。



尽管与我的因数分解示例相比,我做了术语“优化因式分解”,但是由于任何原因,我都无法推荐我的因数分解示例语法。排序将是最合乎逻辑的,并且比利用前瞻性更易于阅读/维护。

您没有对数据有太多的了解,但是如果子选项可以包含空格并且可能重叠,则可能仍需要进一步对子组或因数进行排序,从而进一步减小“优化因式分解”的值。

编辑:明确地说,我正在就为什么没有在这里获得保理的形式进行彻底的检查。至少没有我能看到的任何方式。一个简单的Array.Sort().Reverse().Join("|")给出了这种情况下任何人的确切需求。

关于regex - RegEx-捕获组中OR值的顺序更改结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42432356/

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