[リストへもどる]
一括表示
タイトル正規表現について教えてください
記事No3209
投稿日: 2005/06/25(Sat) 14:21
投稿者Hello World
お世話になります。

今、正規表現について勉強しているのですが、
どうしても分からない事がありまして、
ご存知の方がいらっしゃいましたら、
ご教示頂ければと思います。

例えば、次のようなテキストがあったとします。

---テキスト始まり--------------------------
aaa
   ←半角スペース3つ
bbb
   ←半角スペース3つ
ddd
←改行のみ
[EOF]
---テキスト終わり--------------------------

ここで、全て半角スペースの行を検索しようと思い、
正規表現 ^\s+$ で検索をかけました。

検索後、検索語として色分けはされるのですが、
カーソルが検索対象の行に移動してくれません。

正しく検索するにはどのような正規表現を
用いればよいでしょうか?

■動作環境
WindowsXP sp2
K2Editor r.1.5.2 Build 511

以上、よろしくお願いいたします。

タイトルRe: 正規表現について教えてください
記事No3210
投稿日: 2005/06/25(Sat) 16:25
投稿者Me2
Me2です。

> ここで、全て半角スペースの行を検索しようと思い、
> 正規表現 ^\s+$ で検索をかけました。
>
> 検索後、検索語として色分けはされるのですが、
> カーソルが検索対象の行に移動してくれません。

正規表現は正しいように思われますが、色分けと検索の動作が
何となくおかしいようですね。
同じテキストで ^[ab]\n とすると行移動はしてくれますが
色分けはされないようです。(こういうものだったかも)
^[ab]$ と交互にやると色分けや行移動ができたりできなかったり
して、動作が不一致になるようです。

話がそれますがヘルプを見ると検索のところで改行コードは
\rではなく\nを使用してくださいとあります。
置換のところには「(\nを)内部で自動的に\r\nに展開します。」とあります。
内部的にはSIFT-JIS CRLFだからということでしょうか。
内部で\rを使っているから、あるいはBregExpに\rがあるから
といっても、検索・置換では\rは使えないようです。

タイトルRe^2: (訂正)正規表現について教えてください
記事No3211
投稿日: 2005/06/25(Sat) 16:31
投稿者Me2
^[ab]\n と^[ab]$ は^[ab]+\n と^[ab]+$ の誤りです。
なお ^[ab]*\n と^[ab]*$ でやってみても同じ検索語で
動作の不一致が見られます。

タイトルRe: 正規表現について教えてください
記事No3212
投稿日: 2005/06/26(Sun) 17:22
投稿者K2
 K2です。

> ここで、全て半角スペースの行を検索しようと思い、
> 正規表現 ^\s+$ で検索をかけました。
>
> 検索後、検索語として色分けはされるのですが、
> カーソルが検索対象の行に移動してくれません。

 ロジック的に非常に難しいので、完璧な説明はできませんが説明してみます。

 通常、K2Editor は、検索対象文字列として、1論理行を検索ルーチンに渡します。
 ところが、\n が検索語に含まれる場合は、改行文字列を検索する必要があるため、
\n 一個につき、検索対象文字列を1行拡張して検索ルーチンに渡します。(これを
検索対象文字列の行拡張と呼ぶ)

 $ の扱いというのは、検索ルーチンにとっては、文字列末端であり、行末端では
ありません。エディタが文字列末端をどのように解釈するかは、そのエディタごと
に違うと考えられます。K2Editor では、一応行末端として扱いますが、\n が絡ん
だ検索を行う場合、複数行を検索対象文字列とする必要があるので、$ はうまく動
作しなくなります。つまり、\n が一個ある場合は、2行目の末端が $ にマッチし
ます。

 ^\s*$ には、一見 \n が含まれるようには見えませんが、実は \s には改行コー
ドが含まれるため、\s が一つある場合、1行分行拡張します。そうすると、$ の評
価がおかしくなります。

 この辺は、アプリ側では完全につじつまを合わせることができないので、うまく
動作する表現を見つけて、検索する必要があります。

 今回の場合は、^\s+\n とすれば動作しますが、\s には改行コードが含まれるの
