最後の投稿5月ですってよ。
AC6全ステージSクリアを必死に目指しております。
正規表現というのこご存じだろうか。
「Apple and honey, tea jam is apricot.」から「a」から始まる5文字以上の単語を探す
のような検索をするときに便利なやつなんですが、動きが想像出来なくてよく分かんないことがちょくちょくあるんですね。
(「a」から始まる5文字以上の単語 は「\ba[a-z]{4,}\b」で取れるはず)
頭足りてないと言われたらぐうの音も出ない。
で、題にもあるように正規表現には「否定先読み」と言うものがあります。
(?!~)のような書き方をするんですが、書き方を調べると「特定の文字列を含まない行を取得」みたいな記事がたくさん出てきます。
が、私としては「特定の文字列を含む単語を除いて取得」がしたいのでちょっと違う。
「Ladies and Gentlemen, Boys and Girls.」から「and」の文字列を含まない単語を取るとします。
~を含まない、なら[^~]という書き方があるんですが、これだと1文字単位で除かれちゃうんですね。
希望する形はこう 「Ladies Gentlemen, Boys Girls.」
[^and]と書くとこう 「L ies Ge tleme , Boys Girls.」
うーんこの。
そして問題の(?!~)。
単純に(?!and)するとこう「Ladies nd Gentlemen, Boys nd Girls.」なってしまう。
なんというか、近からずも遠からず。
恐らくこんな動きをしてるんだろうなぁと想像は付くんですが、無知晒してたらごめんやで。
(1行目:元の文字列、2行目:確認する単語、3行目:結果)



個人的な解はこれ。
\b(?!\wand\w)\w*\b
ですが、これだと「単語ごと除外」になるので「standing → st ing」みたいなのはできないです。
これ以上は延々と時間食いそうだったので、とりあえずは単語ごと除外で終わります。
代替構成体の(?(expression)yes|no)とか使えそうな気がする、けどどうなんだろ…
参考
WWW CREATORS
正規表現:文字列を「含まない」否定の表現まとめ
stack overflow
特定の単語以外がマッチする正規表現
teratail
正規表現を使って「特定の文字列(単語)」以外の文字列(※行ではない)を抽出したい
nymemo
【正規表現】文字列の否定、ある文字列を含まない
Microsoft Lean
代替構成体 – 正規表現言語 – クイック リファレンス