Здравствуйте, я хотел бы получить совет о том, как преобразовать PCRE REGEX в REGU ICU, чтобы я мог использовать его с функцией R str_match_all (часть пакета stringr).
@ Wiktor Stribiżew смог произвести разбор REGEX PCRE, как показано в следующих демонстрациях REGEX101:
https://regex101.com/r/m4UD0j/17
Этот анализ захватывает комбинации aa и bb (каждому предшествует любая цифра любой длины), а затем группы (ы) cc (аналогично с предшествующей цифрой (ями)), например, 10aa5bb6bb3bb6aa999cc998cc997cc
Так что думайте о струне как о двух частях:
Первый - это случайный набор комбинаций aa или bb (хотя, например, это может быть только aa), перед которыми стоит цифра.
Вторая половина представляет собой серию кубиков (хотя это может быть только один куб, например), перед которыми стоит цифра.
Важно, чтобы обе «стороны» строки были записаны вместе, и текст, и цифра были записаны специально. Итак, допустимыми являются, например:
2aa2cc
323233aa21212bb4555cc
1aa2aa3aa4aa5aa6aa117cc8cc
1bb2bb3bb4bb5bb6bb117cc8cc
1aa2bb3bb4aa5bb6bba117cc8cc
1aa2bb3bb4aa5bb6bba117cc8ccXXXXXXXXXX1aa2bb3bb4aa5bb6bba117cc8cc
Invalid:
2aa *Only one side of the string is there*
1aa2bb3bb4aa *Only one side of the string is there*
99cc100cc *Only one side of the string is there*
Кроме того, я хотел бы получить отдельное выражение REGEX для случаев, когда группы 'cc' стоят первыми в строке, например. 999cc998cc997cc10aa5bb6bb3bb6aa. Это демонстрируется здесь: https://regex101.com/r/m4UD0j/18
ПРИМЕЧАНИЕ. Текстовые шаблоны aa, bb и cc на самом деле являются аббревиатурами более длинных символьных строк, поэтому их следует рассматривать как таковые. Я предоставил более короткие версии, чтобы избежать более запутанного примера.
В двух демонстрациях показано регулярное выражение для различных порядков комбо.
Теперь я должен выполнить этот прогон в R, используя str_match_all , который, к сожалению, использует регулярное выражение ICU, а не регулярное выражение pcre, которое мы тестировали в REGEX101.
Итак, у меня есть этот код, который выдает Использование функции регулярного выражения, которая еще не реализована. (U_REGEX_UNIMPLEMENTED) ошибка:
#REGEX TEST#
library(stringr)
regex_text_1 <- "8aa9aa10bb1cc2cc3cc"
#reg_pattern_1 that worked in REGEX101 <- "(?:\G(?!^)(?(?=\d+(?:aa|bb))(?<!\dcc))|(?=(?:\d+(?:aa|bb))+(?:\d+cc)+))(\d+)(aa|bb|cc)"
reg_pattern_1 <- "(?:\\G(?!^)(?(?=\\d+(?:aa|bb))(?<!\\dcc))|(?=(?:\\d+(?:aa|bb))+(?:\\d+cc)+))(\\d+)(aa|bb|cc)"
regex_text_2 <- "1cc2cc3cc8aa9bb10bb"
#reg_pattern_2 that worked in REGEX101 <- "(?:\G(?!^)(?(?=\d+cc)(?<!\d(?:aa|bb)))|(?=(?:\d+cc)+(?:\d+(?:aa|bb))+))(\d+)(aa|bb|cc)"
reg_pattern_2 <- "(?:\\G(?!^)(?(?=\\d+cc)(?<!\\d(?:aa|bb)))|(?=(?:\\d+cc)+(?:\\d+(?:aa|bb))+))(\\d+)(aa|bb|cc)"
sm <- str_match_all(regex_text_1, reg_pattern_1)
sm.df <- as.data.frame(sm)
print(sm.df)
sm <- str_match_all(regex_text_2, reg_pattern_2)
sm.df <- as.data.frame(sm)
print(sm.df)
Я бы хотел, чтобы он вывел что-то вроде этого:
X1 X2 X3
1 8aa 8 aa
2 9aa 9 aa
3 10bb 10 bb
4 1cc 1 cc
5 2cc 2 cc
6 3cc 3 cc
и
X1 X2 X3
1 1cc 1 cc
2 2cc 2 cc
3 3cc 3 cc
4 8aa 8 aa
5 9aa 9 aa
6 10bb 10 bb
... как если бы мы применили его в pcre.
Я недостаточно опытен, чтобы конвертировать код из pcre в icu, поэтому буду очень признателен за помощь. Большое спасибо ...