2016-05-06 49 views
2

如何編寫一個方法來檢查字符串是否包含數字,字母,特定字符(+_-/)並且只有雙反斜槓(\\)。如何檢查字符串是否只包含字母,數字和雙反斜槓

例如:

a2b/\ - 假

d+sd\\ff - 真

我嘗試這樣做:

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

...但它不匹配一個雙反斜線(\\) 。

+0

首先,它是一個雙反斜線** **,沒有雙斜槓。你確定你希望它是雙重的嗎?有些人認爲Java字符串文字「abc \ def」包含一個雙反斜槓,實際上這只是一個轉義符號,而該字符串只包含一個反斜槓。 – RealSkeptic

回答

2

由於反斜槓一般用作轉義字符,它們必須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 
+0

警告你的正則表達式甚至不會編譯你需要加倍每個反斜槓\ w應該是\\ w ... –

+0

謝謝你。我最初只是在沒有'matches()'調用的情況下使用表達式,然後保存它。 –

0

\是一個特殊字符。它具有正則表達式(轉義)的功能。這意味着你需要逃避它,以便捕獲它作爲自己的角色。

\\將意味着「\」作爲一個字符

0

這可能幫助:

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

首先,模式正如你寫的那樣,它不能編譯:

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