我想要匹配的两种类型的网址:
(1) www.test.de/type1/12345/this-is-a-title.html
(2) www.test.de/category/another-title-oh-yes.html
在第一种类型中,我想匹配“12345”。 在第二种类型中,我想匹配“category / another-title-oh-yes”。
以下是我提出的建议:
(?:(?:\.de\/type1\/([\d]*)\/)|\.de\/([\S]+)\.html)
返回以下内容:
对于类型(1):
Match group 1: 12345
Match group 2:
对于类型(2):
Match group:
Match group 2: category/another-title-oh-yes
正如您所看到的,它已经很好地运作了。 由于各种原因,我需要正则表达式只返回一个匹配组。有没有办法实现这个目标?
答案 0 :(得分:3)
使用 Negative Lookahead 和 Positive Lookbehind 获取索引1处的匹配组。
((?<=\.de\/type1\/)\d+|(?<=\.de\/)(?!type1)[^\.]+)
有两个正则表达式模式是ORed。
第一个正则表达式模式查找12345
第二个正则表达式模式查找category/another-title-oh-yes
。
注意:
将整个正则表达式结合在括号(...|...)
中,并从[^\.]+
和\d+
中删除括号,其中:
[^\.]+ find anything until dot is found
\d+ find one or more digits
以下是regex101
上的在线演示输入:
www.test.de/type1/12345/this-is-a-title.html
www.test.de/category/another-title-oh-yes.html
输出:
MATCH 1
1. [18-23] `12345`
MATCH 2
1. [57-86] `category/another-title-oh-yes`
尝试这个并获得索引2处的匹配组。
((?:\.de\/type1\/)(\d+)|(?:\.de\/)(?!type1)([^\.]+))
以下是regex101上的在线演示。
输入:
www.test.de/type1/12345/this-is-a-title.html
www.test.de/category/another-title-oh-yes.html
输出:
MATCH 1
1. `.de/type1/12345`
2. `12345`
MATCH 2
1. `.de/category/another-title-oh-yes`
2. `category/another-title-oh-yes`
答案 1 :(得分:1)
也许这个:
^www\.test\.de/(type1/(.*)\.|(.*)\.html)$
然后例如:
var str = "www.test.de/type1/12345/this-is-a-title.html"
var regex = /^www\.test\.de/(type1/(.*)\.|(.*)\.html)$/
console.log(str.match(regex))
这将输出一个数组,第一个元素是字符串,第二个元素是网站地址之后的内容,第三个是根据type1匹配的内容,第四个元素是其余元素。
您可以执行var matches = str.match(regex); return matches[2] || matches[3];