hmjre.dllでは () の入れ子に非対応?No.35615
でるもんたいいじま さん 17/02/26 09:49
 
いつもお世話になっております。
でるもんた・いいじまです。

ひとつ仕様の確認をさせてください。
hmjre.dllでは括弧 (…) の入れ子には対応していないように見えますが、
そういう仕様なのでしょうか?
それとも、私が何か勘違いをしていますでしょうか?

サンプル例です。たとえば
  ●第1章 まえがき
  ●第2章 先行研究
という原文を
  <h1><a name="chapter1">第1章 まえがき</a></h1>
  <h1><a name="chapter2">第2章 先行研究</a></h1>
に置換したいとします。

この場合、
  検索(S):^●(第(\d+)章[\s ]+.+)$
  置換(E):<h1><a name="chapter\2">\1</a></h1>
という正規表現置換をかけると、
  <h1><a name="chapter">第1章 まえがき</a></h1>
  <h1><a name="chapter">第2章 先行研究</a></h1>
という結果が出ます。つまり、(\d+) の部分が \2 に取り込まれてはいません。

このケースの場合はたとえば
  検索(S):^●第(\d+)(章.+)$
  置換(E):<h1><a name="chapter\1">第\1\2</a></h1>
のように置換をかける必要があります。

jre32.dllのAPIとの互換性を考えると仕方がないようにも思いますが、
Perlなどとは違う挙動ですので、ぜひともヘルプに明記しておいて
いただければと思います。

P.S.
今回動作確認をした環境は
  OS:Windows XP SP3 32bit版
  秀丸:8.71β1日本語版
  DLL :hmjre.dll 5.00
ですが、もっと前から同じ挙動だったような気がします。

[ ]
RE:35615 hmjre.dllでは ()の入れ子に非対No.35617
h-tom さん 17/02/26 11:37
 

h-tom です。

>ひとつ仕様の確認をさせてください。
>hmjre.dllでは括弧 (…) の入れ子には対応していないように見えますが、
>そういう仕様なのでしょうか?
括弧によるタグ付き正規表現に対応した10年以上前から、そういう仕様です。

>タグの対象となるのはあくまで一番ネストの浅いカッコだけなので、例えば、
>
>(aaa|(bbb|ccc))
> と指定した場合には、それ全体が\1に相当し、\2、\3に該当する物は存在
>しないことになります。
と、hmjreや秀丸エディタのヘルプにも記載されています。

>jre32.dllのAPIとの互換性を考えると仕方がないようにも思いますが、
jre32.dllのAPIは関係ないです。"\f"を使ったタグ付き正規表現との互換性の
問題。

[ ]
RE:35617 hmjre.dllでは ()の入れ子に非対No.35620
秀まるお2 さん 17/02/27 11:53
 
 h-tomさんの話の通りなんですが、追加でコメントさせていただきます。

  検索(S):^●(第(\d+)章[\s ]+.+)$
  置換(E):<h1><a name="chapter\2">\1</a></h1>

 これを実現するためには、

  検索(S):^●(第)(\d+)(章[\s ]+.+)$
  置換(E):<h1><a name="chapter\2">\1\2\3</a></h1>

 のようにしていただければ大丈夫だと思います。

 あと、

 (xxx(yyyy)zzz)

 のようなケースの内側の括弧をタグで指定したい場合は、

 (?:xxx(yyyy)zzz)

 のように指定する方法があります。

[ ]
RE:35620 hmjre.dllでは ()の入れ子に非対No.35621
秀まるお2 さん 17/02/27 13:42
 
>  のようにしていただければ大丈夫だと思います。

 すみません。最初の発言に既に回避策がありました。余計でした。

[ ]
RE:35617 hmjre.dllでは ()の入れ子に非対No.35640
でるもんたいいじま さん 17/03/02 23:08
 
でるもんた・いいじまです。

>>hmjre.dllでは括弧 (…) の入れ子には対応していないように見えますが、
>>そういう仕様なのでしょうか?
> 括弧によるタグ付き正規表現に対応した10年以上前から、そういう仕様です。

ありがとうございます。
実はその時期には身辺に色々とありまして、当時のことはよく覚えていません。
会議室の過去ログはメールの形で全部手元にあるはずですが…。

>>タグの対象となるのはあくまで一番ネストの浅いカッコだけなので、例えば、
>>(aaa|(bbb|ccc))
>>と指定した場合には、それ全体が\1に相当し、\2、\3に該当する物は存在
>>しないことになります。
> と、hmjreや秀丸エディタのヘルプにも記載されています。

確認できました。ありがとうございます。

>>jre32.dllのAPIとの互換性を考えると仕方がないようにも思いますが、
> jre32.dllのAPIは関係ないです。"\f"を使ったタグ付き正規表現との
> 互換性の問題。

失礼しました。C言語レベルのAPIは確かに関係なさそうですね。
おっしゃる通り、\f 方式から移行する際の互換性の問題ですね。

#ポインタ(かメモリハンドル)を書き込んでもらうための配列をDLLに渡して
#\0〜\9 の所在地をその配列に返してもらう、といった関数があれば話は
#別ですが、たぶんそういう関数は存在しないでしょうね…。

☆ ☆ ☆

以下は担当さんに要望です。

この「内側の括弧はカウントしない」という仕様は他社の正規表現エンジンと
大きく違う点ですので(手元で確認した限りでは、ActivePerl 5.18、msys 1.0の
sed、IE8のJScriptあたりは内側の括弧もカウントします)、ヘルプでもう少し
強調していただけると嬉しいです。

具体的な箇所としては、上記でh-tomさんが引用された
  hidemaru_html.chm::/html/190_CmdSearch_Regular_PerlTag.html
    一般的正規表現互換のタグ付き正規表現
  hmjre.chm::/html/0003_ABOUT_REGULAR.html#tag
    一般的正規表現互換のタグ付き正規表現
の2箇所になると思います。あと、
  hidemaru_html.chm::/html/190_CmdSearch_Regular_Peren.html
    パーレン
からも190_CmdSearch_Regular_PerlTag.htmlへのリンクがあったほうが
いいと思います。

この部分を強調するための一番安直な解は当該ファイルの「タグの対象と
なるのはあくまで一番ネストの浅いカッコだけ」という文言を太字にして
しまうことですが、ヘルプファイル全体のスタイルの整合性を考えると、
別の表現方法のほうがいいのでしょうかね?

[ ]
RE:35640 hmjre.dllでは ()の入れ子に非対No.35644
秀丸担当 さん 17/03/03 09:57
 

確かにヘルプはわかりづらいかもしれません。
パーレンのページからのリンクや、太字にするなど、改善したいと思います。

[ ]