检测不匹配的字符串

时间:2011-10-14 18:16:01

标签: java regex

我试图弄清楚如何将逗号分隔的字符串作为输入,并检测其中是否有任何与下列集合不匹配的字符串

{FF,SF,FB,SB,暂停}

因此,当我解析字符串(可以是上述的任何组合)时,如果它检测到“FfdsG”,例如它应该抛出错误。我假设我可以使用某种正则表达式来完成这个或一系列ifs。

编辑...

我的实施不好吗?我正在将字符串转换为全部更低然后进行比较。无论我作为输入发送什么(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个有效值的任意组合。它可能是其中之一或全部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);
        }
       }

6 个答案:

答案 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;
}

答案 1 :(得分:1)

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

如果文本与此正则表达式匹配,则它包含错误的值。此正则表达式与任何文本都不匹配,它仅使用断言并检测错误文本开始的位置。 如果你想第一次出现错误的文字:

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

第一个捕获的组将包含它。

答案 2 :(得分:0)

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

假设您已经拆分了逗号分隔的字符串输入,而inputString是该分割数组中的一个元素。

答案 3 :(得分:0)

不确定你想要什么。对于下面的正则表达式,如果所有字符串都是好的,matches()将返回true,如果有一个或多个坏字符串,则返回false。此正则表达式允许在字符串的开头或结尾处有任何数量的空格。此外,将忽略多个逗号。例如,“FF,SF ,,,,,,,, Pause”是匹配。从正则表达式中删除“\ s *”以禁止空格。

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

查看此online regex tool

答案 4 :(得分: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 );
    }
}

答案 5 :(得分: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结束。

因此,只需将逗号分隔的字符串,循环遍历条目并使用匹配器。

或者你可以构建一个更复杂的正则表达式,让你留下逗号并仍然得到所需的输出。在这一点上查看许多不同的正则表达式教程...

请注意,String上的 split 方法可以让您轻松地分隔原始逗号分隔字符串中的离散值。