从可选模式中获取子字符串

时间:2015-09-27 22:32:21

标签: javascript regex

我正在尝试解析以下网址:

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

其中:

  1. bed-green-big-33-22-ancient-5是1组(过滤器)
  2. --2是第2组[PageNumber],是可选的
  3. 我的正则表达式尝试是:

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

    它可以正确捕获我需要的内容,但最终没有考虑可选的--2

    结果应为:bed-green-big-33-22-ancient-52

2 个答案:

答案 0 :(得分:2)

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

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

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

因此,正则表达式将如下所示:

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

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

JS:

&#13;
&#13;
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;
&#13;
&#13;

答案 1 :(得分:-1)

看看http://regex101.com。它将为您提供正则表达式正在执行的操作以及匹配内容的细分。

因为这是一个非常简单的正则表达式,所以我不会直接给你,因为我想你正在学习正则表达式,但我会给你一些提示让你开始。

您可以使用括号()创建组。考虑一下您需要从何处开始匹配组并将URL与该点匹配,然后启动您的组以提取您的标记字符串。一旦你结束了,你就会得到一个&#34; - &#34;您可以匹配以查找您的页码的第二组的开头。