Ich versuche tiefer in Regexes zu graben und eine Bedingung übereinstimmen, es sei denn, ein Teilstring ist auch in der gleichen Zeichenfolge gefunden. Ich weiß, dass ich zwei grepl
Anweisungen verwenden kann (wie unten zu sehen), aber ich möchte eine einzige Regex verwenden, um diese Bedingung zu testen, da ich mein Verständnis vorantreiben möchte. Nehmen wir an, ich möchte die Wörter "Hund" und "Mann" mit "(dog.*man|man.*dog)"
(taken from here) übereinstimmen, aber nicht, wenn die Zeichenfolge die Teilzeichenfolge "Park" enthält. Ich dachte, ich könnte (*SKIP)(*FAIL)
verwenden, um den "Park" zu negieren, aber dies verursacht nicht die Zeichenfolge fehlgeschlagen (siehe unten).Regex Match Teilstring, es sei denn, ein anderer Teilstring passt
- Wie kann ich die Logik entsprechen von finden "dog" & "Mann", aber nicht "Park" mit 1 regex?
- Was ist falsch mit meinem Verständnis von
(*SKIP)(*FAIL)|
?
Der Code:
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 ich aus irgendeinem Grund dachte man keinen Quantor in einem lokaround verwenden können. –
Sie können einen Quantifizierer in einem Look-Ahead verwenden, aber Sie können keinen Quantifizierer in einem PCRE-Look-Behind verwenden.Ein Quantifizierer kann in NET-Look-Behind verwendet werden, und nur ein begrenzender Quantifizierer mit Min- und Max-Werten kann in Javas eingeschränkter Java-Lookback verwendet werden. –