为什么Java正则表达式匹配下划线?
我试图为任何数量的为什么Java正则表达式匹配下划线?,java,regex,url,Java,Regex,Url,我试图为任何数量的字符串匹配URL模式string.string.。第一次尝试使用^([^\\W\+.)([^\\W\+.)$,它可以匹配两个连续的模式。但是,当我将它推广到^([^\\W\]+)+$时,它停止工作,并匹配错误的模式“string.stru”。 您知道第二个版本有什么不正确吗?使用^([^\\W_]+)([^\\W_]+)$可以将任意两个单词与受限字符集进行匹配。尽管您没有逃过,但只要第一个单词首先匹配字符串,然后匹配任何文字(这就是unescaped的意思),然后再匹配字符串,
字符串匹配URL模式string.string.
。
第一次尝试使用^([^\\W\+.)([^\\W\+.)$
,它可以匹配两个连续的模式。但是,当我将它推广到^([^\\W\]+)+$
时,它停止工作,并匹配错误的模式“string.stru”。
您知道第二个版本有什么不正确吗?使用^([^\\W_]+)([^\\W_]+)$
可以将任意两个单词与受限字符集进行匹配。尽管您没有逃过
,但只要第一个单词首先匹配字符串,然后匹配任何文字(这就是unescaped
的意思),然后再匹配字符串,它仍然有效
在后一种情况下,未缩放点(
)是捕获组的一部分,至少出现一次(因为您使用+
),因此它允许任何字符作为除数。换句话说,string.stru.
被理解为:
字符串
作为第一个单词
str
作为第二个单词
ing
作为第三个单词
。。。只要未缩放点(
)允许任何除数(字面上的
和
)
转义点以使正则表达式按预期()工作:
你需要逃离你的恐惧。字符,否则它将匹配任何字符,包括\
^([^\\W_]+\.?)+$
这可能是您的通用正则表达式[^\W]似乎是一个奇怪的选择-它与“非单词字符”匹配。我还没有想清楚,但听起来好像它相当于\w,即匹配一个单词字符
无论哪种方式,使用^\W和\W,您都会要求匹配下划线-这就是它将字符串与下划线匹配的原因。“单词字符”是大写字母、小写字母、数字、和下划线
您可能需要[a-z]+或[a-Za-z0-9]+请转义
,因为它是元字符。\w
也包含下划线。另外,由于几年前URL可能包含Unicode字母。不,它不包含。[]
的内容表示除/
以外的任何内容都是字面意义上的(/
)。\W
(无论如何它应该是\W
)不能作为[a-zA-Z0-9\]
的快捷方式,因为最初的两个反斜杠(\`)有自己的含义,
W//code>W`字符保持不被替换。这三个字母应该包括在内才能生效(小写字母w
)。给定的正则表达式中没有斜杠,只有反斜杠。我假设\\只是单个\的Java源代码语法。否则,表达式就很奇怪了-[^\\W\]+匹配除反斜杠、W和下划线之外的字符串。这很可能会给出所看到的结果,但这似乎不是一个有用的解析,我怀疑这是有意的。
^([^\\W_]+\.?)+$