Java 模式匹配失败,当\&引用;是输入

Java 模式匹配失败,当\&引用;是输入,java,regex,escaping,Java,Regex,Escaping,我的模式是这样的: "^[a-zA-Z0-9_'^&/+-\\.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$" "abc\\@abc" Pattern p = Pattern.compile( "^[a-zA-Z0-9_'^&/+-\\.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$" ); 但当我尝试匹配某个带有反斜杠的内容时,如下所示: "^[a-zA-Z0-9_'

我的模式是这样的:

"^[a-zA-Z0-9_'^&/+-\\.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$"
"abc\\@abc"
Pattern p = Pattern.compile(
    "^[a-zA-Z0-9_'^&/+-\\.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$"
);
但当我尝试匹配某个带有反斜杠的内容时,如下所示:

"^[a-zA-Z0-9_'^&/+-\\.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$"
"abc\\@abc"
Pattern p = Pattern.compile(
    "^[a-zA-Z0-9_'^&/+-\\.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$"
);

…它不匹配。有人能解释一下原因吗?

试着用额外的反斜杠转义测试字符串的每个反斜杠:例如

“abc\\\@abc”
变成了
“abc\\\\@abc”

试试下面的模式

"^[a-zA-Z0-9_'^&/+-\\\\.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$";

表达式\\匹配一个反斜杠\

如果希望最终结果看起来像
“\\\”
,则需要使用
“\\\\”

为什么,你问? Java编译器看到字符串
“\\\\”
,并将其转换为
“\\\”
,因为
“\”
是一个转义字符

之后,正则表达式看到字符串
“\\”
,并将其转换为
“\”
,因为
“\”
是转义字符


因此,要想得到一个反斜杠,必须加上四个。

我假设您正在用Java源代码编写正则表达式,如下所示:

"^[a-zA-Z0-9_'^&/+-\\.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$"
"abc\\@abc"
Pattern p = Pattern.compile(
    "^[a-zA-Z0-9_'^&/+-\\.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$"
);
我还假设您的意思是将
\\.
表示为后跟一个点的反斜杠,而不是转义点

因为它是一个字符串文本,所以必须再次转义反斜杠。这意味着您必须在正则表达式中使用四个反斜杠来匹配目标字符串中的一个反斜杠。您还需要转义
-
(连字符),这样正则表达式编译器就不会(例如)认为
[+-.]
是一个类似
[0-9]
[a-z]
的范围表达式

"^[a-zA-Z0-9_'^&/+\\\\.-]+@[a-zA-Z0-9_'^&/+.-]+$"

我还把你的
{1,}
改为
+
,因为它的意思是一样的,并且去掉了
{1,1}
,因为它什么都不做。我改变了你的
&
&
。我不知道这是怎么回事,但如果你在源代码中这样写的话,那就错了。

你使用哪种语言?很抱歉之前没有提到。我相信问题中的第二个字符串是他试图匹配的示例,而不是正则表达式。这就是为什么我恢复了以前的编辑器删除的引号,以减少歧义。当我使用您的第一个选项时,输入中会多次接受“@”,而根据模式,它应该只接受一次。