Чтобы найти совпадения с регулярными выражениями, вы должны использовать классы регулярных выражений.Pattern and Matcher.
String term = "term";
ArrayList<String> a = new ArrayList<String>();
a.add("123term456"); //true
a.add("A123Term5"); //false
a.add("term456"); //true
a.add("123term"); //true
Pattern p = Pattern.compile("^[^A-Za-z]*(" + term + ")[^A-Za-z]*$");
for(String text : a) {
Matcher m = p.matcher(text);
if (m.find()) {
System.out.println("Found: " + m.group(1) );
//since the term you are adding is the second matchable portion, you're looking for group(1)
}
else System.out.println("No match for: " + term);
}
}
В этом примере мы создаем экземпляр https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html для поиска совпадений в тексте, с которым вы сопоставляете.
Обратите внимание, что я немного изменил регулярное выражение.Выбор в этом коде исключает все буквы AZ и строчные версии из начальной совпадающей части.Это также учитывает ситуации, когда нет символов до или после срока матча.Если вам нужно что-то там, используйте +
вместо *
.Я также ограничил регулярное выражение, чтобы заставить совпадение содержать только совпадения для этих трех групп, используя ^
и $
, чтобы проверить конец конца соответствующего текста.Если это не соответствует вашему варианту использования, вам может потребоваться выполнить настройку.
Чтобы продемонстрировать использование этого с различными терминами:
ArrayList<String> terms = new ArrayList<String>();
terms.add("term");
terms.add("the book is on the table");
terms.add("1981 was the best year ever!");
ArrayList<String> a = new ArrayList<String>();
a.add("123term456");
a.add("A123Term5");
a.add("the book is on the table456");
a.add("1@#!231981 was the best year ever!9#");
for (String term: terms) {
Pattern p = Pattern.compile("^[^A-Za-z]*(" + term + ")[^A-Za-z]*$");
for(String text : a) {
Matcher m = p.matcher(text);
if (m.find()) {
System.out.println("Found: " + m.group(1) + " in " + text);
//since the term you are adding is the second matchable portion, you're looking for group(1)
}
else System.out.println("No match for: " + term + " in " + text);
}
}
Вывод для этого: Найдено: терминin 123term456 Нет соответствия для: термин в A123Term5 Нет соответствия для: термин в книге находится в таблице456 ....
В ответ на вопрос о том, что в строковом термине не учитывается регистр, вот способ, которым мы можемсоздайте строку, используя преимущества java.lang.Character
для опций для букв верхнего и нижнего регистра.
String term = "This iS the teRm.";
String matchText = "123This is the term.";
StringBuilder str = new StringBuilder();
str.append("^[^A-Za-z]*(");
for (int i = 0; i < term.length(); i++) {
char c = term.charAt(i);
if (Character.isLetter(c))
str.append("(" + Character.toLowerCase(c) + "|" + Character.toUpperCase(c) + ")");
else str.append(c);
}
str.append(")[^A-Za-z]*$");
System.out.println(str.toString());
Pattern p = Pattern.compile(str.toString());
Matcher m = p.matcher(matchText);
if (m.find()) System.out.println("Found!");
else System.out.println("Not Found!");
Этот код выводит две строки, первая строка - это строка регулярного выражения, которая компилируется в шаблоне."^[^A-Za-z]*((t|T)(h|H)(i|I)(s|S) (i|I)(s|S) (t|T)(h|H)(e|E) (t|T)(e|E)(r|R)(m|M).)[^A-Za-z]*$"
Это скорректированное регулярное выражение позволяет сопоставлять буквы в термине независимо от регистра.Вторая строка вывода "Найдено!"потому что смешанный термин находится в matchText.