从可选模式获取子字符串

Get substring from an optional pattern

本文关键字:字符串 获取 模式      更新时间:2023-09-26

我正在尝试解析以下URL:

http://localhost:30001/catalog/search?tags=bed-green-big-33-22-ancient-5--2

地点:

  1. bed-green-big-33-22-ancient-5 is 1 Group (filters)
  2. --2是组2 [PageNumber]和它是可选的

我的regex尝试是:

 tags=(.*)--('d*)

它的工作原理,因为它捕获了我所需要的,但它没有考虑到可选的--2在最后。

结果应为:bed-green-big-33-22-ancient-5, 2

让我们考虑一个简单的单正则表达式方法。

由于您的字符串在查询字符串中,您可能需要注意参数边界(&和初始?),并在模式开始时使用[&?]。现在,.*将匹配所有内容,即使你有超过1个参数。为了确保匹配与-分隔的组,但在&之后不会过度匹配,您可以使用否定的字符类 [^&-]

接下来要考虑的是可选部分--<NUMBER>。您需要对字符进行分组,并将?量词应用于该组,使其成为"可选的"一次(?表示匹配1或0次)。为了使我们的匹配结果更清晰,建议使用非捕获组。

所以,正则表达式看起来像:

[&?]tags=([^&-]*(?:-[^&-]+)*)(?:--('d+))?
  ^      |     Main         ||    ^Grp2^| 
 Start   |   capture        ||          |
boundary |    group         || Optional |

请参阅regex demo(由于这是一个多行演示,因此添加了'n)。

JS:

var re = /[&?]tgs=([^&'n-]*(?:-[^&'n-]+)*)(?:--('d+))?/; 
var str = 'http://localhost:30001/catalog/search?tags=bed-green-big-33-22-ancient-5--2';
var m = str.match(re);
if (m !== null) {
    document.getElementById("r").innerHTML = "First part: <b>" + m[1] + "</b><br/>Second part: <b>" + m[2] + "</b>";
}
<div id="r"/>

看看http://regex101.com。它会给你一个分解,你的正则表达式正在做什么,以及它匹配什么。

由于这是一个相当简单的正则表达式,我不打算直接给你,因为我认为你正在学习正则表达式,但我会给你一些提示,让你开始。

可以使用括号()创建组。考虑一下您需要从哪里开始匹配一个组,并匹配到该点的URL,然后启动您的组以提取您的标签字符串。一旦你找到了结尾,你就有了一个"——",你可以用它来匹配你的页码的第二组的开始。