同一行で複数の強調表示No.21672
PYO さん 06/08/11 15:52
 
Ver 5.18 を使用しています。

次のようなテキストの数字部分だけを、赤(1xxx)と青(2xxx)で強調表示
したいのですが、同一行で複数の強調表示がうまくいきません。

 ip pp secure filter in 1001 2001 1002 2002 1999
 ip pp secure filter out 2001 2002 1001 1002 2999 dynamic abc
↑先頭に半角のスペースが入ります。

ip filter 1001 reject * * * * *
ip filter 1002 reject * * * * *
ip filter 1999 reject * * * * *
ip filter 2001 pass * * * * *
ip filter 2002 pass * * * * *
ip filter 2999 reject * * * * *

●強調表示の設定
赤色
(?\2)(secure filter (in|out)|ip filter)([ ][1][0|9][0-9][0-9])

青色
(?\2)(secure filter (in|out)|ip filter)([ ][2][0|9][0-9][0-9])

●期待する結果
 ip pp secure filter in 赤 青 赤 青 赤
 ip pp secure filter out 青 青 赤 赤 青 dynamic abc
↑先頭に半角のスペースが入ります。
※赤=赤色で表示、青=青色で表示される。

●実際の動作
 ip pp secure filter in 赤 2001 1002 2002 1999
 ip pp secure filter out 青 2002 1001 1002 2999 dynamic abc
↑先頭に半角のスペースが入ります。
※ip filterの行は、期待した結果になります。

最初の数字部分だけ色が変わりますが、残りは変わりません。
強調表示でこのような動作は出来ないのでしょうか?

[ ]
RE:21672 同一行で複数の強調表示No.21673
秀丸担当 さん 06/08/11 16:58
 

>●期待する結果
> ip pp secure filter in 赤 青 赤 青 赤
> ip pp secure filter out 青 青 赤 赤 青 dynamic abc
>↑先頭に半角のスペースが入ります。
>※赤=赤色で表示、青=青色で表示される。
>
>●実際の動作
> ip pp secure filter in 赤 2001 1002 2002 1999
> ip pp secure filter out 青 2002 1001 1002 2999 dynamic abc
>↑先頭に半角のスペースが入ります。
>※ip filterの行は、期待した結果になります。
>
>最初の数字部分だけ色が変わりますが、残りは変わりません。
>強調表示でこのような動作は出来ないのでしょうか?

普通に正規表現の検索をしてみるとわかりますが、前の文字列まで遡って検索対
象としないので、できないです。
繰り返し指定( [0-9]+){n})を入れて、強調表示をたくさん定義することで強引
にやってしまうこともできますが、あまりエレガントではないかもしれないです。

以下のテキストを.hilightファイルに保存して読み込むととりあえずできるので
はないかと思います。4回以上はだめですが。
(自動改行されている行は適当につなげて下さい)

25,(?<=(secure filter (in|out)|ip filter))([ ][2][0|9][0-9][0-9])
25,(?<=(secure filter (in|out)|ip filter)( [0-9]+){4})([ ][2][0|9][0-9][0-9])
25,(?<=(secure filter (in|out)|ip filter)( [0-9]+){3})([ ][2][0|9][0-9][0-9])
25,(?<=(secure filter (in|out)|ip filter)( [0-9]+){2})([ ][2][0|9][0-9][0-9])
25,(?<=(secure filter (in|out)|ip filter)( [0-9]+){1})([ ][2][0|9][0-9][0-9])
89,(?<=(secure filter (in|out)|ip filter))([ ][1][0|9][0-9][0-9])
89,(?<=(secure filter (in|out)|ip filter)( [0-9]+){4})([ ][1][0|9][0-9][0-9])
89,(?<=(secure filter (in|out)|ip filter)( [0-9]+){3})([ ][1][0|9][0-9][0-9])
89,(?<=(secure filter (in|out)|ip filter)( [0-9]+){2})([ ][1][0|9][0-9][0-9])
89,(?<=(secure filter (in|out)|ip filter)( [0-9]+){1})([ ][1][0|9][0-9][0-9])

