2015-03-31 96 views
0

考慮到示例字符串「hello」,我需要一個用於驗證用戶輸入的表達式(現有字母的任意組合;不重複使用的字母)。子字符串或完全匹配的正則表達式

在這種情況下有效和無效輸入例子如下:

有效的:「你好」,「地獄」,「笑」 ......等

無效:「腳跟」,「廁所」 ......等等

我已經試過的喜歡...

(.)*([hello])(.)* 

[hello]+ 

但是,他們不排序無效的。

任何幫助,將不勝感激謝謝。

注意:這不只是子串或完全匹配,每個例子,字母的組合是有效的。

+1

爲什麼'lol'有效的條目? – 2015-03-31 15:43:12

+0

好吧,我希望用戶能夠從給定的字母組合中創建任何單詞 – kfcobrien 2015-03-31 15:51:07

+0

解釋有效和無效答案中的變體,並強化語言以提供完整的問題。 – rfornal 2015-03-31 18:42:43

回答

0

正則表達式不是正確的工具......它們應該用於從左到右匹配,不按隨機順序計算各種字符。你最好有一個驗證字符串hello,循環輸入字符串中的每個字符,並檢查字符是否存在(如果是,則從驗證字符串中移除該字符並繼續,否則輸入失敗)。

這裏是一個quick example I whipped up in Java

public static boolean testString(String testString) 
{ 
    String allowedCharacters = "hello"; 

    for(int i = 0; i < testString.length(); i++) { 
     int position = allowedCharacters.indexOf(testString.charAt(i)); 

     if(position == -1) { 
      System.out.println(testString + " - fail"); 
      return false; 
     } else { 
      allowedCharacters = allowedCharacters.substring(0, position) 
           + allowedCharacters.substring(position + 1); 
     } 
    } 


    System.out.println(testString + " - success"); 
    return true; 
} 

與調用示例輸出功能:

testString("hello"); // hello - success 
testString("hell"); // hell - success 
testString("lol"); // lol - success 

testString("heel"); // heel - fail 
testString("loo"); // loo - fail 
+0

非常感謝山姆,我希望可能會有短暫的小表情。我有一個和你的解決方案非常相似的解決方案,所以我想我會保持原樣。再次感謝您的輸入 – kfcobrien 2015-03-31 16:17:33

+0

這可能有一個表達式,但不會太短。並且可能會變得非常低效並且讓開發人員難以閱讀/編輯。我會堅持使用可重用的功能:) – Sam 2015-03-31 16:47:28

+0

謝謝山姆,會做:) – kfcobrien 2015-03-31 17:06:30