【问题标题】:Regarding regex whitespace关于正则表达式空格
【发布时间】:2015-02-06 22:32:50
【问题描述】:

我有一个关于在 java 正则表达式中表示空间的小问题。

我想限制名称,为此我定义了一个模式

Pattern DISPLAY_NAME_PATTERN = compile("^[a-zA-Z0-9_\\.!~*()=+$,-\s]{3,20}$");

但 eclipse 将其指示为错误“无效的转义序列”。根据

,它是为“\s”说的

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

是一个有效的预定义类。

我错过了什么。谁能帮我解决一下。

提前致谢。

【问题讨论】:

  • 然后我在线程“main”中遇到异常 java.lang.ExceptionInInitializerError 原因:java.util.regex.PatternSyntaxException: Illegal character range near index 25 ^[a-zA-Z0-9_\ .!~*()=+$,-\s]{3,20}$
  • @JoelBrewer 不,只逃避并不能解决他的问题。
  • @AvinashRaj 啊。我明白了:)

标签: java regex


【解决方案1】:

您需要再转义一次\s 中的\。而且,您不需要在字符类中转义 .。字符类中的.\\. 匹配文字点。

Pattern DISPLAY_NAME_PATTERN = Pattern.compile("^[a-zA-Z0-9_.!~*()=+$,\\s-]{3,20}$");

并且还将- 放在字符类的第一个或最后一个。因为位于字符类中心的- 可以充当范围运算符。 regex.PatternSyntaxException: Illegal character range 异常主要是因为这个问题,,\\s 之间不存在范围

如果要进行反斜杠匹配,则需要准确地转义 3 次。

Pattern DISPLAY_NAME_PATTERN = Pattern.compile("^[a-zA-Z0-9_.\\\\!~*()=+$,\\s-]{3,20}$");

例子:

System.out.println("foo-bar bar8998~*foo".matches("[a-zA-Z0-9_.\\\\!~*()=+$,\\s-]{3,20}"));   // true
System.out.println("fo".matches("[a-zA-Z0-9_.\\\\!~*()=+$,\\s-]{3,20}"));  // false

【讨论】:

  • 现在这很奇怪,当我最后移动 "^[a-zA-Z0-9_.!~*()=+$,-\\s]{3,20}$"我遇到了异常,但如果我把它移到中间,那么它工作正常。你有什么想法
  • 你遇到了什么异常?您需要将 charcater 类中的 - 从同一字符类本身的中间移动到最后一个。
猜你喜欢
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多