Próbuję zagłębić się w wyrażenia regularne i chcę dopasować warunek, chyba że niektóre podciągi również znajdują się w tym samym ciągu. Wiem, że mogę użyć dwóch oświadczeń grepl
(jak widać poniżej), ale chcę użyć pojedynczego wyrażenia regularnego, aby przetestować ten warunek, ponieważ naciskam na moje zrozumienie. Powiedzmy, że chcę dopasować słowa "pies" i "człowiek" przy użyciu "(dog.*man|man.*dog)"
(taken from here), ale nie, jeśli ciąg zawiera podłańcuch "park". Pomyślałem, że mogę użyć (*SKIP)(*FAIL)
, aby zanegować "park", ale nie spowoduje to niepowodzenia łańcucha (pokazanego poniżej).Wykonywanie podobieńców dopasowań podciąć, chyba że inny podciąg pasuje do
- jaki sposób można dopasować logikę znaleźć „pies” & „człowiek”, ale nie „park” z 1 regex?
- Co jest nie tak z moim zrozumieniem
(*SKIP)(*FAIL)|
?
Kod:
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)
Nicea Myślałam z jakiegoś powodu nie można wykorzystać kwantyfikator wewnątrz lokaround. –
Możesz użyć kwantyfikatora wewnątrz z wyprzedzeniem, ale nie możesz użyć kwantyfikatora wewnątrz obszaru PCRE.Kwantyfikator może być użyty w funkcji NET look behind i tylko ograniczający kwantyfikator z wartościami minimalnymi i maksymalnymi może być użyty w Java Javy z ograniczoną szerokością. –