#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. недопустимо, если я даю, я надеялся закрепить номер