我有以下正则表达式:
^(?=\w+)(-\w+)(?!\.)
我正在尝试与以下文字进行匹配:
www-test1.examples.com
正则表达式应仅匹配字符串的-test1
部分,并且只有在第一个.
之前和表达式开始之后才匹配。 www
可以是任何字符串,但不应匹配。
我的模式与-test1
部分不匹配。我错过了什么?
答案 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的内容将包含您想要的文本。
答案 2 :(得分:0)