【问题标题】:Pattern Matching failed when "\" is input输入“\”时模式匹配失败
【发布时间】:2013-09-18 08:32:40
【问题描述】:

我的模式是这样的:

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

但是当我尝试匹配带有反斜杠的东西时,像这样:

"abc\\@abc"

...不匹配。谁能解释一下为什么?

【问题讨论】:

  • 您使用哪种语言?
  • 抱歉之前没有提到。它的 Java。

标签: java regex escaping


【解决方案1】:

尝试以下模式

"^[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,}$";

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

【讨论】:

  • 当我使用你的第一个选项时,“@”在输入中被多次接受,而根据模式它应该只接受一次。
【解决方案2】:

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

"abc\\\\@abc" 变为 "abc\\\\\\\\@abc"

【讨论】:

  • 我相信问题中的第二个字符串是他试图匹配的一个例子,而不是一个正则表达式。这就是为什么我恢复了早期编辑删除的引号,以减少歧义。
【解决方案3】:

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

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

之后正则表达式看到字符串"\\"并将其转换为"\",因为"\"是一个转义字符。

所以想要一个反斜杠,你必须输入四个。

【讨论】:

    【解决方案4】:

    我假设您正在 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},因为它没有任何作用。我将您的& 更改为&。我不知道它是怎么进来的,但如果你在源代码中这样写,那就错了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 2012-07-03
      • 1970-01-01
      相关资源
      最近更新 更多