В наши дни на локальном компьютере и на стороне сервера у разработчиков есть огромные текстовые данные. 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 Listsearch(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"); ListwildcardKeywords = 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”