正規表現の語の区切り演算子についてNo.02792
れいや さん 03/08/19 16:00
 
β14+HMJRE.DLL V0.12を使用してます。

C言語用の強調表示として、
void
void *
がマッチする正規表現を書きました。
条件は
・voidの前方に空白タブが入っても良い。
・voidと*の間は複数の空白タブが入っても良い。
・voidの文字列が混ざっているものにはヒットしない。

と、いうことで、

^(\s|\t)*void(\s|\t)*(\*)*\b

という正規表現を書きました。
\sは\x20で代用できるのですが\b(もしくは\y)がないのが致命的です。

語の区切りにマッチする演算子のサポート予定はあるのでしょうか?
一応サポートを希望します。

[ ]
RE:02792 正規表現の語の区切り演算子につNo.02803
秀まるお さん 03/08/19 18:45
 
> 語の区切りにマッチする演算子のサポート予定はあるのでしょうか?
> 一応サポートを希望します。

 技術的にはたぶん難しくないと思うので、んではサポートするってことにしま
す。

[ ]
RE:02792 正規表現の語の区切り演算子につNo.02805
秀まるお さん 03/08/19 18:57
 
 今直してコンパイルが通っただけの状態ですが、

 (\<|\>)

 と書いても同じことみたいです。

[ ]
RE:02803 正規表現の語の区切り演算子につNo.02811
れいや さん 03/08/20 00:53
 
> 技術的にはたぶん難しくないと思うので、んではサポートするってことにしま
>す。

対応有り難う御座います。
(\<|\>)でも出来ることを確認しました。
ただ、void *と書いただけではマッチしないですね。
void *に何か続く単語を記述した後に*までカラー表示されるみたいです。perlで\b
にして試したところvoid *だけでもマッチしたので、そういう挙動だと嬉しいのです
が…。
(正規表現も方言が激しいので秀丸仕様と言われてしまうとそれまでなのですが^^;)

できないと他のポインタ変数も全滅になるんですよね…。
だとすると困りますというか、残念になってしまいます。

余談ですが↑のテストは
(\b)void(\s|\t)*(\*)*\b
こんな正規表現でテストしました。
最初に投稿した正規表現だとstd::vector<void *> がマッチしなかったので…。

[ ]
RE:02811 正規表現の語の区切り演算子につNo.02812
アルビレオ さん 03/08/20 04:19
 
単なるユーザーのアルビレオです。

>(\b)void(\s|\t)*(\*)*\b
>こんな正規表現でテストしました。
>最初に投稿した正規表現だとstd::vector<void *> がマッチしなかったので…。

これって、Perlでもマッチしないのでは?
実際に動作を確認したわけではないですが、手元にあるPerl 5のマニュアルでは
「英数字または'_'」と「それ以外の文字」の境界を「単語の境界」とするよう
です。
そうなると'*'と'>'の間が'\b'にマッチすることはなさそうなのですが。

というわけで、元の正規表現では

^(\s|\t)*void(\s|\t)*(\*)*\b

となっていますが
・最後の \b は不要、というかあったら困る
・(\s|\t)* は [ \t]* と同等
なので、

^[ \t]*void[ \t]*(\*)*

とすれば秀丸でもPerlでもまったく同一の記述ができます。

(\b)void(\s|\t)*(\*)*\b
の方は
(\<)void[ \t]*(\*)*
でいい。こちらはPerlの場合'\<'を'\b'に置き換えることになります。

れいやさんが望んでいることを正しく把握していないような気もするので
この書き方でまずい場合があったら指摘をお願いします。

[ ]
RE:02812 正規表現の語の区切り演算子につNo.02820
れいや さん 03/08/20 15:02
 
>>(\b)void(\s|\t)*(\*)*\b
>これって、Perlでもマッチしないのでは?

単語単位まで厳密にチェックはしてませんでした。
確かにマッチしませんね。

>・最後の \b は不要、というかあったら困る
>・(\s|\t)* は [ \t]* と同等
>なので、
>
>^[ \t]*void[ \t]*(\*)*
>
>とすれば秀丸でもPerlでもまったく同一の記述ができます。
>
>(\b)void(\s|\t)*(\*)*\b
>の方は
>(\<)void[ \t]*(\*)*
>でいい。

元発言をきちんと読んでご理解して頂ければわかるかと思うのですが…。
(\<)void[ \t]*(\*)*に似たような正規表現は一番最初に書きました。
結論は駄目です。

これだとvoidpfにマッチします。

当初std::vector<void*>のようなのは想定していなくて、正規表現の頭に^がついて
いたのですが変更しました。

友達と色々と熟考した結果、
(\bvoid\s*\**)\s*(\b|>)
が一番私の要求に近いかなと言う話に落ち着きました。

後は秀丸の方で実現ができるかという話になります^^;
実現していただけるとうれしい限りです。

[ ]
RE:02820 正規表現の語の区切り演算子につNo.02824
秀まるお さん 03/08/20 18:36
 
 現在公開しているHmJre.dllでは後方一致/後方不一致指定も使えるので、そ
れを使えば、特に強調表示に関してはかなり協力な手助けになると思います。

 具体的にどういう式を指定すればいいかまではアドバイスできませんけど。

    \<void[ \t]*\**[ \t]*(?![A-Za-z_])

 とかならいいかなぁと思ったりして。ダメならダメですけど。

[ ]
RE:02820 正規表現の語の区切り演算子につNo.02825
アルビレオ さん 03/08/20 21:25
 
アルビレオです。

