正则表达式中的 ^ 和 $ 分别表示字符串的开头和结尾。

7
"\\w+@\\w+[.]\\w+"和"^\\w+@\\w+[.]\\w+$"有什么区别?我已经尝试在谷歌上搜索,但没有找到答案。"

你在https://regex101.com/上尝试过你的字符串和正则表达式吗? - Charlie Parker
2个回答

16

^ 表示“匹配字符串的开头”(确切地说,是在字符串中第一个字符之前的位置,因此它不会匹配实际的字符)。

$ 表示“匹配字符串的结尾”(即字符串中最后一个字符之后的位置)。

这两个符号都被称为锚点,可以确保匹配整个字符串而不仅仅是一个子字符串。

因此,在您的例子中,第一个正则表达式将匹配email@address.com.uk,但匹配的文本将是email@address.com,可能不是您预期的结果。而第二个正则表达式将会失败。

请注意,一些正则表达式实现会隐式地将正则表达式锚定在字符串的开头/结尾(例如 Java 的.matches(),如果您使用它)。

如果设置了多行选项(使用(?m)标记,或通过Pattern.compile("^\\w+@\\w+[.]\\w+$", Pattern.MULTILINE)进行设置),则^$也会匹配一行的开头和结尾。


如果我理解正确,那么字符串"email@address.com.uk"与"\w+@\w+[.]\w+"完全匹配,但与"^\w+@\w+[.]\w+$"不匹配?但是我在Java中测试了这个字符串,发现两种情况都失败了。我仍然看不出明显的区别。您能根据我的情况说明一下吗? - ipkiss
你的正则表达式只允许在@符号后面有一个点。尝试使用 ^[\\w.]+@[\\w.]+\\.\\w+$。它仍然不完美(没有任何正则表达式可以完全匹配电子邮件地址),但是它更加宽容一些。 - Tim Pietzcker
是的,根据您的答案,字符串“email@address.com.uk”将与“\w+@\w+[.]\w+”匹配,但不会与“^\w+@\w+[.]\w+$”匹配。这段代码:String s =“email@address.com.uk”; System.out.println(s.matches(“\w+@\w+[.]\w+”)); => false - ipkiss
你是否仔细阅读了我的回答?Java的.matches()方法会隐式地为你的正则表达式添加锚点! - Tim Pietzcker

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接