gpt4 book ai didi

正则表达式在一个可选字符串上匹配非贪婪,在另一个可选字符串上匹配贪婪

转载 作者:行者123 更新时间:2023-12-04 15:11:05 25 4
gpt4 key购买 nike

我已经研究了一段时间,但没有找到匹配以下模式的线索(不过,我对正则表达式也很陌生),它看起来像

/abc/foo/bar(/*) 

或者
/abc/foo/bar/stop

所以我想将上面的字符串匹配并捕获为/abc/foo/bar。现在“/stop”是一个可选的字符串,可以附加在模式的末尾。目标是获得所需的捕获,同时忽略存在的“停止”(如果“停止”存在多次,则在第一个“停止”处停止),同时在中间允许尽可能多的斜线,但末尾的斜线除外线。

如果我只是这样做:
^(/.*[^/])/*$

在我删除可能的最后一次出现之前,包含所有斜杠是贪婪的;但是为了接受第二种情况,我有一个可选的“/stop”,我需要以非贪婪的方式进行匹配,直到找到第一个可能的“/stop”并在那里停止。

如何制作一个匹配两种情况的正则表达式?

编辑:不确定我之前的例子是否不够清楚。尝试提供更多信息,比如我想在以下所有字符串中匹配和捕获“/abc/foo/bar”:
/abc/foo/bar
/abc/foo/bar/
/abc/foo/bar///
/abc/foo/bar/stop
/abc/foo/bar/stop/foo/bar/stop/stop
/abc/foo/bar//stop

虽然它不符合以下任何一项:
/abc/foo/bar/sto (will match the whole "/abc/foo/bar/sto" instead)
/abc/foo/bar/abc/foo/bar (it will catch "/abc/foo/bar/abc/foo/bar" instead)

让我知道这是否足够清楚。谢谢!

最佳答案

尝试这个:

/^(?:\/+(?!$|(?:stop\/?))[^\/]+)*/

Regex101 Demo

解释:

这匹配字符串的开头 ( ^ ),后跟以下模式的零个或多个实例:
  • 一个或多个斜线( \/+ )后面没有跟在字符串的末尾( $ )或 stop ,其次是
  • 一个或多个非斜杠字符 ( [^\/]+ )

  • Regular expression visualization

    这是一个 Debuggex Demo与工作单元测试。

    编辑:这是一个替代的,可以说是更简单的正则表达式:
    /^.+?(?=\/*$|\/+stop\b)/

    这以非贪婪的方式匹配一个或多个字符,然后在匹配之后的任何内容是以下之一时停止:
  • 字符串的结尾 ( $ ),前面可能有一个或多个斜杠 ( \/* )
  • 一个或多个斜线,单词 stop 和单词 break。

  • 这是一个 Regex101 demo这个选项。

    编辑 2:如果您想对此进行测试,这里有一个简单的 JavaScript 测试,它针对各种测试字符串测试上面的第二个正则表达式并将结果记录到控制台:
    var re = /^.+?(?=\/*$|\/+stop\b)/,
    test_strings = ["/abc/foo/bar",
    "/abc/foo/bar/",
    "/abc/foo/bar///",
    "/abc/foo/bar/stop",
    "/abc/foo/bar/stop/foo/bar/stop/stop",
    "/abc/foo/bar//stop",
    "/abc/foo/bar/sto",
    "/abc/foo/bar/abc/foo/bar"];
    for(var s = 0; s < test_strings.length; s++) {
    console.log(test_strings[s].match(re)[0]);
    }

    /*
    Results:

    /abc/foo/bar
    /abc/foo/bar
    /abc/foo/bar
    /abc/foo/bar
    /abc/foo/bar
    /abc/foo/bar
    /abc/foo/bar/sto
    /abc/foo/bar/abc/foo/bar

    */

    关于正则表达式在一个可选字符串上匹配非贪婪,在另一个可选字符串上匹配贪婪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24703696/

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