2011-10-14 37 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

因此结束,只需要用逗号分隔的字符串,循环输入条目并使用匹配器。

或者你也可以构建一个更复杂的正则表达式,它可以让你离开逗号并仍然得到所需的输出。检查很多不同的正则表达式教程的更多关于这一点...

请注意,拆分方法上的字符串将让你很容易地分离原来的逗号分隔字符串中的离散值。