Обнаружить несоответствующую строку - PullRequest
0 голосов
/ 14 октября 2011

Я пытаюсь выяснить, как взять строку с разделителями-запятыми в качестве входных данных и определить, есть ли в ней строки, которые не соответствуют следующему набору

{FF, SF, FB, SB,Пауза}

Таким образом, когда я анализирую строку (которая может быть любой комбинацией вышеупомянутого), если он обнаруживает, например, «FfdsG», он должен выдать ошибку.Я предполагаю, что могу использовать какое-то регулярное выражение для выполнения этого или серии ifs.

EDIT ....

Моя реализация плоха?Я преобразовываю строку во все нижнее и затем сравниваю.Неважно, что я посылаю в качестве входных данных (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. Я просто пытаюсь определить, обнаружено ли в любое время значение, которое не входит в список 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 ]

2 голосов
/ 14 октября 2011

Вы можете сохранить свои допустимые значения, например, в 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 голос
/ 14 октября 2011
(?<=(^|,))(?!((FF|SF|FB|SB|Pause)(?=(,|$))))

Если текст соответствует этому регулярному выражению, то он содержит неправильное значение. Это регулярное выражение не совпадает ни с одним текстом, оно использует только утверждения и определяет положение, где начинается неправильный текст. Если вы хотите получить в первый раз неправильный текст:

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

первая захваченная группа будет содержать его.

0 голосов
/ 14 октября 2011

Да, Java имеет прекрасную поддержку регулярных выражений, и достаточно просто использовать оператор «ИЛИ» в своем регулярном выражении, чтобы делать то, что вы хотите.Примерно так должно проиллюстрировать точку:

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.

Итак, простовозьмите строку, разделенную запятыми, зацикливайте записи и используйте совпадение.

Или вы, возможно, можете создать еще более сложное регулярное выражение, которое позволит вам оставлять запятые и получать желаемый результат.Посмотрите множество различных руководств по регулярным выражениям, чтобы узнать больше об этом ...

Обратите внимание, что метод split в String позволит вам легко разделять дискретные значения в исходной строке, разделенной запятыми.

0 голосов
/ 14 октября 2011

Я не специалист по регулярным выражениям, но если вы посмотрите на каждое значение по отдельности, это может дать вам гораздо лучший контроль над тем, как сообщать об ошибках, и позволяет вам отклонить весь ввод или просто удалить недопустимую запись.

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 голосов
/ 14 октября 2011

Не уверен, что ты хочешь.Для приведенного ниже регулярного выражения match () вернет true, если все строки хорошие, и false, если есть одна или несколько плохих строк.Это регулярное выражение допускает любое количество пробелов в начале или конце строк.Кроме того, несколько запятых игнорируются.Например, «FF, SF ,,,,,,,, Pause» является совпадением.Удалите «\ s *» из регулярных выражений, чтобы запретить пробелы.

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

Проверьте этот онлайн-инструмент регулярных выражений

0 голосов
/ 14 октября 2011
inputString.matches("FF|SF|FB|SB|Pause")

при условии, что вы уже разбили ввод строки, разделенный запятыми, и inputString - это один элемент в этом массиве разбиения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...