条件正则表达式:仅返回一个组

时间:2014-07-07 15:33:19

标签: regex

我想要匹配的两种类型的网址:

(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

正如您所看到的,它已经很好地运作了。 由于各种原因,我需要正则表达式只返回一个匹配组。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:3)

的Java / PHP / Python的

使用 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`

的JavaScript

尝试这个并获得索引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)$

Regular expression visualization

Debuggex Demo

然后例如:

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];

之类的操作