>元発言をきちんと読んでご理解して頂ければわかるかと思うのですが…。
>(\<)void[ \t]*(\*)*に似たような正規表現は一番最初に書きました。
>結論は駄目です。
>
>これだとvoidpfにマッチします。

理解自体は間違っていなかったようですが、最終的にはれいやさんの場合とと同
じような見落としをしてしまったようです。

>友達と色々と熟考した結果、
>(\bvoid\s*\**)\s*(\b|>)
>が一番私の要求に近いかなと言う話に落ち着きました。

(\bvoid\s*\**)\s*(\b|>)
と同等のものなら
\<void *\** *(\<|\>|>)
でいけますよ。
どちらにしろ、うしろの空白や'>'にまでマッチしてしまうのが気に入らないん
ですが。

Perlでも秀丸でも、無理をしないで2種類に分けて記述した方がいいように思い
ます。
Perl:
 \bvoid\b
 \bvoid([\s\t]*\*)+
秀丸:
 \<void\>
 \<void([ \t]*\*)+
こちらでテストした限りではきちんとマッチしてくれています。
もちろん2つをミックスした
Prel: \bvoid(\b|([ \t]*\*)+)
秀丸: \<void(\>|([ \t]*\*)+)
も可能ですが、1つの正規表現で全てに対応しようとすると、あとで見たときに
何をやってるのか自分でもわからなくなりやすいです。

>後は秀丸の方で実現ができるかという話になります^^;
>実現していただけるとうれしい限りです。

今までにれいやさんの挙げた「秀丸の方で実現して欲しいこと」は「今の秀丸で
はできないこと」にはどうしても思えないんですが。
単に表記としてPerl風のものを追加してほしいという話なんでしょうか?

[ ]
RE:02824 正規表現の語の区切り演算子につNo.02829
れいや さん 03/08/21 13:04
 
お返事ありがとうございます。

>    \<void[ \t]*\**[ \t]*(?![A-Za-z_])

問題がなかったら[ \t]の代わりになる\sとかもサポートしていただきたいのです。
単純に可読性の問題なので、しないという意向ならあきらめます。

#ちなみに↑はvoid *aとか書くと*がマッチしません。
#自分の書いた(\<void[ \t]*\**)[ \t]*(\<|\>|>)も>が
#色ついてしまって、perlとの挙動の違いにちょっと悩み中です。


[ ]
RE:02829 正規表現の語の区切り演算子につNo.02839
秀まるお さん 03/08/22 18:23
 
 一応ダメもとでもう1つ作ってみました。

    (\<void[ \t]*\*+)|(\<void(?![a-zA-Z_*]))

> 問題がなかったら[ \t]の代わりになる\sとかもサポートしていただきたいのです。

 んではサポートするってことで、一通りPerlの正規表現を調べてみます。

 (たぶん他にもいろいろあったと思う)

[ ]
RE:02839 正規表現の語の区切り演算子につNo.02840
秀まるお さん 03/08/22 18:29
 
>  んではサポートするってことで、一通りPerlの正規表現を調べてみます。

 っとコメントした所でなんですが、「\w」について、JRE32.DLLが独自の仕様
であるために、他の「\s」なども(誤解されるとよくないということで)対応し
ないという話をしたことがありました。

 ということで、やはり\s類への対応はやめておきます。

[ ]
RE:02840 正規表現の語の区切り演算子につNo.02844
れいや さん 03/08/23 14:12
 
> ということで、やはり\s類への対応はやめておきます。

了解しました。
互換性を考慮しつつ作るのは大変でしょうけど、頑張ってください。

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

[ ]
RE:02839 正規表現の語の区切り演算子につNo.02845
れいや さん 03/08/23 15:40
 
> 一応ダメもとでもう1つ作ってみました。
>
>    (\<void[ \t]*\*+)|(\<void(?![a-zA-Z_*]))

こちらを試してみました。
良い感じで使えていますので、早速使わせていただきます。

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

[ ]
RE:02803 正規表現の語の区切り演算子につNo.02914
Iranoan さん 03/08/31 01:16
 
 秀まるおさん今日は、Iranoan です。
>  技術的にはたぶん難しくないと思うので、んではサポートするってことにしま
> す。
 折角サポートして頂いた「\b」ですが、これは「(\<|\>)」で代用できるこ
とですし、正式版では止めた方がよさそうです。理由は、ヘルプに記載があり
ますが、
> \b  バックスペース(文字コード8)
というように JRE32.DLL と非互換性になってしまいます。普段のテキスト作
成では、殆ど使われないでしょうが、バックスペースを「^H」で表すと、
強^H^H強調^H^H調表^H^H表示^H^H示
s^Hst^Htr^Hro^Hon^Hng^Hg
下^H^H__線^H^H__表^H^H__示^H^H__
u^H_n^H_d^H_e^H_r^H_l^H_i^H_n^H_e^H_
というデータで、一部のテキスト・ヴューワで可能な特殊な修飾をされたテキ
スト作成に使われているかもしれません。

[ ]
RE:02914 正規表現の語の区切り演算子につNo.02936
秀まるお さん 03/09/05 11:27
 
 \bがJRE32.DLLで使っていたとは知りませんでした。んではやはりサポートし
ないってことでお願いします。>れいやさん

[ ]
RE:02936 正規表現の語の区切り演算子につNo.02941
Iranoan さん 03/09/05 12:53
 
 秀まるおさん今日は、Iranoan です。
>  \bがJRE32.DLLで使っていたとは知りませんでした。んではやはりサポートし
> ないってことでお願いします。>れいやさん
 れいやさんにはお気の毒ですが、宜しくお願いします。

[ ]