正则表达式模式跳过模式并匹配另一个模式

时间:2014-08-13 17:24:05

标签: regex

我有以下字符串值:

https://<host_name>/path/object.svc/path1/path2|https://<host_name>/path/xyz.svc/path3/path4.

object.svc始终固定在字符串中,但部分xyz.svc是可变的。例如,在第二种情况下,字符串值将是

https://<host_name>/path/object.svc/path1/path2|https://<host_name>/path/abcd.svc/path3/path4.

我想要一个我可以使用的通用正则表达式模式,以便我想跳过object.svc并且只选择xyz.svcabcd.svc等。基本上我想要的正则表达式查找不是.svc的所有object.svc

有人建议如何做到这一点吗?

1 个答案:

答案 0 :(得分:2)

如果您不使用Javascript,可以使用向后看 (?<!object),例如:\w+(?<!object)\.svc

Online Demo

如果仍然希望匹配包含“sobject”之类的对象的单词,例如,您可以将 \b 添加到后面的表达式中,如:\w+(?<!\bobject)\.svc,这将是强制仅匹配单词object.svc

请注意 \w 会匹配[a-zA-Z0-9_],如果仅排除数字或排除_,则可能需要更改\ w与[a-zA-Z0-9]

正确地突出显示并由 @AlanMoore注释:

前瞻也会起作用:\b(?!object\.svc\b)\w+\.svc\b。但是,正如您所说,我们无法知道\w+是否正确,这意味着\b可能也不正确。最好使用周围的斜杠来锚定匹配项,并使用捕获组来检索它:/((?!object\.svc/)[^/]+\.svc)/