[HOME]  [リストへもどる]
一括表示

  掲示板新機能、タイトルが変わらない記事を省略して表示 - konno 12/12/01-01:10 No.6099
  ┗ 記憶力低下補完計画 - konno 13/01/11-01:21 No.6205
   ┗ Re: 記憶力低下補完計画 - 文太 13/01/11-16:59 No.6206
    ┗ Re^2: 記憶力低下補完計画 - konno 13/01/12-02:13 No.6211
     ┗ 畳み込み正規表現(愚直がベスト) - 文太 13/01/12-12:04 No.6212
      ┣ Re: 畳み込み正規表現(愚直がベスト) - konno 13/01/12-22:19 No.6213
      ┃┗ Re^2: 畳み込み正規表現(愚直がベスト) - 文太 13/01/13-00:05 No.6214
      ┃ ┗ Re^3: 畳み込み正規表現(愚直がベスト) - konno 13/01/13-01:55 No.6215
      ┃  ┗ Re^4: 畳み込み正規表現(愚直がベスト) - 文太 13/01/13-13:24 No.6216
      ┃   ┗ 文字クラスの応用と罠 - 文太 13/01/13-16:17 No.6217
      ┃    ┗ Re: 文字クラスの応用と罠 - 文太 13/01/13-16:33 No.6218
      ┃     ┗ wingさんの苦悩(VzのRegex) - 文太 13/01/14-12:12 No.6220
      ┃      ┗ Re: wingさんの苦悩(VzのRegex) - konno 13/01/15-01:03 No.6221
      ┃       ┗ Re^2: wingさんの苦悩(VzのRegex) - 文太 13/01/15-12:52 No.6222
      ┃        ┗ 先頭でない正規表現文字列途中の「^」 - 文太 13/01/15-13:42 No.6223
      ┃         ┗ Re: 先頭でない正規表現文字列途中の「^」 - 文太 13/01/15-17:28 No.6224
      ┃          ┗ Re^2: 先頭でない正規表現文字列途中の「^」 - 文太 13/01/15-17:53 No.6225
      ┃           ┗ Re^3: 先頭でない正規表現文字列途中の「^」 - 文太 13/01/15-18:07 No.6226
      ┃            ┣ Re^4: 先頭でない正規表現文字列途中の「^」 - 文太 13/01/15-23:08 No.6227
      ┃            ┗ Re^4: 先頭でない正規表現文字列途中の「^」 - konno 13/01/17-00:04 No.6228
      ┃             ┗ Re^5: 先頭でない正規表現文字列途中の「^」 - 文太 13/01/18-00:03 No.6229
      ┗ 修正 - 文太 13/01/14-12:11 No.6219

(6099) 6099掲示板新機能、タイトルが変わらない記事を省略して表示  投稿者:konno   2012/12/01(土) 01:10
   コメント数 1

掲示板の新機能、はじめました。
リストスレッド表示2 (タイトルが変わらない記事を省略して表示)です。

画面上部の[スレ2]のリンクをクリックで表示がかわります。
以前の2ch風な表示から変更しました。

ということで、何の役に立つのか? と、思うかもしれませんが、
過去の記事を思い出せなくて、タイトルを見れば思い出すかも、という
場合などに助けになるかもしれません。
いわゆる記憶力低下に対する補完計画であります。

