2012-01-17 68 views
3

我有一串數字,每個數字可以在字符串中顯示爲零或一次。我可以通過RegEx驗證嗎?我可以做一些檢查字符數組的重複項,但寧願堅持我的正常驗證程序。正則表達式:僅允許值一次

下應該返回「匹配」

String thisItemText = "12679"; 
if(!thisItemText.matches("[1245679]*")) { 
    System.out.println("No Match"); 
} else { 
    System.out.println("Match"); 
} 

下應返回「不匹配」(注意雙「2」)

String thisItemText = "122679"; 
if(!thisItemText.matches("[1245679]*")) { 
    System.out.println("No Match"); 
} else { 
    System.out.println("Match"); 
} 
+0

沒有,正則表達式不適用於此。 – leonbloy 2012-01-17 20:42:35

+0

你能解釋一下爲什麼嗎? – Robert 2012-01-17 20:43:58

+0

因爲正則表達式是常規語言的語法規則(如果需要,請參見Sipser的書),而您尋找的不是一個。你必須爲此編寫一個自定義解析器。 – 2012-01-17 20:45:18

回答

7

正則表達式(\d).*\1如果有一個重複的數字匹配。

+1

只有當連續 – leonbloy 2012-01-17 20:55:03

+2

@leonbloy:它會嘗試匹配一個數字,任意數量的字符,然後相同的數字。他們不必連續。 – MRAB 2012-01-17 20:58:41

+0

@leonbloy試試吧[在線](http://www.pythonregex.com/) – 2012-01-17 21:05:59

-1

必須使用(1245679)*,如果你的正則表達式正在尋找完全是數字序列,如果不是,您正在尋找的內容無法使用正則表達式完成,您必須使用自定義分析器。

1

有沒有正則表達式的解決方案,假設字符集爲ASCII

public static boolean isUniqueChars(String str) 
{ 
    boolean[] char_set = new boolean[256]; 
    for (int i = 0; i < str.length(); i++) 
    { 
     int val = str.charAt(i); 
     if (char_set[val]) return false; 
     char_set[val] = true; 
    } 
    return true; 
} 
1

嘗試這種模式:

"(?<=([0-9]))(?:(?!\\1).)*\\1(?!\\1)" 

將匹配任何具有重複數字的字符串。所以,如果它不匹配,那麼它沒有任何重複的數字。

2

以下是你需要的正則表達式:

(?:([1245679])(?!\\1))+ 

下返回 「匹配」

String thisItemText = "12679"; 
if(!thisItemText.matches("(?:([1245679])(?!\\1))+")) { 
    System.out.println("No Match"); 
} else { 
    System.out.println("Match"); 
} 

下返回 「不匹配」

String thisItemText = "122679"; 
if(!thisItemText.matches("(?:([1245679])(?!\\1))+")) { 
    System.out.println("No Match"); 
} else { 
    System.out.println("Match"); 
} 

乾杯