で、正確には正規表現としては間違いです。例えば、半角スペースとタブだけに当
てたい場合は、^[ \t]+$ とする必要があります。この場合は、検索文字列に \n が
含まれていないので、$ はうまく動作します。

 行拡張は \n 一個につき一行拡張します。そのため、\n に対して開包・閉包 (+*)
を使用した場合、K2Editorではうまく検索できません。

 また検索語色分けと通常検索は、若干動作が異なります。検索語色分けは、速度
が要求されるため、通常検索では行う検索対象文字列の行拡張を行いません。その
ため、場合によって $ はうまく動くように見えたり \n が使えないなどの制限があ
ります。

 興味がある人は、ソースを解析してください。

# うわー、これが言えるのは、うれしいなー。

タイトルRe^2: 正規表現について教えてください
記事No3214
投稿日: 2005/06/27(Mon) 10:49
投稿者Me2
Me2です。

横から失礼します。

K2さんの丁寧な説明でよくわかりました。
まとめると

 ・$と\nは排他的に使え
・\s のように隠れ\nもあることを忘れずに
 ・検索と色分けは似て非なる動作をする
   検索は1行拡張あり、色分けは1行拡張なし

といったところでしょうか。

色分けと検索が一致するのは基本的に「\nがない場合」と思えば
よさそうです。それと

 ・\nを含む検索では検索語を色分けしない

のようですね。

どうもこれに関連しているようなのですが、他で述べたように
\nを含む検索の後、\nを含まない検索をすると色分けと検索が
正しく動作してないように見えるのですが。どうでしょうか。


前のテキストで
1. [-]+$とする(検索され、色分けもされる) [F3]もOK

はいいのですが、

2. [-]+\nとする(検索される、色分けされない) [F3]もOK
3. 検索された語の行でもう一度[-]+\nとすると、行番号の前に色が付き、
その行だけ検索される(他の行が検索されない)、色分けはなし

となります。同じ動作をすることが問題なのではなく、\nを含む
検索でヒットした行にあたった状態で他の検索をすると駄目な
ようです。
通常ヒットして選択された状態から続けて別の検索をすることが
できますが、\nのときはキャレットが次の行頭にあるからなのか(関係ないかも)
それとも選択された文字の中だけを探しているのか、ともかくヒットしません。
 例. 文頭から[-]+\nのあと文字列dddを普通に検索してもdddには移動しない

タイトルRe^3: 正規表現について教えてください
記事No3215
投稿日: 2005/06/27(Mon) 13:38
投稿者K2
 K2です。

> 2. [-]+\nとする(検索される、色分けされない) [F3]もOK
> 3. 検索された語の行でもう一度[-]+\nとすると、行番号の前に色が付き、
> その行だけ検索される(他の行が検索されない)、色分けはなし

 行選択した状態から新たに検索をすると、範囲検索モードに
入りますが、その問題でしょうか?
 一旦選択を解除してから検索すればよいのでは?

 誤解してますか?

タイトルRe^4: 正規表現について教えてください
記事No3217
投稿日: 2005/06/27(Mon) 22:08
投稿者Me2
Me2です。

>  行選択した状態から新たに検索をすると、範囲検索モードに
> 入りますが、その問題でしょうか?

まさしくそういうことでした。
\nを含む検索をするとそれにヒットした所が選択され、
今の場合\nを含むので改行までの選択状態になっている。
→このままの状態で検索すると範囲検索モードで検索することになる。
→その一行が左マージンに検索語の色で範囲として表示されている。

こういうことだったんですねえ。範囲検索のことをよくわかってませんでした。
おかげさまで疑問が氷解しました。
\nを含む検索にはこの点も注意しなくてはいけませんね。
どうも失礼しました。

タイトルRe^5: 正規表現について教えてください
記事No3226
投稿日: 2005/07/02(Sat) 16:19
投稿者Hello World
こんにちは。Hello Worldです。

K2様、Me2様、ご教示ありがとうございます。

とても勉強になりました。

正規表現は難しいけれど、とても便利ですね。
もう少し使いこなせるようにがんばります。
また、教えてください。よろしくお願いいたします。

ありがとうございました。