Как проверить, содержится ли конкретное слово из списка строк в строке, но оно не должно быть между любыми другими словами?

#java #arrays #regex #string #stream

#java #массивы #регулярное выражение #строка #поток

Вопрос:

Мне нужно проверить, совпадает ли какая-либо строка из списка строк полностью (поиск по всему слову) во входной строке, т.Е. Она не должна совпадать со словом между символами. например, проверьте код ниже:

 String input = "i was hoping the number";
String[] valid = new String[] { "nip", "pin" };
if (Arrays.stream(valid).anyMatch(input::contains)) {
    System.out.println("valid");
}
  

Мой вывод valid , который неверен. Он извлекает pin строку из hoping слова. Я должен иметь возможность сопоставлять, только если pin слово является отдельным.

Комментарии:

1. Можете ли вы добавить таблицу с несколькими примерами того, что должно совпадать, а что не должно совпадать и почему?

2. Значения, которые должны быть сопоставлены {«pin», «code»,»card»}

3. существует более 2 сотен строк входных данных, поэтому я извлекаю все входные данные и проверяю, есть ли эти слова, они не должны присутствовать между любыми другими символами, такими как pin, присутствующими в hooping, они должны быть отдельными

4. Для этого вам нужно использовать регулярное выражение

Ответ №1:

Сделайте это следующим образом:

 import java.util.Arrays;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String input = "i was hoping the number";
        String[] valid = new String[] { "nip", "pin" };
        if (Arrays.stream(valid).anyMatch(p -> Pattern.compile("\b"   p   "\b").matcher(input).find())) {
            System.out.println("valid");
        }
    }
}
  

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

Еще несколько тестов:

 import java.util.Arrays;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String[] testStrings = { "i was hoping the number", "my pin is 123", "the word, turnip ends with nip",
                "turnip is a vegetable" };
        String[] valid = new String[] { "nip", "pin" };
        for (String input : testStrings) {
            if (Arrays.stream(valid).anyMatch(p -> Pattern.compile("\b"   p   "\b").matcher(input).find())) {
                System.out.println(input   " => "   "valid");
            } else {
                System.out.println(input   " => "   "invalid");
            }
        }
    }
}
  

Вывод:

 i was hoping the number => invalid
my pin is 123 => valid
the word, turnip ends with nip => valid
turnip is a vegetable => invalid
  

Решение без использования Stream API:

 import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String input = "i was hoping the number";
        String[] valid = new String[] { "nip", "pin" };
        for (String toBeMatched : valid) {
            if (Pattern.compile("\b"   toBeMatched   "\b").matcher(input).find()) {
                System.out.println("valid");
            }
        }
    }
}
  

Комментарии:

1. Привет, если я даю equals, он проверяет всю входную строку, но ключевое слово pin находится где-то в строке, поэтому для допустимых сценариев я ничего не получаю. пожалуйста, помогите

2. Он должен проверять вывод keword в strong, но не между символами

3. например: мой pin-код равен 1234, он действителен

4. надеюсь, 1234 неверно

5. недопустимо, если я даю, я надеялся закрепить номер