如何編寫一個方法來檢查字符串是否包含數字,字母,特定字符(+_-/
)並且只有雙反斜槓(\\
)。如何檢查字符串是否只包含字母,數字和雙反斜槓
例如:
a2b/\
- 假
d+sd\\ff
- 真
我嘗試這樣做:
stringExample.matches("^[a-z-A-Z-0-9 +_-/]+");
...但它不匹配一個雙反斜線(\\
) 。
如何編寫一個方法來檢查字符串是否包含數字,字母,特定字符(+_-/
)並且只有雙反斜槓(\\
)。如何檢查字符串是否只包含字母,數字和雙反斜槓
例如:
a2b/\
- 假
d+sd\\ff
- 真
我嘗試這樣做:
stringExample.matches("^[a-z-A-Z-0-9 +_-/]+");
...但它不匹配一個雙反斜線(\\
) 。
由於反斜槓一般用作轉義字符,它們必須escapsed以及通過\\
到表示單斜槓,所以連續的兩個反斜槓將使用\\\\
。
因此,對於你的表達,讓這些字符,只套兩個反斜線,你可以使用:
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()'調用的情況下使用表達式,然後保存它。 –
\是一個特殊字符。它具有正則表達式(轉義)的功能。這意味着你需要逃避它,以便捕獲它作爲自己的角色。
\\將意味着「\」作爲一個字符
這可能幫助:
private static void checkdoubleSlash(String a) {
if(a.contains("\\\\"))
System.out.println("True");
else
System.out.println("False");
}
首先,模式正如你寫的那樣,它不能編譯:
^[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/\\"));
}
首先,它是一個雙反斜線** **,沒有雙斜槓。你確定你希望它是雙重的嗎?有些人認爲Java字符串文字「abc \ def」包含一個雙反斜槓,實際上這只是一個轉義符號,而該字符串只包含一個反斜槓。 – RealSkeptic