and とorの検索(論理積と論理和)No.31791
trek4567 さん 12/11/16 07:45
 
秀丸エディタの検索機能についてお聞きします。
ヘルプファイルに「論理和」があって、正規表現で

言葉1|言葉2

でOR検索ができるようです。論理積についてはヘルプファイルを探してみましたが見
つかりません。

検索(、あるいはgrep検索)でand or 検索はどのようにしたらいいか教えてください。

よろしくお願い押します。

ごん


[ ]
RE:31791 and とorの検索(論理積と論理和No.31792
秀丸担当 さん 12/11/16 09:22
 

正規表現で論理積するという書き方そのものは無いので、いろいろ組み合わせて
記述する必要があります。

1つの方法として、.*を間にはさんで書く方法が考えられます。
どちらが先にきてもいいように2つのパターンを書きます。

(言葉1.*言葉2)|(言葉2.*言葉1)

ただ、これだと3つ以上だとかなり複雑になってしまいます。
Web検索して得られたテクニックとして、後方一致の(?=)を使った以下の書き方
がありました。

^(?=.*言葉1)(?=.*言葉2)(?=.*言葉3).*$

これだと3つ以上でも簡単に書けて、便利に使えそうです。

[ ]
RE:31792 and とorの検索(論理積と論理和No.31793
trek4567 さん 12/11/16 09:56
 
さっそくの回答ありがとうございました。
今日使いたかったので助かりました。

言葉1.*言葉2

で十分ANDが使えます。grepでも使えて少し感動的です。希望とすればgoogle のように

言葉1(space)言葉2

でANDが使えるといいのですが。

ごん

[ ]
RE:31793 and とorの検索(論理積と論理和No.31794
山紫水明 さん 12/11/16 13:55
 
 ごんさん,

>希望とすればgoogle のように
>言葉1(space)言葉2
>でANDが使えるといいのですが。

 秀丸担当さんの紹介された正規表現を利用して,次のようにするのはいかが
でしょう。スペースの数は問いません。

//-----------------------------------------------------
$a = input("検索語は?\n(スペース区切りで複数語のAND検索)");
if( $a == "" ) endmacro;
loaddll "HmJre.dll";
$s = dllfuncstr("ReplaceRegular", "[  ]", $a, 1, ")(?=.*", 1);
if( $s != "" ) {
    $s = "^(?=.*" + $s + ").*$";
} else {
    $s = $a;
}
freedll;
grepdialog2 $s, "*.*", ".", regular;
endmacro;
//-----------------------------------------------------

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:31794 and とorの検索(論理積と論理和No.31795
秀丸担当 さん 12/11/16 15:09
 

山紫水明さん補足ありがとうございます。
何かいいマクロが無いか探そうとしていたところでしたが、早速ありがとうござ
います。

試してみたところ全角文字があるとうまくいかないことがあったので調べてみた
ところ、以下の行を一箇所修正したほうがよさそうです。

$s = dllfuncstr("ReplaceRegular", "[  ]", $a, 1, ")(?=.*", 1);

$s = dllfuncstr("ReplaceRegular", "[  ]", $a, 0, ")(?=.*", 1);

こうしておくとうまくいきました。

[ ]
RE:31795 and とorの検索(論理積と論理和No.31796
山紫水明 さん 12/11/16 16:50
 
 秀丸担当さん,

>試してみたところ全角文字があるとうまくいかないことがあったので調べてみた
>ところ、以下の行を一箇所修正したほうがよさそうです。

>$s = dllfuncstr("ReplaceRegular", "[  ]", $a, 1, ")(?=.*", 1);
>↓
>$s = dllfuncstr("ReplaceRegular", "[  ]", $a, 0, ")(?=.*", 1);

 点検していただき恐縮です。テスト不足でした。
 ただ,全角文字の問題というより,最初にスペースがあった場合に,私はこれ
を無視するつもりでパラメーターを「1」にしたのですが,むしろ逆効果でした。
「1」にすると最初のスペースも検索文字に入ってしまって,うまくいかないよ
うです。
 全角文字でうまくいかないというのは,どういう場合でしょうか。
 それから,スペースを並べて書いた場合も1つにあつかった方がよいので,こ
の部分は

$s = dllfuncstr("ReplaceRegular", "[  ]+", $a, 0, ")(?=.*", 1);

の方がよさそうです。

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:31792 and とorの検索(論理積と論理和No.31797
Arimac さん 12/11/17 00:06
 
BRegIf(秀丸用正規表現DLLの一つ)だと

.*言葉1.*&言葉2

という書き方で出来ます。
&の左の正規表現に一致した範囲をさらに右の正規表現で検索しています。
|みたいに一般的にならないかなぁ…(~^;
ちなみに~(not:パターンの反転)もあったりします(^^;

[ ]
RE:31796 and とorの検索(論理積と論理和No.31804
秀丸担当 さん 12/11/19 09:19
 

> 全角文字でうまくいかないというのは,どういう場合でしょうか。

"検索 A"
という文字列でうまくいきませんでした。
この場合は全角2バイト目からになってしまい、1つずれて結果的に空白が全角
2バイト目と解釈されてマッチしないようです。

>$s = dllfuncstr("ReplaceRegular", "[  ]+", $a, 0, ")(?=.*", 1);

確かにこちらのほうがよさそうですね。

[ ]
RE:31804 and とorの検索(論理積と論理和No.31806
山紫水明 さん 12/11/19 20:54
 
 秀丸担当さん,

>"検索 A"
>という文字列でうまくいきませんでした。
>この場合は全角2バイト目からになってしまい、1つずれて結果的に空白が全角
>2バイト目と解釈されてマッチしないようです。

 なるほど,そういう場合があるのですね。どうもありがとうございました。

                          山紫水明
                          SANSHISUIMEI

[ ]