Un approccio diverso:
Aggiunta a @ stringa di esempio di Wiktor,
x <- "This is it, isn't it (well, yes), and (well, this, that, and this, too). Let's look, does it work?"
Ora la magia:
> 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?"
Così come fa , |(?>\\(.*?\\).*?\\K(, |$))
partita?
|
cattura uno dei gruppi su entrambi i lati, sia
- sulla sinistra, la stringa
,
- e, sulla destra,
(?>\\(.*?\\).*?\\K(, |$))
:
(?> ...)
set up an atomic group, che non consente il backtracking per rivalutare ciò che corrisponde.
- In questo caso, esso cerca una parentesi aperta (
\\(
),
- quindi qualsiasi carattere (
.
) ripetuto da 0 a volte infinito (*
), ma il meno possibile (?
), cioè .
viene valutata pigramente .
- Il precedente
.
ripetizione è quindi limitata dalla prima parentesi chiusa (\\)
),
- seguita da un'altra serie di carattere ripetuto 0 a meno possibile (
.*?
)
- con a
\\K
alla fine, che getta via la partita finora e imposta il punto di partenza di una nuova partita.
- Il precedente
.*?
è limitato da un gruppo di acquisizione ((...)
) con un |
che o
- seleziona una stringa di testo effettivo,
,
,
- o sposta
\\K
alla fine della linea, $
, se ci non ci sono più virgole
* Accidenti. *
Se la mia spiegazione è confuso, vedere i documenti legati sopra, e controllare regex101.com, dove si può mettere nel regex sopra (singolo fuggito- \
-instead di R-style double fuggito- \\
) e una stringa di test per vedere cosa corrisponde e ottenere una spiegazione di ciò che sta facendo. Dovrai impostare il modificatore g
(globale) nella casella accanto alla casella regex per mostrare tutte le corrispondenze e non solo la prima.
Happy strsplit
ing!
Si tenta di utilizzare le parentesi '(...)' come un ambito di blocco non divisibile e si deve inserire l'espressione nella suddivisione regolare. Questo non è un compito semplice. – huckfinn