Я часто использую встроенный в java java.util. Scanner
для получения информации из потоков строк, но чего я не смог сделать, так это извлечь некоторые токены, соответствующие предопределенному регулярному выражению, а затем использовать последовательность символов до конца. В примере встроенного сканера java регулярное выражение используется только для определения разделителей, например, токены разделяются пробелами, скажем , \t
или \n
. Я не мог сказать ему, чтобы он извлекал четко определенную информацию, например 123a4567-e89b-12d3-a456-123442445670
, особенно когда она находится внутри текста, смешанного с некоторыми другими токенами. Все, что мне нужно сделать сейчас, это предоставить пример регулярного выражения, и я получу все соответствующие токены из заданного текста.
@Test public void testUUID() { final String regex = "[0-9abcdef]{8}(-[0-9abcdef]{4}){3}-[0-9abcdef]{12}"; final String text = "uuid : 6d0a3538-9760-41ae-965d-7aad70021f81\n" + "uuid : d7d97fb3-3676-4109-9a94-7acc5f593ace\n" + "uuid : 02e87dd3-10ff-43cf-9572-bd9d151bb439\n" + "uuid : 632a4c31-8dfe-43a3-8f8d-15b472292cc9"; final ListexpectedUUIDs = Arrays.asList("6d0a3538-9760-41ae-965d-7aad70021f81", "d7d97fb3-3676-4109-9a94-7acc5f593ace", "02e87dd3-10ff-43cf-9572-bd9d151bb439", "632a4c31-8dfe-43a3-8f8d-15b472292cc9"); final List foundUUIDs = new ArrayList<>(); final RegexScanner regexScanner = new RegexScanner(text, regex); while (regexScanner.hasNext()) { foundUUIDs.add(regexScanner.next()); } Assert.assertArrayEquals(expectedUUIDs.toArray(), foundUUIDs.toArray()); }
Таким образом, сканер используется циклом while до тех пор, пока не будет достигнут конец, что означает, что все токены считываются и обрабатываются.
Можно также предоставить функцию, которая сопоставляет найденный токен с другим объектом, используя метод next(Function ,R> mapper)
. ,R> mapper)
Код доступен на github по этой ссылке .
Оригинал: “https://dev.to/mustabelmo/java-regex-based-scanner-4g5”