问题标签 [non-greedy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
65 浏览

regex - RegExp 用于查找重复的完整字符串(两级贪心)

我有一个(可能很复杂)RegExp 问题。从模型生成文件的工具说我的模型使用了两次名称,但没有说明这是哪个名称。我知道所有有问题的名称都以“CK_”开头,然后是一些非空格。我准备了这个测试文件:

如您所见,“CK_123abc”出现了两次。我想用 RegExp 捕捉所有这些(如果有更多的话)。到目前为止我得到了这个:(CK_\S*).+\1

这工作正常并匹配以下文本:

但它也匹配

第二个不需要的匹配是针对CK_1的。由于我的真实文档充满了这些“半字符串”匹配,因此我无法在数据中找到我的真实匹配(如这里的第一个匹配)。我认为(CK_\S*)出于某种原因不是贪婪的 - 或者整个正则表达式是贪婪的。为了使我的用例正常工作,(CK_\S*)必须首先尽可能匹配,然后应该在文档的后面找到相同的匹配。

我正在使用 Notepad++(带有 PCRE)。“。” 匹配"\r""\n"

任何指针都受到高度赞赏。

0 投票
2 回答
4181 浏览

regex - 正则表达式匹配多行字符串以 x 开头,以 y 结尾并包含 z 但中间不包含 x

最好用一个例子来解释。

这是文字:

我想查找以and contains开头<li>和结尾的字符串。我希望只匹配and 。</li>THE WORDS<li> hello THE WORDS </li><li> world THE WORDS </li>

我尝试了什么:(?s)<li>.*?(THE WORDS).*?</li>

有了这个,第二场比赛是<li> cruel </li> <li> world THE WORDS </li>

我正在使用崇高文本。

0 投票
2 回答
122 浏览

regex - 正则表达式获取所有匹配项,包括较小的子匹配项

我有以下输入字符串

并遵循正则表达式:

此正则表达式仅提供以下更大的匹配

如何使用正则表达式来获得较小的匹配?

我尝试使用非贪婪运算符,但它也没有奏效。

是否可以使用 java 或 c# 匹配组或匹配集合作为匹配组?

0 投票
4 回答
929 浏览

python - Non greedy dotall regex in Python

I need to parse annotations of methods written in PHP. I wrote a regex (see simplified example below) to search them but it doesn't work as expected. Instead of matching the shortest part of text between /** and */, it matches the maximum amount of source code (previous methods with annotations). I'm sure I'm using the correct .*? non greedy version of * and I have found no evidence DOTALL turns it off. Where could be the problem, please? Thank you.

0 投票
2 回答
723 浏览

regex - 在正则表达式中使字符范围不贪婪

我有一个消息列表,我在该消息中搜索 4 或 3 位数字,然后将其替换为该数字。

所以我现在的正则表达式是

寻找

代替

但是,问题在于 [0-9]{3,4} 如果有 4 位数字,则只取前 3 位数字,因此即使有 4 位数字序列,它也只会抓取 3 位数字。这是我不想要的。

有没有办法让它抓住一个 4 位数的号码,如果它可以,如果它不能在该行中找到 4 位数的号码,只能抓住一个 3 位数的号码。

谢谢

0 投票
2 回答
1858 浏览

regex - 关于问号“懒惰”模式的正则表达式

我理解?这里的标记意味着“懒惰”。

我的问题本质上是[0-9]{2}?vs[0-9]{2}

他们是一样的吗?
如果是这样,我们为什么要写前一个表达式?惰性模式不是更昂贵的性能吗?
如果不是,你能分辨出区别吗?

0 投票
3 回答
168 浏览

python - 具有重复性的非贪婪正则表达式


我正在使用以下正则表达式:
((FFD8FF).+?((FFD9)(?:(?!FFD8).)*))

我需要使用正则表达式执行以下操作:

  • 寻找FFD8FF
  • 找到下一个FFD9之前的最后一个FFD8FF
  • 最后停止,FFD9之后不包含任何内容
  • 除了在最后一次 FFD9 之后找到并保留任何垃圾之外,我所拥有的可以满足我的需要。我怎样才能让它跳回最后FFD9

    这是我用这个表达式搜索的字符串:

    asdfasdfasasdaFFD8FFasdfalsjdflajsdfljasdfasdfasdfasdfFFD9asdflasdflasdfFFD9asdfasdfFFD8FFasdfalsjdflajsdfljasdfasdfasdfasdfFFD9

    非常感谢你的帮助。

    更多信息:

    我有一个需要搜索的开始值和结束值列表(FFD8FF 和 FFD9 只是一对)。它们在一个列表中。因此,我使用 r.compile 在 for 循环中动态创建表达式,该循环遍历不同的值。我有以下代码,但它返回 0 个匹配项:

    regExp = re.compile("FD8FF(?:[^F]|F(?!FD8FF))*FFD9") matchObj = re.findall(regExp, contents)

    在上面的代码中,我只是尝试使用普通的正则表达式,甚至没有从列表中获取值(看起来像这样):

    regExp = re.compile(typeItem[0] + "(?:[^" + typeItem[0][0] + "]|" + typeItem[0][0] + "(?!" + typeItem[0] + "))*" + typeItem[1])

    任何其他想法为什么没有任何匹配?

    编辑:

    我发现我忘了包括标志。现在包含标志以忽略大小写和多行。我现在有

    regExp = re.compile(typeItem[0] + "(?:[^" + typeItem[0][0] + "]|" + typeItem[0][0] + "(?!" + typeItem[0] + "))*" + typeItem[1],re.M|re.I)

    虽然现在我遇到了内存错误。有什么办法可以提高效率吗?我正在使用表达式搜索数十万行(使用findall上面的表达式)

    0 投票
    2 回答
    237 浏览

    regex - 无法访问非贪婪的.*?

    我的文字是:

    我想选择:

    现在,我可以使用:

    但问题是我不能使用".*?"我正在使用的东西。如果我没有替换(.*?)为!([^0-90-90-9]*)1blaw1

    任何建议,如果相关,我将使用 Stata。

    0 投票
    1 回答
    83 浏览

    regex - Bash:查找字符串并删除它周围的 c-commentary 符号(最好就地编辑)

    我已经为此烦恼了很长时间:我需要匹配文本文件中的字符串并删除它周围的 C 注释。编辑应该就地或进入一个新文件(然后我将移动 mv-command 来推送它)。

    所以字符串很容易找到,但我怎样才能删除评论呢?行数并不总是相等的。我无法弄清楚,因为删除必须是非贪婪的(同一文件中有不应更改的类似数据)并且整体“模式”是多行的。期望的输出:

    我想工作流程应该是这样的:

    找到 string_to_match,先找到前面的 /* 并删除它,然后删除后面的第一个 */。

    如果该解决方案也能自动适用,那就太好了

    非常感谢 Bash 业余爱好者!我在 SED 上没有成功。也欢迎 AWK 解决方案和白痴解释。问候!

    0 投票
    3 回答
    3001 浏览

    javascript - 为什么是一个简单的.*?非贪婪的正则表达式在匹配之前贪婪地包含其他字符?

    我有一个非常简单的正则表达式,类似于:

    HOHO.*?_HO_

    有了这个测试字符串...

    fiwgu_HOHO_HOHO_HOHOrgh_HOHO_feh_HOHO___HO_fbguyev

    • 我希望它只匹配_HOHO___HO_(最短匹配,非贪婪)
    • 相反,它匹配_HOHO_HOHO_HOHOrgh_HOHO_feh_HOHO___HO_(最长匹配,看起来很贪婪)。

    为什么?我怎样才能让它匹配最短的匹配?

    添加和删​​除?给出相同的结果。

    编辑- 更好的测试字符串显示为什么[^HOHO]不起作用:fiwgu_HOHO_HOHO_HOHOrgh_HOHO_feh_HOHO_H_O_H_O_HO_fbguye


    我能想到的只是它可能匹配多次 - 但只有一个匹配_HO_,所以我不明白为什么它不采用以 结尾的最短匹配,而_HO_丢弃其余的。

    我浏览了所有我能找到的标题为“非贪婪正则表达式贪婪”的问题,但它们似乎都有其他问题。