В наши дни на локальном компьютере и на стороне сервера у разработчиков есть огромные текстовые данные. Java предоставляет разработчикам мощный метод сопоставления шаблонов. Но регулярное выражение шаблона Java – очень сложная ветвь для использования.
В этом посте мы увидим, что функция поиска текста основана на подстановочном ключевом слове.
Пример функции заключается в том, что получение всех объектов файла сопоставляется с ключевыми словами с подстановочными знаками в списке.
Давайте погрузимся в
Сценарий
Наш конкретный сценарий заключается в том, чтобы “Получить все исходные файлы java, соответствующие подстановочному ключевому слову. мы должны сделать так, чтобы нас видели совпадающими с номером строки и путем к файлу из стандартного ввода-вывода (терминала)”.
Шаг 1 – Создайте шаблон подстановочных знаков.
Чтобы создать регулярное выражение, необходимо настроить ключевое слово с подстановочным знаком для шаблона регулярных выражений Java.
If wildcard expression is like *static*, Java regex should be .*\Qstaic\E.* And if wildcard expression is like *st*ic , Java regex must be .*\Qst\E.*\Qic\E.*
Чтобы сделать это, используйте Java-код, как показано ниже.
String keyword = "...*...*..
String regex = Arrays.asList(keyword.split(Pattern.quote("*"))).stream().map(s -> s.equals("") ? "" : Pattern.quote(s)).collect(Collectors.joining(".*"))+".*"
Шаг 2 – Разработка структуры функций.
- Введите корневой каталог, расширение фильтрации и список ключевых слов с подстановочными знаками.
- Получите все файлы, соответствующие расширению, в указанном корневом каталоге.
- Используя Java Stream API, получите всю строку и сравните каждую строку с регулярным выражением с подстановочными знаками. если соответствующий текст существует в файле, выведите номер строки, соответствующее ключевое слово и путь к файлу в STUDIO. А затем отфильтруйте несоответствующий файл и соберите соответствующий файл в списке.
- И распечатайте возвращенный файл на терминал.
Шаг 3 – Весь код функции.
Весь код функции приведен ниже.
/**
* Search Files from specified directory with file extension and wildcard keywords.
* @param rootPath
* @param fileExtension
* @param wildcardKeywords
* @return
* @throws IOException
*/
public static List search(Path rootPath, String fileExtension, List wildcardKeywords) throws IOException {
//Get all files under specified path matching with specified file extention list.
List allFiles = Files.walk(rootPath).sorted().map(Path::toFile).filter(f -> f.getName().endsWith(fileExtension)).collect(Collectors.toList());
return allFiles.stream().map(f -> {
try {
//Read all lines of a file to List.
List lines = Files.readAllLines(f.toPath());
//matching flag
boolean isMatching = false;
//String line loop.
for(int i=0; i s.equals("") ? "" : Pattern.quote(s)).collect(Collectors.joining(".*"))+".*";
//if a line be matched with pattern regex, print line number and file absolute path.
if(line.matches(regex)) {
//Print formatted text on STD IO.
System.out.println(String.format("%-10s %-50s %s", "LINE: "+(i+1), "MATCHING KEYWORD: "+keyword, "PATH: "+f.getAbsolutePath()));
isMatching = true;
}
}
}
if(isMatching) {
return f;
}
} catch(IOException e) {
e.printStackTrace();
}
return null;
//Filtering null value.
}).filter(f -> f != null).collect(Collectors.toList());
}
Шаг 4 – Тест-драйв
Создайте основную функцию и протестируйте функцию “поиск”.
- главный
public static void main(String[] args) throws IOException {
Path rootPath = Paths.get("D:\\Development\\DBController");
List wildcardKeywords = new ArrayList();
wildcardKeywords.add("*pu*lic*");
List resultFiles = search(rootPath, ".java", wildcardKeywords);
resultFiles.stream().forEach(System.out::println);
}
Я проверил функцию с произвольным исходным каталогом Java-проекта на моем локальном компьютере, а затем результат похож на изображение ниже.
Вы можете попытаться изменить или добавить функции, которые заменяют или изменяют текст вашей компании в файле при обработке в огромных масштабах.
Удачи вам!!!
Оригинал: “https://dev.to/kooin/wildcard-type-search-in-java-pattern-3h54”