【问题标题】:How to check if string contains only letters, numbers and double backslash如何检查字符串是否仅包含字母、数字和双反斜杠
【发布时间】:2016-05-06 18:23:40
【问题描述】:

我如何编写一个方法来检查字符串是否包含数字、字母、特定字符 (+_-/) 和仅双反斜杠 (\\)。

示例:

a2b/\ - 假

d+sd\\ff - 是的

我试过了:

stringExample.matches("^[a-z-A-Z-0-9 +_-/]+");

...但它不匹配双反斜杠 (\\)。

【问题讨论】:

  • 首先,它是双反斜杠,而不是双斜杠。你确定你希望它是双倍的吗?有些人认为 Java 字符串文字 "abc\\def" 包含一个双反斜杠,而实际上这只是一个转义符号,并且该字符串只包含一个反斜杠。

标签: java regex


【解决方案1】:

由于反斜杠通常用作转义字符,它们也必须通过 \\ 转义以表示单个斜杠,因此两个连续的反斜杠将使用 \\\\

因此,为了让您的表达式允许这些字符且仅包含两个反斜杠,您可以使用:

stringExample.matches("^([\\w\\s+\\-/]|(\\\\\\\\))+$");

这可以解释如下:

^             # Beginning of expression
(             # Beginning of group
[\\w\\s+\\-/] # Match any alphanumeric or underscore (\w), space (\s), or +, - or \
|             # OR
(\\\\\\\\)    # An explicit double-slash
)             # End of group
+             # Allow one or more instances of the previous group
$             # End of expression

【讨论】:

  • 警告你的正则表达式甚至不能编译你需要加倍每个反斜杠 \w 应该是 \\w...
  • 谢谢。我最初只是在没有matches() 调用的情况下使用了表达式本身,然后保留了它。
【解决方案2】:

\ 是一个特殊字符。它具有正则表达式(转义)的功能。这意味着您需要对其进行转义才能将其捕获为自己的角色。

\\ 表示 '\' 作为一个字符

【讨论】:

    【解决方案3】:

    这可能会有所帮助:

    private static void checkdoubleSlash(String a) {
            if(a.contains("\\\\"))
                System.out.println("True");
            else
                System.out.println("False");
        }
    

    【讨论】:

      【解决方案4】:

      首先,您编写的模式无法编译:

      ^[a-z-A-Z-0-9 +_-/]+
      

      因为_-/ 被解释为一个范围,但这是无效的。 最好将- 移到最后,使其不是范围:

      ^[a-z-A-Z-0-9 +_/-]+
      

      同时删除重复的-

      ^[a-zA-Z0-9 +_/-]+
      

      接下来,请注意 [...] 用于单个字符。而且你不允许单\,只有双\\,所以这是一个双字符模式。 为此,正则表达式应该是这样的:

      ^([a-zA-Z0-9 +_/-]|double-backslash)+
      

      我在那里写了“双反斜杠,因为这需要一些额外的解释。要写它,不仅仅是\\,因为在Java字符串中你需要转义反斜杠,所以\\\\。在正则表达式中,你需要再次转义它们。所以你需要的最终正则表达式是:

      ^([a-zA-Z0-9 +_/-]|\\\\\\\\)+
      

      通过一些单元测试:

      public boolean testMatch(String s) {
          return s.matches("^([a-zA-Z0-9 +_/-]|\\\\\\\\)+");
      }
      
      @Test
      public void should_match_string_with_double_backslash() {
          assertTrue(testMatch("d+sd\\\\ff"));
      }
      
      @Test
      public void should_not_match_string_with_single_backslash() {
          assertFalse(testMatch("a2b/\\"));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 2014-07-16
        • 2012-06-12
        • 2021-10-01
        • 1970-01-01
        • 2020-12-12
        • 2015-01-04
        相关资源
        最近更新 更多