stringi
モジュール (およびstringr
同様) はICU 正規表現ライブラリにバンドルされており、動詞(*SKIP)(*FAIL)
はサポートされていません (実際には、PCRE ライブラリでのみサポートされています)。
ou
が前に付いh
ておらず、後にも付いていないマッチングであるl
ため、通常のルックアラウンドを使用できます。
(?<!h)ou(?!l)
正規表現のデモを見る
> x <- c("I shouldn't", "you should", "I know", "'bout time")
> pat1 <- "(?<!h)ou(?!l)"
> stringi::stri_detect_regex(x, pat1)
[1] FALSE TRUE FALSE TRUE
ここで別のアプローチを提案することもできます。ou
あなたのコードは、文字列の中にあるがそうではないかどうかを示すブール値を返したいだけであることを意味するので、houl
使用することができます
stringi::stri_detect_regex(x, "^(?!.*houl).*ou")
別の正規表現のデモを見る
詳細
^
- 文字列の開始
(?!.*houl)
- 文字列の開始直後に改行文字以外の 0+ 文字ができるだけ多く続く場合に一致に失敗する否定先読みhoul
.*
- 改行文字以外の 0+ 文字はできるだけ多く
ou
-ou
部分文字列。
Lookahead および Lookbehind Zero-Length Assertions の詳細。
ICU では、後読みに未知の幅のパターンを含めることはできませんが、後読み内の限定量指定子はサポートされていることに注意してください。したがって、 でstringi
、 を含む任意の単語に一致させたい場合は、左のどこかがou
前にない場合、次を使用できます。s
> pat2 <- "(?<!s\\w{0,100})ou"
> stringi::stri_detect_regex(x, pat2)
[1] FALSE TRUE FALSE TRUE
(?<!s\\w{0,100})
制約付き幅の後読みは、 0 ~ 100 文字の英数字またはアンダースコア文字ou
が前にある場合、一致に失敗します。s