2011-10-14 85 views
0

我試圖找出如何採取一個逗號分隔的字符串作爲輸入,並檢測是否有內部的任何字符串不符合以下一組檢測非匹配字符串

{FF,SF,FB ,SB,Pause}

因此,當我解析字符串(可以是上述的任何組合),如果它檢測到「FfdsG」,例如它應該拋出一個錯誤。我假設我可以使用某種正則表達式來完成這個或一系列if。

編輯....

我的執行不好嗎?我將字符串轉換爲全部,然後進行比較。不管是什麼我送作爲輸入(FB或FB,FF或其他),似乎其萎靡不振的一切都是壞...

`public static String check(String modes) { 
    String s = modes; 
    String lower = s.toLowerCase(); 

     HashSet<String> legalVals = new HashSet<String>(); 

     legalVals.add("ff"); 
     legalVals.add("sf"); 
     legalVals.add("fb"); 
     legalVals.add("sb"); 
     legalVals.add("pause"); 

     String valToCheck = lower; 

     if (legalVals.contains(valToCheck)) { //False 
      String str = modes; 
     } else { 
      return "Bad value: " + modes; 
     } 

     return modes; 
     } 

需要明確的是,輸入的字符串可以是5個有效值的任意組合我列出。它可能是其中的1個或全部5.我只是試圖檢測是否在任何時候檢測到的值不在列出的5上。我希望這是有道理的。


結束了以下。

 String[] words = {"ff", "sf", "fb", "sb", "pause"}; 
     List<String> validList = Arrays.asList(words); 
     String checkInput = lower; 

     for (String value : checkInput.split(",")) 
     {  
     if(!validList.contains(value)) 
     { 
      throw new Exception("Invalid mode specified: " + modes); 
     } 
     } 
+1

你能告訴我們你試過了嗎? –

回答

0

我不是正則表達式的行家,但如果你在每個值單獨看,它可以給你有關如何報告錯誤,更好的控制,並讓你決定拒絕整個輸入或只是刪除無效的條目。

public class InputCleaner 
{ 
    private final static List<String> allowedEntries = Arrays.asList(new String[] { "FF", "SF", "FB", "SB", "Pause" }); 

    public static void main(String[] args) throws Exception 
    { 
     String input = "FF,SF,FB,SB,FF,Pause"; 
     String input2 = "FF,SF,FB,SB,FfdsG,FF,Pause"; 

     validateInput(input); 
     validateInput(input2); 
    } 

    private static void validateInput(String input) throws Exception 
    { 
     for (String value : input.split(",")) 
     {  
      if(!allowedEntries.contains(value)) 
      { 
       throw new Exception("Found a bad input value! " + value); 
      } 
     } 

     System.out.println("Input string clean:" + input); 
    } 
} 
+0

對不起,但「拋出異常」是我見過的最噁心的事情之一。 –

2

您可以將您的合法值在HashSet,例如,和使用contains()方法來檢查,如果一個特定的值是在列表中:

HashSet<String> legalVals = new HashSet<String>(); 

legalVals.add("FF"); 
legalVals.add("SF"); 
//etc 

String valToCheck = "FfdsG"; 

if (legalVals.contains(valToCheck)) { //False 
    print "Value found: " + valToCheck; 
} else { 
    print "Bad value: " + valToCheck; 
} 
+2

我會在'ArrayList'上使用'HashSet'。執行'contains'檢查會更快,特別是對於長長的合法值列表。 – jdmichal

+0

嗯,好點。將編輯。 – andronikus

+0

糟糕,忘記更改代碼部分。謝謝,蒙面陌生人! – andronikus

0
inputString.matches("FF|SF|FB|SB|Pause") 

假設你已經分割了逗號分隔的字符串輸入,並且inputString是該分割數組中的一個元素。

0

不知道你想要什麼。對於下面的正則表達式,如果所有字符串都是好的,則matches()將返回true,如果有一個或多個錯誤的字符串,則返回false。這個正則表達式允許在字符串的開頭或結尾有任意數量的空白。此外,多個逗號被忽略。例如,「FF,SF ,,,,,,,,暫停」是匹配的。刪除正則表達式中的「\ s *」以禁止空格。

(\s*(FF|FB|SF|SB|Pause)\s*,*)+ 

看看這個online regex tool

1
(?<=(^|,))(?!((FF|SF|FB|SB|Pause)(?=(,|$)))) 

如果文本與此正則表達式匹配,那麼它包含錯誤值。這個正則表達式與任何文本都不匹配,它只使用斷言並檢測錯誤文本開始的位置。 如果你想獲得錯誤的文字中第一次出現:

(?<=(?:^|,))(?!(?:(?:FF|SF|FB|SB|Pause)(?=(?:,|$))))([^,]*) 

捕獲的第一組將包含它。

0

是的,Java有良好的正則表達式支持,並且很容易在正則表達式中使用「OR」運算符來完成你想要做的事情。這樣的事情應該說明這一點:

package exp; 

import java.io.Console; 
import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

public class RegexTestHarness { 

    public static void main(String[] args){ 

    Pattern pattern = Pattern.compile("FF|SF|FB|SB|Pause"); 

    Matcher matcher = pattern.matcher("FfdsG"); 

    if (matcher.matches()) { 
     System.out.printf("I found the text \"%s\" starting at " + 
      "index %d and ending at index %d.%n", 
      matcher.group(), matcher.start(), matcher.end()); 
    } 
    else { 
     System.out.printf("No match found.%n"); 
    } 


    matcher = 
     pattern.matcher("FF"); 

     if (matcher.matches()) { 
      System.out.printf("I found the text \"%s\" starting at " + 
       "index %d and ending at index %d.%n", 
       matcher.group(), matcher.start(), matcher.end()); 
     } 
     else { 
      System.out.printf("No match found.%n"); 
     }  


    matcher = 
     pattern.matcher("Pause"); 

     if (matcher.matches()) { 
      System.out.printf("I found the text \"%s\" starting at " + 
       "index %d and ending at index %d.%n", 
       matcher.group(), matcher.start(), matcher.end()); 
     } 
     else { 
      System.out.printf("No match found.%n"); 
     }   

} 

} 

當你運行它,你會得到這樣的輸出:

未找到匹配。

我發現文本「FF」從索引0開始,並在索引2

結束我發現文本「暫停」從索引0開始,並在索引5

因此結束,只需要用逗號分隔的字符串,循環輸入條目並使用匹配器。

或者你也可以構建一個更復雜的正則表達式,它可以讓你離開逗號並仍然得到所需的輸出。檢查很多不同的正則表達式教程的更多關於這一點...

請注意,拆分方法上的字符串將讓你很容易地分離原來的逗號分隔字符串中的離散值。