HmJre.dll の「?」No.12369
Iranoan さん 06/03/31 13:23
 
 秀まるおさん今日は、Iranoan です。
 検索文字列に「<(.+?)?>」を指定して、正規表現で検索したときに、「<>」
は検索できるのですが、それ以外の「<」と「>」に挟まれた文字列が検索でき
ません。私の指定方法が悪いのでしょうか?
 また「<(|.+?)>」で検索は出来るのですが、最短一致になりません。例えば、
このメールの 2 行目の改行を削除すると、2 行目末の「<>」だけでなく、2〜
3 行に渡って検索にヒットします。
 HmJre.dll は Ver.1.77 です。

 P.S http://www.maruo.co.jp/turukame/1/ で例に上げた検索は、現在も出
来ますが、正規表現による文字列の否定と絞り込み自体は、将来的な拡張とし
て残っていますよね。

[ ]
RE:12369 HmJre.dll の「?」No.12370
たけのこ さん 06/03/31 13:47
 
こんにちは、たけのこです。

> 検索文字列に「<(.+?)?>」を指定して、正規表現で検索したときに、「<>」
>は検索できるのですが、それ以外の「<」と「>」に挟まれた文字列が検索でき
>ません。私の指定方法が悪いのでしょうか?

ウチも1.77ですが、たとえば<p>とははヒットしますよ?+?はものぐさ指定です
から、結果的には「<>内に何か一字あるか否か」ですよね? 正規表現としては
“<.?>”に等価。

> また「<(|.+?)>」で検索は出来るのですが、最短一致になりません。例えば、
>このメールの 2 行目の改行を削除すると、2 行目末の「<>」だけでなく、2〜
>3 行に渡って検索にヒットします。
> HmJre.dll は Ver.1.77 です。

これも当たり前じゃないですか? 空文字と.+?(ものぐさ)の論理和なので、
ヒットするのは“<>”か“<.+?>”(ものぐさ)のどっちかの「最長一致」なの
で、この例では後者でしょう。



イマイチ、云いたいことが掴めていないのかもしれませんが。

では! (^v^)/~

[ ]
RE:12370 HmJre.dll の「?」No.12371
Iranoan さん 06/03/31 14:45
 
 たけのこさん今日は、Iranoan です。
