当前位置: 首页 > 知识库问答 >
问题:

Regex在一个可选字符串上匹配non-greedy而在另一个字符串上匹配greedy

苏昂雄
2023-03-14

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

/abc/foo/bar(/*) 

/abc/foo/bar/stop

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

^(/.*[^/])/*$
/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)

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

共有1个答案

匡玉堂
2023-03-14

试试看:

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

Regex101演示

说明:

    null
/^.+?(?=\/*$|\/+stop\b)/
    null
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 

*/
 类似资料:
  • 我想解析一个字符串,看看它是匹配整个字符串还是子字符串。我试过这个: 但我的问题是:

  • 我面临着与Java的匹配器的其他问题。我试图使用正则表达式匹配我的JSON的内容,而不使用外部库。我的JSON看起来像这样: 但是,我只想匹配上半部分中的单词,即在第一个匹配。我试图创建一个新的模式和匹配器,但我不知道如何进行,也不知道如何在第一次出现

  • 例如,我们有一个字符串:asd/asd/asd/1#s_ 我需要匹配以下部分:/asd/1#s_或asd/1#s_如何使用普通正则表达式? 我试过像这样的消极前瞻,但它不起作用 它匹配这个“前缀/asd/1#s_”,我需要匹配“/asd/1#s_”中的这个“/asd/1#”,我需要匹配“/asd/1#s_”,而没有所有前面的 /asd/'s 匹配应该与普通正则表达式没有任何编程语言的任何帮助函数h

  • 问题 你想要匹配两个或多个字符串。 解决方案 计算把一个字符串转换成另一个字符串所需的编辑距离或操作数。 levenshtein = (str1, str2) -> l1 = str1.length l2 = str2.length prevDist = [0..l2] nextDist = [0..l2] for i in [1..l1] by 1

  • 问题内容: 我试图用来匹配包含两个不同字符串的行。我尝试了以下内容,但是这匹配包含 string1 或 string2的 行,而不是我想要的行。 那么,如何只与包含 两个字符串 的行匹配? 问题答案: 您可以使用 要么,

  • 我正在处理一个关于codingbat的问题,这个问题说:给定一个字符串和第二个“单词”字符串,我们会说这个单词匹配字符串,如果它出现在字符串的前面,除了它的第一个字符不需要完全匹配...在匹配时,返回字符串的前面,或以其他方式返回空字符串。所以,所以用字符串“河马”,“嗨”这个词返回“嗨”,“xip”返回“臀部”。单词长度至少为1。我不能解决它,但在网上找到了一个解决方案,代码如下所示。代码工作,