如何编写方法来检查字符串是否包含仅数字,字母,特定字符(+_-/
)并且只包含双反斜杠(\\
)。
示例:
a2b/\
- false
d+sd\\ff
- true
我试过了:
stringExample.matches("^[a-z-A-Z-0-9 +_-/]+");
...但它与双反斜杠(\\
)不匹配。
答案 0 :(得分:2)
由于反斜杠通常用作转义字符,因此必须通过\\
转义它们以表示单个斜杠,因此两个连续的反斜杠将使用\\\\
。
因此,对于表达式允许这些字符和仅两个反斜杠的集合,您可以使用:
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
答案 1 :(得分:0)
\是一个特殊的角色。它具有正则表达式(转义)的功能。这意味着您需要将其转义以捕获它本身的角色。
\\将'\'表示为角色
答案 2 :(得分:0)
这可能会有所帮助:
private static void checkdoubleSlash(String a) {
if(a.contains("\\\\"))
System.out.println("True");
else
System.out.println("False");
}
答案 3 :(得分:0)
首先,编写它的模式不会编译:
^[a-z-A-Z-0-9 +_-/]+
因为_-/
被解释为范围,但这无效。
最好将-
移到最后,使其不是范围:
^[a-z-A-Z-0-9 +_/-]+
并删除重复的-
^[a-zA-Z0-9 +_/-]+
接下来,请注意[...]
是针对单个字符的。并且您不允许单\
,只允许加倍\\
,因此这是一个双字符模式。
要实现这一点,正则表达式应该是:
^([a-zA-Z0-9 +_/-]|double-backslash)+
我在那里写了#34;双反斜杠,因为这需要一些额外的解释。要写它,不仅仅是\\
,因为在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/\\"));
}