> ウチも1.77ですが、たとえば<p>とははヒットしますよ?
 ヒットしますね(^^;。「<(.+?)?>」自体にヒットしないので、「<」と「>」
に挟まれた全ての文字列、と思っていましたが、そうではないようです???
 ##パッと見、<> の間に、括弧や引用符があると駄目?

> これも当たり前じゃないですか? 空文字と.+?(ものぐさ)の論理和なので、
> ヒットするのは“<>”か“<.+?>”(ものぐさ)のどっちかの「最長一致」なの
> で、この例では後者でしょう。
 それなら、
<>」は検索できるのですが、それ以外の「<」と「>
の場合、全体ではなく、``<>'' と ``<」と「>'' の各々にヒットすると思い
ました。しかし「<.+?>」も全体にヒットしますね。「<.*?>」だと、それぞれ
別々にヒットするので、ひょっとして最初の「>」まで「.+」の一部として
ヒットするのでしょうか? それなら一応納得ですが、他のツールでも同じ動き
なのか不安ですね。

[ ]
RE:12371 HmJre.dll の「?」No.12372
たけのこ さん 06/03/31 14:53
 
こんにちは、たけのこです。

>ました。しかし「<.+?>」も全体にヒットしますね。「<.*?>」だと、それぞれ
>別々にヒットするので、ひょっとして最初の「>」まで「.+」の一部として

.+?……1文字以上のものぐさ
.*?……0文字以上のものぐさ

なので、< >は前者ではヒットしないだけでは?



まだ話がかみ合ってません?

では! (^v^)/~

[ ]
RE:12372 HmJre.dll の「?」No.12373
たけのこ さん 06/03/31 14:59
 
こんにちは、たけのこです。

>なので、< >は前者ではヒットしないだけでは?

ああっ、ちょっと確認でスペース入れてそのまま送ってしまいました。“<>”で
す。

では! (^v^)/~

[ ]
RE:12372 HmJre.dll の「?」No.12374
アルビレオ さん 06/03/31 15:46
 
アルビレオです。
ちょっとこちらでもテストしました

<abc> という文字列に対して、<(.+?)> だとヒットするのに <(.+?)?> だとヒッ
トしません。この2つの違いを説明できるかどうかがポイントだと思います。

このケースに限ればたけのこさんの書かれたように <.*?> で解決することです
が、ちょっと気になる動作ではありますね。

[ ]
RE:12374 HmJre.dll の「?」No.12376
たけのこ さん 06/03/31 16:35
 
こんにちは、たけのこです。

><abc> という文字列に対して、<(.+?)> だとヒットするのに <(.+?)?> だとヒッ
>トしません。この2つの違いを説明できるかどうかがポイントだと思います。

なるほど、そういう意味でしたか。
手元のLinuxPDAのegrepコマンドで試してみたところ、“<(.+?)?>”のパターン
は“<abc>”にも“<>”にもヒットしますね。

では! (^v^)/~

[ ]
RE:12374 HmJre.dll の「?」No.12377
秀まるお さん 06/03/31 16:54
 
 <(.*)?> が、 <abc> にヒットしない理由はそれなりにあるんですが、これは
これでバグということで直すべきかどうか、JRE32.DLLではうまくヒットするよ
うなので、やはり直すべきのような気がします。

 ちなみにですが、

 <([^>]*)?>

 のようにすると成功しますが。

 直すつもりで検討してみます。

[ ]
RE:12377 HmJre.dll の「?」No.12378
秀まるお さん 06/03/31 18:10
 
 っと直してますが……難しいです。

 ちなみにBRegIf.dll(+BRegExp.dll)を使って、

 <(.*)*>

 を検索して、<abc>にヒットさせようとしたら、秀丸エディタが消えてしまい
ました。試しにサクラエディタでやってみたら同じく消えました。

 あと、

 <abc> >

 という文字列に対して <(.*)??> で検索したら、<abc>がヒットしそうと思い
つつも、BRegIf.dllだと<abc> > がヒットしてしまうようです。

 他にもいろんな多重ループパターンでBRegIf.dllがうまくいかないケースは
多々あると思うし、僕もうまく対応できないケースが多々出てくると思います。

 一応、直せる所までは直そうと思います。

[ ]
RE:12377 HmJre.dll の「?」No.12379
Iranoan さん 06/03/31 18:28
 
 秀まるおさん今日は、Iranoan です。
>  <(.*)?> が、 <abc> にヒットしない理由はそれなりにあるんですが、
<snip>
>  直すつもりで検討してみます。
 有り難うございます。

> 正規表現による文字列の否定と絞り込み
も気長に待ちます。

[ ]
RE:12379 HmJre.dll の「?」No.12382
秀まるお さん 06/04/01 16:24
 
 っということである程度は直してみたんですけど、どうしても直せないパター
ンもありまして、やはりここは中途半端に直すよりは、現状のままを仕様とした
方がすっきりすると思いました。性能的にも、直せば直す程遅くなるし。

 つまり、可変長にマッチするパターンをさらに可変長マッチで囲んでやるよう
なケースでは、そのパターンの指定の仕方によってはうまくヒットしないことが
あるってことになります。

 最初にあった、<(.+?)?> のパターンは、 <.*?> で代替出来ると思います。

 <(|.+?)> については、こちらでテストした限りは最短一致でうまくヒットす
るような気がします。例えば <AAA> <BBB> って文字列で検索させると、<AAA>と
<BBB>の2つ別々にヒットします。

[ ]
RE:12382 HmJre.dll の「?」No.12383
Iranoan さん 06/04/01 22:14
 
 秀まるおさん今日は、Iranoan です。
>  つまり、可変長にマッチするパターンをさらに可変長マッチで囲んでやるよう
> なケースでは、そのパターンの指定の仕方によってはうまくヒットしないことが
> あるってことになります。
 う〜ん、ちょっと困りました。
>  最初にあった、<(.+?)?> のパターンは、 <.*?> で代替出来ると思います。
 これは確かにできるのですが、元々は HTML の <h1> 等の検索で、
<h1>ほにゃらら</h1>

<h1 class="〜">ほにゃらら</h1>
の両方の場合で、「ほにゃらら」の部分だけにヒットさせたい。更に
<a name="〜"> を付けていることもあるので、
<h1([ \t].+?)?>(<a([ \t].+?)>)?(.+?)(</a>)?(</h1>|$)(?\3)
で試しました。その結果、後者がヒットしないので、お聞きしました。
(<h1[ \t][^>]+>|<h1>)(<a([ \t].+?)>)?(.+?)(</a>)?(</h1>|$)(?\3)
とするしかないですかね。ただこうしても、最後に具体例を記載しますが、思
い通りの最短一致にならないケースが出てきます。

>  <(|.+?)> については、こちらでテストした限りは最短一致でうまくヒットす
> るような気がします。例えば <AAA> <BBB> って文字列で検索させると、<AAA>と
> <BBB>の2つ別々にヒットします。
 間に文字がある文字列だけなら上手くいきます。しかし <> <AAA> <BBB> だ
と、「<>」「<AAA>」「<BBB>」とそれぞれ別々ではなく、「<> <AAA>」と
「<BBB>」になります。HTML のタグの場合、
                  ..........
<h1>ほにゃらら<h1>ほにゃらら</h1>
    ~~~~~~~~~~~~~~~~~~~~~~~~
は希望としては、傍点部にヒットして欲しいのに波線部にもヒットします。
 まあこれは、HTML として文法ミスなのですが(^^;。

 やりたいことができそうでできない歯痒さはありますが、やりたいことと現
状の報告にとどめ、これ以上は秀まるおさんにお任せします。

[ ]
RE:12383 HmJre.dll の「?」No.12384
秀まるお さん 06/04/01 23:26
 
 (...)? および(...)?? については対応出来たんですけど、(...)* および
(...)+ の時にとんでもなく処理が複雑かつ重くなりそうで挫折したんですけど
…。

 とりあえず、(...)?と(...)??についてだけ対応しようかなぁと。ただし、

 <(.+?)?>

 はダメで、たぶIranoanさんの期待する動作にするには、

 <(.*)??>

 と書いてもらわないとダメでして…。っという中途半端な仕様が残ってしまう
から、結局対応しない方がいいかなぁと思ったりした訳ですが。

 ちょっと僕もIranoanさんのやろうとしてることを理解してない所があるしあ
んまり深く考えて結論づけた訳でもないので、もうちょっと考えてみます。

 (て、ちょっと考えて分かる程度の話じゃないから乗り気じゃない訳だけど)

[ ]
RE:12383 HmJre.dll の「?」No.12385
秀まるお さん 06/04/01 23:47
 
 とりあえず今回のケースについてですが、

> <h1>ほにゃらら</h1>
> と
> <h1 class="〜">ほにゃらら</h1>
> の両方の場合で、「ほにゃらら」の部分だけにヒットさせたい。

 (<h1(|[ \t]+.+?)>)(.*)(</h1>)(?\2)

 でいいと思うし、こっちの方がシンプルだし高速になります。

>                   ..........
> <h1>ほにゃらら<h1>ほにゃらら</h1>
>     ~~~~~~~~~~~~~~~~~~~~~~~~
> は希望としては、傍点部にヒットして欲しいのに波線部にもヒットします。

 (?<=<h1(|[ \t]+.+?)>)(?!.*<h1(|[ \t]+.+?)>)(.*)(?=</h1>)

 で一応表現は出来ると思います。

[ ]
RE:12385 HmJre.dll の「?」No.12386
Iranoan さん 06/04/02 02:30
 
 秀まるおさん今日は、Iranoan です。
>  とりあえず、(...)?と(...)??についてだけ対応しようかなぁと。ただし、
 今回はそれで十分です。ただ、
>  <(.+?)?>
>
>  はダメで、たぶIranoanさんの期待する動作にするには、
という中途半端な仕様が残ってしまうなら、現状のままでも構いません。
 あくまで将来的にですが、絞り込みと文字列否定が出来た方嬉しいです。こ
ちらの方が解りやすく記述できそうなので。

>  (<h1(|[ \t]+.+?)>)(.*)(</h1>)(?\2)
 0 回以上の場合は、(.*?) を使った方が良いんですね。

> > <h1>ほにゃらら<h1>ほにゃらら</h1>
> >     ~~~~~~~~~~~~~~~~~~~~~~~~
> > は希望としては、傍点部にヒットして欲しいのに波線部にもヒットします。
>
>  (?<=<h1(|[ \t]+.+?)>)(?!.*<h1(|[ \t]+.+?)>)(.*)(?=</h1>)
 前方/後方一致/不一致をすっかり忘れていました(^^;。
 ただ先の投稿で書いたとおり、<h1><a name="hoge">...</a> </h1> とする
こともあるので、
(?<=<h1(|[ \t]+.+?)>)(?!.*<h1(|[ \t]+.+?)>)(<a([ \t]+[^>]*?)>)??(.*?)
(</a>)?(</h1>|$)(?\2)
とした (本当は一行。以下これを「文字列 A」とします。) のですが、
                                 ..........
<h1>ほにゃらら<h1><a name="hoge">ほにゃらら</a></h1>
                  ~~~~~~~~~~~~~~~~~~~~~~~~~
に対して、傍点部だけでなく波線部に成りますね。タグとしては不一致部分は
数に入れられないとして、
(?<=<h1(|[ \t]+.+?)>)(?!.*<h1(|[ \t]+.+?)>)(<a([ \t]+[^>]*?)>)??(.*?)
^^^^^^^^?\1^^^^^^^^^^                      ~~~~~~~~?\2~~~~~~~~~~^?\3^
(</a>)?(</h1>|$)
~?\4~  ^^^?\5^^^
と思い、「文字列 A」で (?\2)→(?\3) ともしてみたのですが、駄目ですね。
前方/後方一致/不一致と一緒に使うことは想定外なんでしょうね(^^;。一応、
ご報告だけしておいて、あとは自分や他の実際の表記法との兼ね合いで適当な
表記方法を、自分で考えてみます。どうも有り難うございました。

[ ]
RE:12386 \f と (?\tag-number) の組み合No.12387
Iranoan さん 06/04/02 15:23
 
 秀まるおさん今日は、Iranoan です。
> (?<=<h1(|[ \t]+.+?)>)(?!.*<h1(|[ \t]+.+?)>)(<a([ \t]+[^>]*?)>)??(.*?)
> (</a>)?(</h1>|$)(?\2)
 タグによる指定で、\f による方法もあることを思い出して、
(?<=<h1(|[ \t]+.+?)>)(?!.*<h1(|[ \t]+.+?)>)(<a([ \t]+[^>]*?)>)??
\f.*?\f(</a>)?(</h1>|$)(?\1)
を試した (実際は一行) のですが、秀丸エディタ、秀丸メールのどちらも固
まってしまいます。\f は置換の時使えるだけで、それを (?\1) と組み合わせ
て検索で使ったのが悪いのですが、念の為ご報告しておきます。

[ ]
RE:12386 HmJre.dll の「?」No.12390
秀まるお さん 06/04/02 21:12
 
>  あくまで将来的にですが、絞り込みと文字列否定が出来た方嬉しいです。こ
> ちらの方が解りやすく記述できそうなので。

 実は(?\tag-number)の構文を導入して失敗したなぁと思っていたりしまして…。
これを使わなくても、前方一致/後方一致指定で足りる話なので。

 現状で表現不可能な物があるなら別ですが、現状で表現可能な物を、また別の
ルールでも表現できるように(しかも独自構文で)ってのはなるべくやらない方
がいいんじゃないかと思います。

 絞り込みは後方一致指定で指定できるし、文字列否定は後方不一致指定で指定
できると思います。

[ ]
RE:12390 HmJre.dll の「?」No.12392
Iranoan さん 06/04/02 23:16
 
 秀まるおさん今日は、Iranoan です。
>  現状で表現不可能な物があるなら別ですが、現状で表現可能な物を、また別の
> ルールでも表現できるように(しかも独自構文で)ってのはなるべくやらない方
> がいいんじゃないかと思います。
 確かにこれはありますね。

>  絞り込みは後方一致指定で指定できるし、文字列否定は後方不一致指定で指定
> できると思います。
 後方一致/不一致は複数指定できるのでしょうか? それなら確かに現状で、
殆どできますね。
 ただ
<h1>ほにゃらら<h1><a name="hoge>ほにゃらら</a></h1>
で後の「ほにゃらら」だけにヒットさせる方法が現在は無いようです。取り敢
えず、今回は妥協して
<h1(|[ \t].+?)>(<a([ \t].+?)>)?(.+?)((</a>)?</h1>|$)(?\3)
を使うので問題ないです。

[ ]
RE:12392 HmJre.dll の「?」No.12393
Iranoan さん 06/04/03 01:03
 
 秀まるおさん今日は、Iranoan です。
> <h1>ほにゃらら<h1><a name="hoge>ほにゃらら</a></h1>
> で後の「ほにゃらら」だけにヒットさせる方法が現在は無いようです。
 すいません、できますね。
(?<=<h1(|[ \t]+.+?)>(|<a([ \t].+?)>))(?!.*<h1(|[ \t]+.+?)>)(.*)
(?=(|</a>)</h1>)
とすれば良いですねm(__)m。

[ ]