Sto cercando di approfondire le espressioni regolari e desidero associare una condizione a meno che nella sottostringa non venga trovata anche una sottostringa. So che posso usare due dichiarazioni grepl
(come visto di seguito), ma sto volendo usare una singola espressione regolare per verificare questa condizione, perché sto spingendo la mia comprensione. Diciamo che voglio abbinare le parole "cane" e "uomo" usando "(dog.*man|man.*dog)"
(taken from here) ma non se la stringa contiene la sottostringa "parcheggio". Ho pensato che potrei usare (*SKIP)(*FAIL)
per negare il "park", ma questo non causa il fallimento della stringa (mostrato sotto).regex corrisponde alla sottostringa, a meno che un'altra sottostringa non corrisponda a
- Come posso abbinare la logica di trovare "cane" & "l'uomo", ma non "parco" con 1 regex?
- Cosa c'è di sbagliato nella mia comprensione di
(*SKIP)(*FAIL)|
?
Il codice:
x <- c(
"The dog and the man play in the park.",
"The man plays with the dog.",
"That is the man's hat.",
"Man I love that dog!",
"I'm dog tired",
"The dog park is no place for man.",
"Park next to this dog's man."
)
# Could do this but want one regex
grepl("(dog.*man|man.*dog)", x, ignore.case=TRUE) & !grepl("park", x, ignore.case=TRUE)
# Thought this would work, it does not
grepl("park(*SKIP)(*FAIL)|(dog.*man|man.*dog)", x, ignore.case=TRUE, perl=TRUE)
Nizza stavo pensando per qualche motivo non è possibile utilizzare un quantificatore all'interno di un lokaround. –
È possibile utilizzare un quantificatore all'interno di un look-ahead, ma non è possibile utilizzare un quantificatore all'interno di un look-behind PCRE.Un quantificatore può essere utilizzato in NET look-behind e solo un quantificatore limitante con valori min e max può essere utilizzato in Java look-behind Java a larghezza vincolata. –