Java 如何检查字符串是否只包含字母、数字和双反斜杠

Java 如何检查字符串是否只包含字母、数字和双反斜杠,java,regex,Java,Regex,如何编写一个方法来检查字符串是否只包含数字、字母、特定字符(++-/)和双反斜杠(\) 例如: a2b/\-错误 d+sd\\ff-正确 我试过这个: stringExample.matches("^[a-z-A-Z-0-9 +_-/]+"); …但它与双反斜杠(\\)不匹配。\是一个特殊字符。它在正则表达式(转义)中具有功能。这意味着您需要对其进行转义,以便将其捕获为自己的角色 \\将“\”表示为字符这可能有助于: private static void checkdoubleSlash(S

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

例如:

a2b/\
-错误

d+sd\\ff
-正确

我试过这个:

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

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

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

\\将“\”表示为字符

这可能有助于:

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

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

因此,要使表达式只允许这些字符和两组反斜杠,可以使用:

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

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

^[a-z-A-Z-0-9 +_-/]+
因为
\uu-/
被解释为一个范围,但这是无效的。 最好将
-
移到末尾,使其不是一个范围:

^[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/\\"));
}

首先,它是一个双反斜杠,而不是一个双斜杠。您确定要它是双斜杠吗?有些人认为Java字符串literal
“abc\\def“
包含一个双反斜杠,而实际上这只是一个转义符号,而该字符串只包含一个反斜杠。警告您的regexp甚至没有编译您需要将每个反斜杠\w都加倍\w应该是\\w…谢谢您的帮助。”。我最初只是在那里使用了表达式本身,没有调用
matches()
,然后保留了它。