我正在尝试解析以下网址:
http://localhost:30001/catalog/search?tags=bed-green-big-33-22-ancient-5--2
其中:
bed-green-big-33-22-ancient-5
是1组(过滤器)--2
是第2组[PageNumber],是可选的 我的正则表达式尝试是:
tags=(.*)--(\d*)
它可以正确捕获我需要的内容,但最终没有考虑可选的--2
。
结果应为:bed-green-big-33-22-ancient-5
,2
。
答案 0 :(得分:2)
让我们考虑一种简单的单正则表达式方法。
由于您的字符串位于查询字符串中,您可能需要注意参数边界(&
和初始?
)并在模式开始时使用[&?]
。现在,即使你有超过1个参数,.*
也会匹配所有内容。为了确保您匹配使用-
分隔但未在&
之后超匹配的群组,您可以使用否定字符类 [^&-]
接下来要考虑的是可选部分--<NUMBER>
。您需要对字符进行分组并将?
量词应用于该组以使其成为&#34;可选&#34;一次(?
表示匹配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>";
}
&#13;
<div id="r"/>
&#13;
答案 1 :(得分:-1)
看看http://regex101.com。它将为您提供正则表达式正在执行的操作以及匹配内容的细分。
因为这是一个非常简单的正则表达式,所以我不会直接给你,因为我想你正在学习正则表达式,但我会给你一些提示让你开始。
您可以使用括号()创建组。考虑一下您需要从何处开始匹配组并将URL与该点匹配,然后启动您的组以提取您的标记字符串。一旦你结束了,你就会得到一个&#34; - &#34;您可以匹配以查找您的页码的第二组的开头。