[ ]
RE:21672 同一行で複数の強調表示No.21676
アルビレオ さん 06/08/12 02:53
 
ユーザーのアルビレオです。

いっそのことsecure filter〜は無視して、1xxxと2xxxをきちんと認識させるだ
けした方がいいように思います。

赤色
(?<= )1[09][0-9]{2}(?= |$)

青色
(?<= )2[09][0-9]{2}(?= |$)

これだけだと不要なものまで大量に色付けされてわかりにくいなら、

行の強調
secure filter (in|out)|ip filter

として、赤色と青色はそれぞれ「特に強調」に定義しておくと、多少ましになる
でしょう。

[ ]
RE:21673 同一行で複数の強調表示No.21677
PYO さん 06/08/14 13:53
 
>普通に正規表現の検索をしてみるとわかりますが、前の文字列まで遡って検索対
>象としないので、できないです。

普通に正規表現で検索をする事で、動作を確認できたんですね。
気が付きませんでした。orz

回答を頂いた内容を含めて、もう少し試行錯誤してみます。
ありがとうございました。

[ ]
RE:21676 同一行で複数の強調表示No.21678
PYO さん 06/08/14 15:15
 
レスありがとうございます。

>いっそのことsecure filter〜は無視して、1xxxと2xxxをきちんと認識させるだ
>けした方がいいように思います。

最初そう思って次のようにしたのですが、私の知識では2行に分けることしか
できませんでした。

[ ]1[09][0-9][0-9]
1[09][0-9][0-9][ ]

この場合、「 1999年」の1999も強調されてしまいます。orz

アルビレオさんの方法だと1行で記述できますね。
素晴らしいです。


>(?<= )1[09][0-9]{2}(?= |$)

次のように理解しましたが、間違っていたら指摘してください。

1.(?<= )
前方一致指定で半角スペースを探す(強調対象から除外される)。

2.1[09]
10と19を探す(強調対象)。

3.[0-9]{2}
[0-9]を2回繰り返す(強調対象)。

4.(?= |$)
後方一致指定で「1[09][0-9]{2}」の最後が半角スペースか行末を探す(強調対象か
ら除外される)。

※次の記述でも同様に動作するのを確認できました。
(?<= )1[09]([0-9]{2})(?= |$)
(?<= )1[09][0-9][0-9](?= |$)

[ ]
RE:21678 同一行で複数の強調表示No.21679
アルビレオ さん 06/08/14 19:38
 
アルビレオです。

>[ ]1[09][0-9][0-9]
>1[09][0-9][0-9][ ]
>
>この場合、「 1999年」の1999も強調されてしまいます。orz
>
>アルビレオさんの方法だと1行で記述できますね。
>素晴らしいです。

1行か2行かということよりも、2つに分けると
[ ]1[09][0-9][0-9] または 1[09][0-9][0-9][ ]
という意味になってしまうので意図しないものがたくさんマッチしてしまいます。
例: 191919191 191919191191919 191919

>次のように理解しましたが、間違っていたら指摘してください。
(略)

問題ありません。ただ細かいことを言えば {数字} は * や + と同じような役割
なので、([0-9]{2})のような書き方はあまり意味がありませんね。別に使っても
かまわないけど。
()を使うとすれば (abc){2} のような形でしょうか。
この場合は abcabc にマッチします。

あと先頭と最後の空白を除外することは単純に「強調表示させない」という以上
の意味があります。
もしも[ ]19[0-9]{2}[ ]だと、以下のような並びで真ん中の1901にマッチしなく
なってしまうのです。
abc 1900 1901 1902
これは「空白1900空白」までがマッチすると、次の検索は空白ではなく1901の先
頭の1からになるためです。そして検索パターンの先頭には空白が必要なので、
次にマッチするのは「空白1902空白」になります。

[ ]
RE:21679 同一行で複数の強調表示No.21681
PYO さん 06/08/17 17:54
 
レスありがとうございます。

説明のため簡単な例になっていますが、実際の数字の組み合わせは
数も多くかなり複雑です。

私にとって一行で記述できるメリットは、とても大きいです。
教えて頂いた正規表現で、とても見やすくなりました。
ありがとうございました。

[ ]