knowledge9876
@knowledge9876

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

文章の途中部分から有って欲しい文字とない方がいい文字を両方指定して開始点と終了点も指定する正規表現はどう書けば行けますでしょうか?

文章の途中部分から有って欲しい文字とない方がいい文字を両方指定して開始点と終了点も指定する正規表現はどう書けば行けますでしょうか?

マッチさせたい部分

マッチ
▼沖縄は毎年いつも平穏です◆

行そのものだけなら何々はあって、何々という文字がない行という意味であれば、以下だと思います。

^(?=.(沖縄|平穏))(?!.(ない|無い)).*$

これは^(?=.有る)この部分が必要な文字で(?!.(無い))これが必要ないになります。

ただ、これは行を1行丸ごとでしか区別しませんのでやりたいことは、もっと高度に途中部分だけを最短でマッチさせて取り出す方法です。

やりたいことの例文です。

★◎ここここ▼沖縄は毎年いつも平穏です◆ららららら●★

この条件は★や◎や○などはいらないので▼から◆"沖縄"や"平穏"が含まれて"●★"などは入っていない場合のみ取り出したいです。

マッチさせたい部分
▼沖縄は毎年いつも平穏です◆

マッチさせたくないパターン →★など不要文字が▼から◆の中にあるため
▼沖縄は毎年いつも★平穏です◆

このように文の途中部分だけ必要ある語句と必要ない文字と開始点の文字と終了点の文字を指定した正規表現はどう書けば行けますでしょうか?

0

1Answer

マッチさせたい文字列Aには特定の文字Bが含まれている。
Aの始まりと終わりの文字は判明している。
Aに特定の文字Cが含まれる場合、Bを含んでいても無視する。
の条件で大丈夫ですか。

▼((?!●|★).)*(沖縄|平穏)((?!●|★).)*◆
でどうでしょう。
始まりが▼、終わりが◆
含めたい文字Bが沖縄、平穏
含めたくない文字Cが●、★
((?!●|★).) は●、★以外の任意の文字を意味します。
*で()で囲われている上の文字を0回以上繰り返す部分を探します。
(沖縄|平穏)はどちらかを含む部分を探します。


上記の場合
▼ららら▼ら沖縄▼は▼い◆つ◆も◆平穏◆で◆す◆ららら◆
これもマッチしますが防ぐなら、

▼((?!●|★|▼|◆).)*(沖縄|平穏)((?!●|★|◆).)*◆
とします。

(?!)の中が前後で異なります
最初の((?!●|★|▼|◆).)*は▼の後に▼が来ないことを表します。◆も探索終了なので来ないはずです。
最後の((?!●|★|◆).)*は(沖縄|平穏)が見つかっているので▼が来ても問題ありません。◆は一番最後に書いた1つだけでいいので飛ばします。

「▼ららら」を調べます。「▼ら沖」と▼が来たので探索終了です。次に「▼ら沖縄」を調べると沖縄が来ました。「▼は▼い」に▼がありますが既に沖縄がきているので無視します。「◆」が来たので最後に書いた◆で受け取ります。
結果「▼沖縄▼は▼い◆」になります。


上2つは、下記のいずれにもマッチします。
▼沖縄はいつも危険です◆
▼東京はいつも平穏です◆
文章的に沖縄と平穏のどちらも含まれてないとダメそうですが大丈夫ですか。

どちらも含んでいてほしい場合は

▼((?!●|★|▼|◆).)*(?=[^▼◆]*沖縄[^◆]*◆)(?=[^▼◆]*平穏[^◆]*◆)((?!●|★|◆).)*◆

とします。
[^▼◆]は[]内以外の文字を意味します。
(?=[^▼◆]*沖縄[^◆]*◆)
で沖縄という単語が▼◆の間のどこかに含まれているかを探します。平穏も同じく。
[]の中が前後で異なるのは2つ目と同じ理由です。こっちの[]に●★が入らないのは最初の((?!●|★|▼|◆).)*と最後の((?!●|★|◆).)*で●★が弾かれるからです。

▼沖縄はいつも平穏です◆
▼いつも平穏な沖縄です◆
順番は問わないのでどちらも探し出せます。

2Like

Comments

  1. すみません。ミスが多かったのでかなり編集しています。
  2. @knowledge9876

    Questioner

    ありがとうございます。御厚意、感謝しております。

Your answer might help someone💌