【发布时间】:2013-09-18 08:32:40
【问题描述】:
我的模式是这样的:
"^[a-zA-Z0-9_'^&/+-\\.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$"
但是当我尝试匹配带有反斜杠的东西时,像这样:
"abc\\@abc"
...不匹配。谁能解释一下为什么?
【问题讨论】:
-
您使用哪种语言?
-
抱歉之前没有提到。它的 Java。
我的模式是这样的:
"^[a-zA-Z0-9_'^&/+-\\.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$"
但是当我尝试匹配带有反斜杠的东西时,像这样:
"abc\\@abc"
...不匹配。谁能解释一下为什么?
【问题讨论】:
尝试以下模式
"^[a-zA-Z0-9_'^&/+-\\\\.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$";
或
"^[a-zA-Z0-9_'^&/+-\\{0,}}.]{1,}@{1,1}[a-zA-Z0-9_'^&/+-.]{1,}$";
表达式 \\ 匹配单个反斜杠 \
【讨论】:
尝试使用额外的反斜杠转义测试字符串的每个反斜杠:例如
"abc\\\\@abc" 变为 "abc\\\\\\\\@abc"
【讨论】:
如果您希望最终结果看起来像"\",则需要使用"\\\\"
你问为什么?
Java 编译器看到字符串"\\\\" 并将其转换为"\\",因为"\" 是一个转义字符。
之后正则表达式看到字符串"\\"并将其转换为"\",因为"\"是一个转义字符。
所以想要一个反斜杠,你必须输入四个。
【讨论】:
我假设您正在 Java 源代码中编写正则表达式,如下所示:
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},因为它没有任何作用。我将您的& 更改为&。我不知道它是怎么进来的,但如果你在源代码中这样写,那就错了。
【讨论】: