gpt4 book ai didi

regex - 使用非贪婪限定符或前瞻更好吗?

转载 作者:行者123 更新时间:2023-12-04 14:06:57 27 4
gpt4 key购买 nike

我有一个可能很大的文本块来搜索 [[...]] 的实例,其中...可以是任何东西,包括其他括号(尽管它们不能嵌套;]] 之后 [[ 的第一个实例结束匹配)。

我可以想到两种方法来匹配这段文字:

  • 使用非贪婪限定符:/\[\[.+?\]\]/
  • 使用前瞻:/\[\[(?:(?!\]\]).)+\]\]/

  • 从性能的角度来看,一个选择是否本质上比另一个更好(我认为第一个可能更具可读性)?我记得读过最好不要使用非贪婪的限定符,但我现在找不到它的来源。

    最佳答案

    在这种情况下最好使用非贪婪量词。

    以这个例子字符串 "[[a]b]]"
    非贪婪量词

    \[\[.+?\]\]
    原子 #1 2 3 4 5

  • 原子 #1 \[匹配
  • 原子 #2 \[匹配
  • 原子 #3 .+?匹配 "a"
  • 原子 #4 \]匹配
  • 原子 #5 \]失败,回到 #3 但保持字符串位置
  • 原子 #3 .+?匹配 "]"
  • 原子 #4 \]失败,回到 #3 但保持字符串位置
  • 原子 #3 .+?匹配 "b"
  • 原子 #4 \]匹配
  • 原子 #5 \]匹配
  • 成功

  • 展望:

    \[\[(?:(?!\]\]).)+\]\]
    原子 # 1 2 3 4 5 6 7
  • 原子 #1 \[匹配
  • 原子 #2 \[匹配
  • 原子 #4 (?!\]\])"a" 处立即成功(即不匹配) , 继续
  • 原子 #5 .匹配 "a" , 重复 #3
  • 原子 #4 (?!\]\])"]" 实现部分匹配
  • 原子 #4 (?!\]\])"b" 成功(即不匹配) , 继续
  • 原子 #5 .匹配 "]" , 重复 #3
  • 原子 #4 (?!\]\])"b" 处立即成功(即不匹配) , 继续
  • 原子 #5 .匹配 "b" , 重复 #3
  • 原子 #4 (?!\]\])"]" 实现部分匹配
  • 原子 #4 (?!\]\])"]" 实现完全匹配, ergo: #4 失败,退出 #3
  • 原子 #6 \]匹配
  • 原子 #7 \]匹配
  • 成功

  • 所以看起来非贪婪量词要做的工作更少。

    免责声明:这是一个人工示例,实际性能可能会有所不同,具体取决于输入、实际表达式和正则表达式引擎的实现。我只有 98% 的把握确定我在这里概述的是实际发生的情况,因此我愿意进行更正。此外,与所有性能提示一样,不要只看表面值(value),如果您想确定,请进行自己的基准比较。

    关于regex - 使用非贪婪限定符或前瞻更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2975950/

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