これで、話題が変わった時に適切なタイトルを付けるようになってくれる
効果も狙っています。(^^;

      - No.6099 -    このTreeへ           [リストへもどる] soft

(6099) 6205記憶力低下補完計画  投稿者:konno   2013/01/11(金) 01:21
    6099 番 konno さんへのコメント    コメント数 1

> リストスレッド表示2 (タイトルが変わらない記事を省略して表示)です。

バグがありました。
Re^11: のようにコメントが二けたになると対応できていませんでした。
スクリプトは

  $sub1 =~ s/^Re.[0-9]: //;
  $sub1 =~ s/^Re: //;

となっていましたが、

  $sub1 =~ s/^Re.[0-9]+: //;
  $sub1 =~ s/^Re: //;

このように、+ 追加で二桁対応できました。
誰かこの2行を1行に纏めてくれないかなぁ。(^^;

あと、ツリーの記事数も出してみました。
見た目はアレですが、結構お気に入りです。

      - No.6205 -    このTreeへ    コメント元:6099 へ [リストへもどる] pre

(6099) 6206Re: 記憶力低下補完計画  投稿者:文太   2013/01/11(金) 16:59
    6205 番 konno さんへのコメント    コメント数 1

konnoさん

 ここだけ、職場から。
 この機能、いいですね。見渡しがいい。
 ざっと見て、あまりタイトルを変えすぎると意味がない、と反省もしましたが。


      - No.6206 -    このTreeへ    コメント元:6205 へ [リストへもどる] soft

(6099) 6211Re^2: 記憶力低下補完計画  投稿者:konno   2013/01/12(土) 02:13
    6206 番 文太 さんへのコメント    コメント数 1

>  この機能、いいですね。見渡しがいい。

そうでしょう。特に物忘れが酷くなると、検索しようにもキーワードを忘れてたりして
途方にくれたり、切実なんですよね。(^^; ワタシダケ?

・・・というか、てっきり正規表現の素敵なサンプルを教えてくれるのかなと
期待して開いたのでした。(^^;

>  ざっと見て、あまりタイトルを変えすぎると意味がない、と反省もしましたが。

すみません、私もつい調子に乗って遊び過ぎてしまいました。反省します。m(__)m

ということで、キーワードを増やしておこう。

キーワード補完計画
アルツワード補完計画
想像力補完計画
新発想補完計画
記憶の断片補完計画
分類保管計画

# いよいよ、ワードインパクトが始まる!!

      - No.6211 -    このTreeへ    コメント元:6206 へ [リストへもどる] soft

(6099) 6212畳み込み正規表現(愚直がベスト)  投稿者:文太   2013/01/12(土) 12:04
    6211 番 konno さんへのコメント    コメント数 2

 正規表現ですが、以下の部分ですよね。

s/^Re.[0-9]+: //;
s/^Re: //;

 こういうのはどう考えても、2行で場合分けしてあるほうが、はっきりしてる
でしょう。

 1行目は、
s/^Re^[0-9]+: //;

 このほうが分かりやすいかもしれない。分かりにくいかもしれない。
 正規表現先頭文字以外の場所での「^」は、メタ文字でない。

 だとすると、【A】
s/^Re^[0-9]+: //;
s/^Re: //;

 なので、合わせて、【B】
s/^Re[^:][0-9 ]+:* *//;

 こうなれそうにも見えますが、甘いですね。誤ヒット率は高まってるうえに、
読みづらい。
 【A】では、2行それぞれできっちりパターンを最後まで調べてる。
 【B】では、[^:][0-9 ]ですでに誤ヒットの可能性が生まれてます。
    「:* *」なんてのも、なくてOKなわけだし。

 置換では、愚直が一番でしょう。


      - No.6212 -    このTreeへ    コメント元:6211 へ [リストへもどる] soft

(6099) 6213Re: 畳み込み正規表現(愚直がベスト)  投稿者:konno   2013/01/12(土) 22:19
    6212 番 文太 さんへのコメント    コメント数 1

>  こういうのはどう考えても、2行で場合分けしてあるほうが、はっきりしてる
> でしょう。

文太さん、ありがとうございます。私は慣れてないので思いつかないけど
皆さんはこのくらいならサクッと1行に纏めてしまうのかと思ってました。

> s/^Re^[0-9]+: //;
>  このほうが分かりやすいかもしれない。分かりにくいかもしれない。
>  正規表現先頭文字以外の場所での「^」は、メタ文字でない。

なるほど、深いですね。私は最初1行で纏めようとしていて上手く動かないので
この辺が問題かと思って「.」に変えていたようです。結局関係なかったのですね。

ということで、「Re^」に変更してみました。・・・が、Re^ のダブり行が
残るようになってしまいました。
どうやらniftyのPerl のバージョンではこの形式が使えないようですね、残念。

このルーチンはタイトルを加工して保持し、次のタイトルをまた加工して比較
というのを現行ログと過去ログそれぞれやっているので4カ所に使っています。
VZなら、「Re^」のところで[F5] と、[F7] で簡単に置き換え出来るので
使い慣れたVZが今でも一番という思いは揺るがないですね。

> s/^Re[^:][0-9 ]+:* *//;

これは私が見ても数字で始まるタイトルとか引っかかりそうに思いますものね。

>  置換では、愚直が一番でしょう。

やっぱり結論はこれですね。検索はもれなく、置き換えは確実に、ですね。

      - No.6213 -    このTreeへ    コメント元:6212 へ [リストへもどる] soft

(6099) 6214Re^2: 畳み込み正規表現(愚直がベスト)  投稿者:文太   2013/01/13(日) 00:05
    6213 番 konno さんへのコメント    コメント数 1

konnoさん

>正規表現先頭文字以外の場所での「^」は、メタ文字でない。
 ★これは間違いです。m(__)m

 す、すいません。メタ文字の打ち消しに関して、間違えました。
 [ ] の中に入ったら、「^」=否定が先頭でないならメタ文字の意味なし、が
正しかったです。ここでは関係なしです。
 行頭の意味の「^」じゃないよ、という意味では、ちゃんとメタ文字打ち消し
のために「¥」をおいてエスケープしてやる必要がありました。すいません。
 たぶん、perl のヴァージョンに依らないです。

C:\>type t.txt |to			;対象テキストの内容
a^					;先頭じゃないベタな「^」がある。

C:\>Jperl4 -pe "s/a\^/aa/" t.txt	;ver.4, メタ文字打ち消しの「¥」必要
aa

C:\>Onigsed -R -ne "s/a\^/aa/p" t.txt 	;ver.5, perl5-like regex。
aa

 失敗例は特に挙げませんでした。m(__)m

-----

 VWXでなく、Vzのメタ文字打ち消しもすごいです。つい先日の体験。

*.* --> \*.*

 この置換をするには、

検索文字列 置換文字列
\*.\*       \\\*.\*

 とするのが正解でした。
 そもそもなんで上の置換が必要になったかといういうと、メタ文字打ち消しを
忘れたから。入れたつもりの¥がなかったから。あは。
 正規表現の世界で「置換文字列」にメタ文字が存在するのは、「タグ付き置換」
の場合ぐらいなんですよ。

\x ^\([0-9]+\)章  -->  ★\1章	;もちろん「\1」が置換文字列の
				;特殊またはメタ文字。

 同じ失敗を繰り返しております。

 いずれにせよ、確かめもせずに、失礼しました。

      - No.6214 -    このTreeへ    コメント元:6213 へ [リストへもどる] pre

(6099) 6215Re^3: 畳み込み正規表現(愚直がベスト)  投稿者:konno   2013/01/13(日) 01:55
    6214 番 文太 さんへのコメント    コメント数 1

>  行頭の意味の「^」じゃないよ、という意味では、ちゃんとメタ文字打ち消し
> のために「¥」をおいてエスケープしてやる必要がありました。すいません。

そうすると、「^」が何処にあっても文字列の先頭の意味になるということですか。
ググってもその辺を具体的に説明しているページは見つけられませんでした。
また、説明に抜けか間違いがあると思われるページも結構あるような。

ところで、メタ文字の打消しからヒントを得て1行野郎が出来ました。\(^^)/ ヤッタ-

    $sub1 =~ s/^Re\^?[0-9]*: //;

確認したのは下記のツリーです。2行の物と同じ表示になっていると思います。

▼ - No.5846 - 新しいNIFTY-Serve - konno - 12/06/27-23:38 
    No.5862 - NIFTY-Serve Library - konno - 12/07/18-00:35 
    No.5865 - Re^8: 新しいNIFTY-Serve - としき - 12/07/22-20:02 
    No.5870 - 新しいNIFTYへの要望 - konno - 12/07/25-22:56 
    No.5873 - Re^11: 新しいNIFTY-Serve - K.TAM - 12/07/31-23:05 
    No.5902 - Re^3: Facebookはいらない - konno - 12/09/24-00:06 
    No.5848 - Re: 新しいNIFTY-Serve - konno - 12/07/01-21:58 
    No.6098 - 新しいNIFTY-Serveの新機能「ハンドル検索」 - konno - 12/11/29-01:26 
    No.6169 - NIFTY-Serveが@nifty IDでも登録可能に - konno - 12/12/26-00:32 
35 

>  いずれにせよ、確かめもせずに、失礼しました。

いえいえ、おかげさまで理解が少し深まった気がします。
付き合ってくださってありがとうございました。

      - No.6215 -    このTreeへ    コメント元:6214 へ [リストへもどる] pre

(6099) 6216Re^4: 畳み込み正規表現(愚直がベスト)  投稿者:文太   2013/01/13(日) 13:24
    6215 番 konno さんへのコメント    コメント数 1

konnoさん

>そうすると、「^」が何処にあっても文字列の先頭の意味になるということですか。
 うーん、そうっぽいのだけど、実験に成功しません。

@/I @/M @/S @/X
フラグ
 /I /M /S /X (onig|g|s)sedの拡張s///フラグ
g(s)sedの拡張s///フラグ
/M GNU sed 4.x and ssed add the /M switch, to simplify working with
 multi-line patterns: when it is used, ^ or $ will match BOL or EOL.
 \` and \' remain available to match the start and end of pattern
 space, respectively.

 とsed.shdにはあります。

 sedの複行で、^, $ の意味が変わるようにも読めるのですが。
 BOL: beginning of line
 EOL: end of line
 のはずで、パターンスペースの先頭と末尾と使い分けてるみたいなのですが。


>$sub1 =~ s/^Re\^?[0-9]*: //;

 なるほど! その通りですね。
/^Re \^?[0-9]* : /
ココ      ココ
 頭とお尻をきちんと押さえられれば、うまくいきそうですね。
 お見事!

 でも、今は「なるほど」と読めるけど、1週間後は、、、というのはあります
よね。
 読みやすさという意味では、オリジナル支持のままかなぁ。
 ま、頭の体操ということで。意外に深いぞ「^」。「\^」メタ文字の否定。
「^」が否定の意味を持ったりする場合もあったりして「[^abc]」。

      - No.6216 -    このTreeへ    コメント元:6215 へ [リストへもどる] soft

(6099) 6217文字クラスの応用と罠  投稿者:文太   2013/01/13(日) 16:17
    6216 番 文太 さんへのコメント    コメント数 2

konnoさん

 余計な付け足しです。最初にこれを考えていました。^ の代わりの .
 ええ、僕もメタ文字がどうなるのか正確に調べるのが面倒で「どうせ1文字だ、
"." でいいだろう。 えいっ」とやってしまうことがあります。メタキャラは処理
系で微妙に違うし、それをエスケープするやり方もけっこう微妙に違うし。

 掲示板用の perl スクリプトだと、正規表現のその箇所だけ調べるのは億劫な
んだろうなぁ、とか。

 で、そういうときに僕がよくやるのが [\.*?+^$]  なんて方法です。文字クラ
ス内ではメタキャラが意味を失う場合が多いからです。ほとんどそうなるでしょ
う、たぶん。
 ま、これもいい加減な話ですが。

 甘い。

@Character_class 

  ^...    negative class (lowest precedence operator)
  x-y     range from x to y
  [...]   set (character class in character class)
  ..&&..  intersection (low precedence at the next of ^)
    ex. [a-w&&[^c-g]z] ==> ([a-w] AND ([^c-g] OR z)) ==> [abh-w]
  * If you want to use '[', '-', ']' as a normal character
    in a character class, you should escape these characters by '\'.

 なるほど。そうだね、[,],- が真っ先にメタキャラになりますねぇ。
 Perl5の場合です。&&なんて、うげっ、ものですが。


 考えてみると、僕が正規表現にそれほど深く悩まないのは、こういうシステム
文字をあまり使わないからだ。プログラマ的な人にとっては、泣かせてくれるシ
ステムですね。とはいえ、何かの文字を特殊文字にしなければならず、その文字
自体もリテラルに残らざるを得ないのだから、しょうがないことなんだけど。

      - No.6217 -    このTreeへ    コメント元:6216 へ [リストへもどる] pre

(6099) 6218Re: 文字クラスの応用と罠  投稿者:文太   2013/01/13(日) 16:33
    6217 番 文太 さんへのコメント    コメント数 2

 独り言(Perl5)

[a-w&&[^c-g]z] ==> ([a-w] AND ([^c-g] OR z)) ==> [abh-w]
 あれ、オアとアンド、どっちが勝つんだ? 優先順位が高いんだ?
 答:オアです。

>yagrep -P "[a-w&&[^c-g]z]" t.txt(a-zの26行ファイル)
 これで、'z'は出てきません。

      - No.6218 -    このTreeへ    コメント元:6217 へ [リストへもどる] soft

(6099) 6220wingさんの苦悩(VzのRegex)  投稿者:文太   2013/01/14(月) 12:12
    6218 番 文太 さんへのコメント    コメント数 1

 VWX.DOCより。トリッキーな場所です。
 以下がちゃんとできているのかの、検証をする予定はありません。
 あんまり使わないところではあるでしょう。でも、そのような重箱の隅に
80%ぐらいのエネルギーを、プログラマは取られてしまうものなのでしょうね。

 それと、全半、大文字小文字同一視みたいな、そもそもの正規表現ではユーザ
が楽できるようにサポートされてないところも、VWX は担当してるたんだよな、
というのがつまらない発見でした。そんなの正規表現の守備範囲でないもの。も
ちろん、その守備範囲外であっても、ユーザが苦労すれば、範囲内におさめられ
はするのですが。


>・abc$|xyx$ タイプの検索時に正しく検索できなかった。
 この例なんかは、「文尾にこない$」の例とは言えるんでしょうか >konnoさん
 応用すれば、正規表現文字列の先頭にこない「^」のたぐいかな? =リテラル
にはエスケープが必要。
 またオアだ、ぼそ。

 もちろん、wgrep由来のVWXですから、アンドは正規表現でなく、グレップの
オプションが担当してるべきものです。大小文字同一視も、ふつう、ignorecase
で、オプションかフラグでしょうねぇ。これらを僕はほとんど使ったことがない
けど、でも、ユーザの側に立った立派な仕様です。


 -- Ver 0.50  92/02/22 --
  ・\t、\s単独での正規表現が出来なかった。

 -- Ver 0.52  92/02/25 --
  ・\.で'.'の検索が出来なかった。

 -- Ver 0.54  92/04/04 --
    ・VZで特殊文字として定義されている\n、\l、\rが使われていると正規表現とみ
     なさないようにした。

 -- Ver 0.55c 92/07/29 --
    ・^$の検索が不正であった。

 -- Ver 1.00a 93/01/24 --
  ・置換時に例えば \\a が \a と解釈されない不具合を修正

 -- Ver 1.00e 93/05/28 --
  ・^$がEOFにマッチしてしまい、置換時にハングアップするなどの異常動作してい
   たものを修正した。

 -- Ver 1.00f 93/06/25 --
  ・AND検索をサポート

 -- Ver 1.00g 93/07/05 --
  ・abc$|xyx$ タイプの検索時に正しく検索できなかった。

 -- Ver 1.00i 93/09/26 --
  ・正規表現 「.」 が全角の濁点・半濁点などにマッチしないことがあったものを
   改善

 -- Ver 1.00p 93/10/12 --
  ・\a,\0 などを拡張正規表現としてサポート
  ・^[で 行頭の[ が検索出来なかったものを修正

 -- Ver 1.02  93/10/23 --
  ・全角・半角同一視時だけの指定時にも、|,& を認識するオプションをv オプショ
   ンに追加(従来の v オプションを拡張した。)

 -- Ver 1.02b 93/10/30 --
  ・\0+ タイプの正規表現でハングアップしていたものを修正

 -- Ver 1.02c 93/11/02 --
  ・正規表現 | が正しく動作しないことがあったもの(ウゴクトモアッタトイウレベル(^_^;))
   を修正

 -- Ver 1.03b 93/11/12 --
  ・OR/AND 検索時に異常な振る舞いをすることがあったものを修正

 -- Ver 1.03c 93/11/14 --
  ・検索文字列先頭の | 及び & は文字として扱うようにした。

 -- Ver 1.04  93/11/23 --
  ・VZ で Rx-,Zh+ の時にもタグ付き正規表現等を解析してしまっていたものを修正

 -- Ver 1.05  93/11/30 --
  ・VZ で Rx-,Zh+ の時に、文字列先頭または最終の \n を認識するようにした。
   (\n\nxyz などには対応していません。この場合は自動的に全角半角同一視はし
    ない検索となる)

      - No.6220 -    このTreeへ    コメント元:6218 へ [リストへもどる] pre

(6099) 6221Re: wingさんの苦悩(VzのRegex)  投稿者:konno   2013/01/15(火) 01:03
    6220 番 文太 さんへのコメント    コメント数 1

>  それと、全半、大文字小文字同一視みたいな、そもそもの正規表現ではユーザ
> が楽できるようにサポートされてないところも、VWX は担当してるたんだよな、
> というのがつまらない発見でした。そんなの正規表現の守備範囲でないもの。

文太さん、タイトルと合わせて、VWXの凄さを改めて感じました。
更新履歴もこうしてみると、さらに凄みを増しますね。
当時進化し続けていたVZを、更に進化させんとする苦労はいかばかりであったかと。

> >・abc$|xyx$ タイプの検索時に正しく検索できなかった。
>  この例なんかは、「文尾にこない$」の例とは言えるんでしょうか >konnoさん

うーん、この場合の縦線はオアですよね、とすれば左右は独立してるから違いそうな。

>  応用すれば、正規表現文字列の先頭にこない「^」のたぐいかな? =リテラル
> にはエスケープが必要。

もしかしたら先頭にない場合の動作は不定なのかも。だから確実な動作の為には
「¥^」は付けるべきという暗黙のルールなのかもしれませんね。

私は今までVZでは正規表現を使ってなかったのですが、俄然興味が沸いてきました。
そういえばめざら資源で正規表現関連のページがあったなと思って覗いてみたら
良いものを見つけました。

耳より正規表現入門
http://homepage3.nifty.com/mezala/vz/re/index.html
の「第24回  どこにマッチしてるのだ?!」
の中でも紹介されていますが、

VZマクロ工房 > 文字列検索置換関連 >
正規表現文字列マーカー
matchstr.def
これ、良さそうですね。正規表現置き換えの確認ということで、今回のような
ケースにぴったりのマクロですね。もっと早く見つけておけばよかったなぁ。

      - No.6221 -    このTreeへ    コメント元:6220 へ [リストへもどる] soft

(6099) 6222Re^2: wingさんの苦悩(VzのRegex)  投稿者:文太   2013/01/15(火) 12:52
    6221 番 konno さんへのコメント    コメント数 1

konnoさん

>タイトルと合わせて、VWXの凄さを改めて感じました。
 やっぱすごいですよね。アセンブラで、ライブラリみたいのなかったわけでしょ
う? で、常駐アプリ。縁の下の力持ち。

\zc a = [aAaA] すごい。

>更新履歴もこうしてみると、さらに凄みを増しますね。
 ほんと、痛々しい感じ。使わないよなぁ、そんなの、というのもあり、、、。

>> >・abc$|xyx$ タイプの検索時に正しく検索できなかった。
>うーん、この場合の縦線はオアですよね、とすれば左右は独立してるから違いそうな。
 ですかね。

>もしかしたら先頭にない場合の動作は不定なのかも。
 うん、不定なんでしょう。ユーザの方がルールに則ってないわけで。

>「¥^」は付けるべきという暗黙のルールなのかもしれませんね。
 ええ、メタキャラは一般にそうやってエスケープするのがルールでしょう。

>私は今までVZでは正規表現を使ってなかったのですが、俄然興味が沸いてきました。
 そうなんだぁ&それはよかったです。

>正規表現文字列マーカー
>matchstr.def
 実用されてなかったのですねぇ。vz.defに入れちゃうと、すごく分かりやすい
ですよ。ヒット箇所強調。
 ただ、処理系によって振る舞いが微妙に違うところもあるのでご注意を。
vwx vs perlとか。vwxがどちらかというと特殊です。
 トリッキーな場所が、そういう「微妙」なところなので。

      - No.6222 -    このTreeへ    コメント元:6221 へ [リストへもどる] soft

(6099) 6223先頭でない正規表現文字列途中の「^」  投稿者:文太   2013/01/15(火) 13:42
    6222 番 文太 さんへのコメント    コメント数 1

 英語も日本語も同じことを言っているはずですが、このように説明されている
のを見つけました。「処理系」によって、であり、改行を含む対象文字列なので
「複行」処理時のことになると思います。もちろん、vwxではありえません。

-----
\` バッファの先頭にマッチします。^は処理系によっては 改行の直後にもマッチ
  しますが、この演算子はそういった場所には マッチしません。

\' バッファの末尾にマッチします。$は処理系によっては 改行の直前にもマッチ
  しますが、この演算子はそういった場所には マッチしません。

http://www.kt.rim.or.jp/~kbk/regex/regex.html#METASEQ

      - No.6223 -    このTreeへ    コメント元:6222 へ [リストへもどる] soft

(6099) 6224Re: 先頭でない正規表現文字列途中の「^」  投稿者:文太   2013/01/15(火) 17:28
    6223 番 文太 さんへのコメント    コメント数 1

なんとVWXでヒットしてしまった

 ので、一応調べました。ただ、メタキャラの意味を消すのにその位置を使うの
は、 [ ] な文字クラスの話なので(そもそもの僕の間違い)、^ にしろ $ にし
ろ、リテラルな意味で使いたいなら一般に¥でエスケープするのが行儀のよい姿
勢かと思います。
 が、VWX が文字列「a^b」に対して、検索文字列「\x a^b」でも「\x a\^b」で
も許しているので(後者推薦)、調べました。もちろん、「\^」が通らない処理
系はないはずなので、そっちで行くべきかと思いますけれど(注、ygrepの特殊な
場合の特殊な例外を除く)。

 けっこう通(とお)してしまってます。

C:\>type t.txt		;対象テキスト
a^b

C:\>grep -V
GNU grep version 2.0 + multi-byte extension 1.04

C:\>egrep -V
GNU grep version 2.0 + multi-byte extension 1.04

C:\>grep "a^b" t.txt		;grep, NG

C:\>grep "a\^b" t.txt
a^b

C:\>egrep "a^b" t.txt		;egrep, NG

C:\>egrep "a\^b" t.txt
a^b

C:\>cgrep "a^b" t.txt		;cgrep, NG

C:\>cgrep "a\^b" t.txt
a^b

C:\>ygrep "a^b" t.txt		;ygrep, both
a^b

C:\>ygrep "a\^b" t.txt
a^b

C:\>yagrep "a^b" t.txt		;yagrep, NG

C:\>yagrep "a\^b" t.txt
a^b

C:\>izgrep "a^b" t.txt		;izgrep, NG

C:\>izgrep "a\^b" t.txt
a^b

C:\>oldsed -n -e "/a^b/p" t.txt		;serow's old sed, both
a^b

C:\>oldsed -n -e "/a\^b/p" t.txt
a^b

C:\>jgawk -e "/a^b/{print}" t.txt	;jgawk, both
a^b

C:\>jgawk -e "/a\^b/{print}" t.txt
a^b

 前に調べたとおり、perlは4も5も許しません。

 僕は、保守的でルールは単純なほうがよいと考えるたちです。だから、できた
ら  VWX に、すべての正規表現ツールに、「正統的」であってほしい(希望して
も仕方ないのだけど)。だから、「NG」組を支持します(笑)。
 そういうの「通して」くれたら親切みたいだけど、方言がバラバラになり混乱
すると思う。 だから、「駄目だ、NG だ」と言ってくれたほうが、逆に本当は親
切なんじゃないのかなぁ、と考えます。

 上の僕の考え方やテストが間違ってないなら、現場は大混乱な模様。それが、
現実のようです。


 このような資料が出てきました。上の(注)とリンク。
-----
《ygrepについての覚え書き》
 ★ 「(」は、かなり特殊に扱われるので、注意。 [(] や [)] を使う必要がある。
「\(」では駄目、というとこがミソ。
 ★ 「{」「}」「:」も特殊文字。これらは、「\{」「\}」「\:」がとおり、
「[{]」「[}]」もいけるが、「[:]」は駄目なので、「\:」が唯一の可能性。


      - No.6224 -    このTreeへ    コメント元:6223 へ [リストへもどる] pre

(6099) 6225Re^2: 先頭でない正規表現文字列途中の「^」  投稿者:文太   2013/01/15(火) 17:53
    6224 番 文太 さんへのコメント    コメント数 1

> が、VWX が文字列「a^b」に対して、検索文字列「\x a^b」でも「\x a\^b」で
>も許しているので(後者推薦)

 これについて、一つ思いつきました。
 「\x a^b」のとき、実はVWXは仕事をしてないんです。それが正規表現文字列と
みなされないとき、VWXはVzの検索に制御を渡してしまうんです。「\x 」指定が
あってさえ。VWXの、それこそ「一致文字列長」のAPIを調べれば、これが分かる
はずです。3とは返してこないはず。調べないけど。

 しかし、やっぱり現場は混乱続きの模様です。

C:\>mawk "/a^b/{print}" t.txt

C:\>mawk "/a\^b/{print}" t.txt		;よろしい
a^b

C:\>ssed --version
super-sed version 3.62
based on GNU sed version 4.1

C:\>ssed -n -e "/a^b/p" t.txt		;うぎゃ。本場でこれだもん。ぐすん。
a^b

C:\>ssed -n -e "/a\^b/p" t.txt
a^b


      - No.6225 -    このTreeへ    コメント元:6224 へ [リストへもどる] pre

(6099) 6226Re^3: 先頭でない正規表現文字列途中の「^」  投稿者:文太   2013/01/15(火) 18:07
    6225 番 文太 さんへのコメント    コメント数 2

 もう、泥沼モード(汗)。

 これで分かります。そのまま実行をどうぞ。色はつきませんが。

=== matchstr.def v0.01 === めざらさん、借りました。
* mad for vz!
36 ^^ ""
	#F "\x a^b" #m
	#c
        cx-, ax=$E908, bx='VW', &i($2F) ;マッチした文字列長の取得
	&m("%d",cx).
*

a^b
 0と出ます。
 繰り返しですが、VWXは、「\x 」と言われても、指定された文字列にメタキャラ
が入ってないと、Vzのリテラルな検索をやらせるのです。

 考えてみれば、konnoさんは、こんなことに悩んではいなかったのですよね。
 失礼しました。

      - No.6226 -    このTreeへ    コメント元:6225 へ [リストへもどる] pre

(6099) 6227Re^4: 先頭でない正規表現文字列途中の「^」  投稿者:文太   2013/01/15(火) 23:08
    6226 番 文太 さんへのコメント

 もうほとんど怒涛モード。いえ、昨日の雪かきと今日の雪道通勤で疲れ切って
いるのです。お許しを。

 ニュアンスが微妙ですが(とりわけvwx.doc)、同じことを言ってるのでしょう。
 何度もうるさくて、ごめんなさい。

正規表現一般(grepの項より)
---------------------------
 ^   文字列の先頭にマッチします。 ^crypt   は crypt にマッチしますが、
encrypt にはマッチしません。処理系やモードによっては文字列中の改行の直後
(つまり行の始め) にもマッチします。

 \  \ は厳密には正規表現演算子ではありません。しかし、上述した正規表現
演算子を文字そのものとして扱いたいような場合に、 その前に \ を置くことに
よって演算子の働きを抑制することができます。たとえば、\[ は [ というキャ
ラクタそのものに対する指定であって、キャラクタクラスの始まりを示すもので
はありません。

www.kt.rim.or.jp/~kbk/regex/regex.html


VWX.DOC
-------
 ^  パターンの先頭に存在するときのみ、行の先頭を意味する。

 \c  メタキャラクタとしての意味を打ち消す場合に使用し、文字 c そのもの
を表わす。ただし、\t はタブ記号、\s は空白文字を意味する。


Bruce.さんによるおまけ
----------------------
よくある勘違い その2
 前述した通り、ブラケットに囲まれている中ではほとんどのメタキャラクタは
その特殊な意味を失います。したがって、[^(foo)]bar という正規表現もまた、
「foo ではない文字列に続いて bar という文字列が続くもの」ではありません。
「f でも o でも ( でも ) でもない文字に続いて bar という文字列が続いたも
の」です。[]  の内側では、文字列や (より小さな) 正規表現要素をまとめる
というカッコの特別な意味は失われてしまうということに注意してください。
 (原文で読んでみて下さい。笑えます。)

      - No.6227 -    このTreeへ    コメント元:6226 へ [リストへもどる] pre

(6099) 6228Re^4: 先頭でない正規表現文字列途中の「^」  投稿者:konno   2013/01/17(木) 00:04
    6226 番 文太 さんへのコメント    コメント数 1

>  これで分かります。そのまま実行をどうぞ。色はつきませんが。
>  0と出ます。

なるほど、これは分かりやすい実例ですね。

>  繰り返しですが、VWXは、「\x 」と言われても、指定された文字列にメタキャラ
> が入ってないと、Vzのリテラルな検索をやらせるのです。

これはVWXの仕様というわけですね。今までは使う機会がなかったのでそういうものかなと
スルーしてましたが、使うとなると、独自仕様の部分は覚えておかないと嵌りそうですね。

>  考えてみれば、konnoさんは、こんなことに悩んではいなかったのですよね。

今までは悩みから逃げていましたが、これからは悩むことが増えそうです。(^_^)

      - No.6228 -    このTreeへ    コメント元:6226 へ [リストへもどる] soft

(6099) 6229Re^5: 先頭でない正規表現文字列途中の「^」  投稿者:文太   2013/01/18(金) 00:03
    6228 番 konno さんへのコメント

konnoさん

>>繰り返しですが、VWXは、「\x 」と言われても、指定された文字列にメタキャラ
>>が入ってないと、Vzのリテラルな検索をやらせるのです。
>これはVWXの仕様というわけですね。今までは使う機会がなかったのでそういうものかなと
>スルーしてましたが、使うとなると、独自仕様の部分は覚えておかないと嵌りそうですね。

 どっかでwingさん自身が書かれていて、前に同じ方法で確認したことがありました。

>今までは悩みから逃げていましたが、これからは悩むことが増えそうです。(^_^)

 VWX だけの話なら、ちょっと特殊なところがあるだけでしょう。
 Vz+VWXでも、ほんのちょっと。
 が、それを「正規表現」一般と比較したりすると(掲示板のperlとか= ver.4
ですよね)、あわわわ、となることがあり得ます。MS-DOS 時代はやっぱり作者
の趣味で色々あった。ただ Bruce. さんのところをちらとでも見ていただいたら
分かりますが、(いいことなんでしょう)世界的な標準化が進んでいます。

 そもそも perl5 の凄まじい拡張が魅力的だったのに、sjis でスクリプトを書
くのが困難だと知り、Jperl4 しか手元に残してません。必要なのは onigsed と
yagrep に入ってますので、僕は perl はいいや、となりました。掲示板のメンテ
もありませんから。m(__)m

      - No.6229 -    このTreeへ    コメント元:6228 へ [リストへもどる] soft

(6099) 6219修正  投稿者:文太   2013/01/14(月) 12:11
    6212 番 文太 さんへのコメント

> だとすると、【A】
>s/^Re^[0-9]+: //;
>s/^Re: //;
      ^ココ
> なので、合わせて、【B】
>s/^Re[^:][0-9 ]+:* *//;

 もうダメダメじゃないか!  Re のあとは「^」と「:」しか来ないんだな、と
考えているようです。 で、[^:] とかやってる。あのぉ、それ文字クラスの否定
になってしまっていて、「『:』以外ならなんでもいいよ」という意味になってし
まうんですが、、、。
 アマアマだぜ! 失礼しました。

 「^Re」(頭)と「: 」(尻尾)が共通するのは見えていたんですけど、それ故
に見えてないところがありすぎました。あうううう。
 せめて[:^]としろよなぁ。[\^:]も可のはず。

 konnoさんの結論が理屈の上で美しいですぅ〜。読みやすくはないかもしれない
けど、やっぱり。
 おわびに(?)、変なのを上げておきます。

      - No.6219 -    このTreeへ    コメント元:6212 へ [リストへもどる] pre