为什么这个正则表达式不匹配URL?

时间:2016-11-18 23:28:06

标签: java regex

我有以下正则表达式:

^(?=\w+)(-\w+)(?!\.)

我正在尝试与以下文字进行匹配:

www-test1.examples.com

正则表达式应仅匹配字符串的-test1部分,并且只有在第一个.之前和表达式开始之后才匹配。 www可以是任何字符串,但不应匹配。

我的模式与-test1部分不匹配。我错过了什么?

3 个答案:

答案 0 :(得分:2)

Java是唯一支持非固定长度后视的语言之一(这基本上意味着您可以使用量词),因此您可以在技术上使用以下内容:

(?<=^\w+)(-\w+)

这将匹配-test而不捕获前面的内容。然而,通常不建议使用非固定长度的后视镜,因为它们不完美,也不是非常有效,也不能在其他语言中移植。话虽如此......这是一个简单的模式,所以如果你不关心可移植性,那么一定要去吧。

更好的解决方案是对要捕获的内容进行分组,并引用捕获的组(在本例中为组1):

^\w+(-\w+)

P.S。 - \w与点不匹配,因此无需提前查看。

p.p.s。 - 回答您关于原始模式^(?=\w+)(-\w+)(?!\.)无法匹配的原因的问题。有两个原因:

1)你从一个字符串断言的开始开始,然后使用一个先行来看看后面是一个或多个单词字符。但是前瞻是零宽度断言,这意味着匹配中实际上没有消耗任何字符,因此指针在匹配后不会向前移动到下一个字符。所以它看到&#34; www&#34;匹配它,并移动到模式的下一部分,但实际指针没有超过字符串的开头。因此,它接下来会尝试匹配您的(-\w+)部分。那么你的字符串并不是以&#34; - &#34;开头的。所以模式失败了。

2)(?!\.)是一个负向前瞻。那么你的示例字符串显示一个点作为你的&#34; -test&#34;之后的下一个东西。部分。因此,即使#1没有失败,这也会失败。

答案 1 :(得分:1)

你遇到的问题是前瞻。在这种情况下,如果您想要捕捉-和第一个.之间的内容,那就不合适了。你想要的模式是这样的:

(-\w+)(?=\.)

在这种情况下,捕获组1的内容将包含您想要的文本。

Demo on Regex101

答案 2 :(得分:0)

试试这个:

(?<=www)\-\w+(?=\.)

演示:https://regex101.com/r/xEpno7/1