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()
,然后保留了它。