Другой подход:
Добавление к @ строка образца Wiktor, в
x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too). Let's look, does it work?"
Теперь магия:
> strsplit(x, ", |(?>\\(.*?\\).*?\\K(, |$))", perl = TRUE)
[[1]]
[1] "This is it"
[2] "isn't it (well, yes)"
[3] "and (well, this, that, and this, too). Let's look"
[4] "does it work?"
Так как же , |(?>\\(.*?\\).*?\\K(, |$))
матч?
|
захватывает либо из групп с обеих сторон, как
- слева, строка
,
- и справа,
(?>\\(.*?\\).*?\\K(, |$))
:
(?> ...)
устанавливает an atomic group, который не позволяет отступать, чтобы пересмотреть то, что он соответствует.
- В этом случае, он ищет открывающую скобку (
\\(
)
- затем любой символ (
.
) повторяется от 0 до времени бесконечности (*
), но как можно меньше (?
), т.е. .
оценивается лениво ,
- предыдущий
.
повторение затем ограничена первой закрывающей скобкой (\\)
),
- следует другой набор любого символа повторяется от 0 до как можно (
.*?
)
- с a
\\K
в конце, который выбрасывает до конца матча и задает начальную точку нового матча.
- Предыдущая
.*?
ограничена захвата группой ((...)
) с |
что либо
- выбирает фактическую текстовую строку,
,
,
- или перемещает
\\K
к концу линии, $
, если больше не являются запятыми.
* Уф. *
Если мое объяснение сбивает с толку, увидеть документы, связанные выше, и проверить regex101.com, где вы можете положить в приведенном выше регулярное выражение (одиночный escaped- \
- вместо R-стиля double escaped - \\
) и тестовую строку, чтобы увидеть, что она соответствует, и получить объяснение того, что она делает. Вам нужно будет установить модификатор g
(глобальный) в поле рядом с полем регулярных выражений, чтобы показать все совпадения, а не только первые.
Happy strsplit
ing!
Вы пытаетесь использовать фигурные скобки '(...)' как область с нерастяжимым блоком и должны поместить свое намерение в расщепление regexp. Это непростая задача. – huckfinn