Perl の正規表現での \A と \Z の扱い


公開 (UL): 2023-09-15
更新 (UD): 2023-09-15
閲覧 (DL): 2023-10-05

この記事のもくじ

→本文へ
当サイトは SNS の公式アカウントがないので,「議論ネタ」にする際は,皆さんのブログ,メーリングリスト,SNS や掲示板などで,適当にハッシュタグを付けたりリンクを掲載するなどしてご利用ください。

前の記事

2023-01-16
Android のキーボード・ショートカット一覧

最近の記事

2022-08-09
代表的な画像ファイル形式一覧
2022-04-04
サイトのローカル試験と実ウェブ上の差を縮める手法(Perl)
2021-12-17
Perl で利用宣言時にモジュールをカスタマイズする
2021-06-01
Base54
2021-06-01
PPOP
新着情報
She appears also the top page.

新着情報 Recent docs.

Sorry, but almost these pages are only Japanese.
Perl の正規表現での \A と \Z の扱い «Easy manipulation for GET-query or POST-form data with \A and \Z in regular expressoin.»
\A と \Z を使ったクエリーやフォームデータの直接的な簡単操作。 (エンジニア向け)
倫理意識の社会的低下 «One day, I set to stop DM from a banking corporation, but those continue to be sent after that. I'm feeling falling sense of ethics in Japanese society.»
某銀行からの DM が,およそ金融とは関係なく興味のないものだらけ。しかし,止める設定をしても直ぐ止まらないシステムに,倫理意識の社会的低下を感じた話。
「マイナンバー」が危険なこれだけの理由-2 «Wny is Japanese taxpayer ID system "My number" repeating to leak private info and misregistration.»
最近多発している問題でいかに深刻な影響があり基本的対策の欠如だったかを解説。
オヤクショの「上から目線」という殺傷光線 «Tokyo government gifted me "Okome(rice) coupon". But I have allergic to rice. The government officers often make services considering insufficiently, then people is leaded wrong by that.»
東京都から届いた「おこめクーポン」は,食品の詳細不明でアレルギー持ちは不安,ウェブは「申し込めない」トラップだらけ……こんなオヤクショの「上から目線」の原因を考察。
給使乖離現象 «"Server and User Design Gap" phenomenon (abbr: SUDG), it's the trend to lack of considerations in design for user of the service.»
愚かな経営者たちが考えた劣悪なウェブサービスにより,人々が一方的に不利益を被るという話。
個人情報の提示要求者側に求められる責任 «The responsibilities of the government that wants some private infomations.»
給付金の手続きに突然「旧住所」の提示を求めて来たお役所の対応の疑問からその「責任」を考える。
日本の「IT 人材不足」の正体 «The simple reason why Japanese companies lack IT-skill.»
保険会社からのセキュリティガバガバメールが「IT 人材不足」の正体を暴く。

人気記事 Frequent view pages.

表計算で「令和」に対応する方法
How to adapt the Gengo era "Reiwa" on spreadsheet applicaiton.

古いアプリも OK。「表計算 令和」の検索結果上位御礼!
表計算ソフトで予定表を自動作成する超便利な方法 «How to make the schedule table automatically on spread-sheet.»
「毎月第○×曜日」的な法則は自動で作らせてラクしよう!
表計算ソフトに「個人情報保護機能」を仕込む方法 «Prevention to leak private-data with spread-​sheet macro function.»
「漏えい」のためのフェイルセーフ。「表計算 個人情報」の検索結果上位御礼!
Wary-Basher (ワリバッシャー)
DIY device that enables the handicapped to operate many things with a switch like push-button.

障害者の様々な操作をスイッチ操作で実現する器具。キットも発売中! 「作り方」PDF ダウンロード多数御礼!←地方教育委で人気。
貧乏人を殺す行政の構造 «Structurally, the administrators kill the poors in Japan.»
ヘタすると多摩川に流されるところだった台風 19 号

この記事に対する → 調布市の反応

おすすめ! Recommend

現在当サイト人気 No.1!
Android のキーボード・ショートカット一覧 «The list of Android Keyboard Shortcuts (EN ready).»
Android のスマホやタブレットにキーボードをつないだ時に知っていると便利なキー操作。
[PDF 118KB] 生活保護申請時のオヤクショ対策
申請の「水際作戦」を突破するための心得。「ホームレス総合相談ネットワーク」製作の図解を小サイズ化したもの。

出典 ☞ 路上からもできるわたしの生活保護申請ガイド (2017 年版) (外部リンク)
文字ベース天気予報 «Weather forecast in text mainly from JMA Json-data.»
古いブラウザやスマホ,音読ソフトでも大丈夫! 気象庁の JSON データを利用した文字ベースの天気予報(試験版)。
「事故防シート」について «Cared persons taking with "Jiko-​Bow-​Sheet" prevents from accidents.»
介護現場の負担軽減と事故防止のアイデア
【連載】 キーボードの「キー」の詳しい使い方 «The detial of usage each key on keybord.»
各キーの機能詳細。機能別五十音順一覧。
和易ゐ記 (WAI-WIKI) «WAI-WIKI is light­weight markup language for Japanese, and generates HTML on this server on-​demand.»
当サイトで開発/使用中の日本語向けに特化した軽量マークアップ言語

ご連絡 Contact

▼ メールフォームはこちら
SSL 証明書の更新に不具合が多いため,期限切れエラーが出た際は,お手数ですが「例外指定」をお願いいたします。

ファイルの暗号化
当サイト管理者(石川)宛にメール添付で送信するファイルを暗号化したい時は,唯一のパスワードを PPOP で取得できます。 PPOP gives a password for encryption of the file(s) attached your mail to the admini­strator of this site M.Ishikawa.
PPOP

MEMO / Email to the Author
あとで調べたい点のメモなどに利用可能。
下部ボタンでそのまま著者にメールできます。


CAPTCHA: easy math prob in Japanese

時事川柳 News Senryu

子育ての  
「ヒマ・カネ」吹き飛ぶ
  インボイス
Rearing kids. For blocking it the Japanese "invoice" system inducted.

 今は個人でウェブサービスを設計し, 多数の利用者を相手に薄利多売で稼ぐことも原理的には可能だ。 一方,某会計ソフト会社の試算では, 「インボイス」の書類作成は約 20 分かかるとか。 もしウェブサービスの利用者が9千人いて,対応を求められると,年間 3000 時間になる。1日8時間労働,週休2日とすれば,年間約 2000 時間労働が標準だろうが, 「インボイス」への対応だけでそれをはるかに上回ってしまう。 「薄利多売」は資本主義下のビジネス原理のはずが, それに則って収入を増やそうとすると,「インボイス」制度に阻まれる。 手続きで忙殺されるのを避けたいと考えると事業拡大できないから, 個人が家庭を築くために余裕ある資金源を確保することも許されない。 「ビジネス原理」を無視し,「少子化」を悪化させて, 「職業選択の自由」をも否定する違憲制度, それが「インボイス」である。

(⌚2023-09-28)
前掲載: 自民県 絶対しないぞ ふるさと税

ご支援 Support this site.

まだまだ コロナ失業中!!
CORONA-NEET, seeking works now!

この活動をご支援いただける方はこちらへ Could you support this site, see here (but Japanese).
都道府県庁さん, 地方自治体さんや教育委員会さん, 障害者就労支援機関さんやその他公的機関,省官庁さん, 「タダ見」しているだけでは, 格差が広がるだけだと思いませんか?
Welcome!
Amazon
Google
IntraFi
The companies, thanks for many accesses every months! Are the articles I wrote helping for increasing your income? Although, I cannot get even a penny and jobs from that.

 よくウェブで見かける説明はこんな感じ。

\A は行頭に,\Z は行末にマッチする。

 ところが,取扱いはそう一筋縄でもなさそうなのよね。ちょっと突っ込んでみたい。

● 「文字」として扱われない

 フォームやクエリーで送られてきたデータの中から,特定フィールドだけ取り出したり,あるいは削除したい場合,生データに直接的に操作できれば簡単だと思った。たとえば,生データに近い形式で保存を考えた時,パスワードのフィールドとして pw と pwv の2つがあって,pwv 側は確認用で保存の必要はないから削除したいような時,当初は以下のようなものを考えた。

▼ うまくいかない例(NG)
   $fields; # query (GET) or form (POST) data
   $fields =~ s/[\A&]pwv=.*?[\Z&]/&/;
   $fields; # ← deleted "pwv" field ? (fail)

 ちなみに,“*?”ってのは「最短マッチ」のことで,任意文字で任意文字数にマッチさせた場合,次のフィールドとの境界(つまり最短の)& を任意文字“.”へのマッチから外すためのもの。
  pwv フィールドが先頭にあれば \A にマッチし,次のフィールドとの境界の & までを消去し,また,最後のフィールドとしてあれば,最後にある & で区切られた部分から末尾(\Z)までを消去すればいい……と,思ってこうしたが,これではうまくいかない。「\A(\Z)がこんなところにあってはダメ」的なエラーが出る。なぜ?
 どうやら「文字クラス」([] で括った文字のどれか)として扱ってくれないよう。たとえば「削除」ではなく,単純に1つのフィールドの設定値を取り出したいだけなら,単純なマッチ式で以下のようにするとうまくいく。

▼ フィールドの取り出し(OK)
   $fields =~ /(\A|&)pwv=(.*?)(\Z|&)/;
   $2; # ← value of the "pwv" field

 これだと,最初か最後にあってもマッチする。「文字として」よりも「文字列」的に扱えばよかったみたい。
 ただ,設定値取り出しは上記でいいが,削除だと別の点で問題が起きた。これを「削除」したい時はこうすればよさそうな気がするが……。

▼ もうひといきの例(NG)
   $fields =~ s/(\A|&)pwv=.*?(\Z|&)/&/;
   $fields; # ← deleted "pwv" field ? (just a little fail)

 置換文字側の & というのは,pwv フィールドが中間にある時にそこを削除して & 1個に置換し,前後のフィールドを詰めるものだが,先頭か末尾にある時は & に置換する必要はない。つまり,端にある時と中間にある時で置換内容の有無を変えないとダメっぽい。で,考えたのがコレ。

▼ なんとかうまくいく例(OK)
   $fields =~ s/(\A|&)pwv=.*?(\Z|&)/"$1$2"eq"&&"?"&":""/e;

 スイッチの“e”ってのは,置換文字側が「式」であることを意味するもの。つまり,フィールドの前と後ろの両方に & がある時だけ & 1個に置換し,端にある時は単純に消去するだけってこと。

◆ 複数の時はさらに工夫が必要

 じつはこの時は,消去したいフィールドが pwv のほかにもあって,それも一緒に消したいと思っていた。たとえばそれが,一時的に使ったセッション ID の sid だった場合,次のようにすればうまくいきそうな気がする。

▼ ダメな例(NG)
   $fields =~ s/(\A|&)(pwv|sid)=.*?(\Z|&)/"$1$3"eq"&&"?"&":""/eg;
   $fields; # ← deleted "pwv" and "sid" fields ? (fail)

 “g”スイッチを付けたから両方置換してくれるかというと,うまくいかないケースがある。それは,この pwv と sid のフィールドが隣り合っていた場合で,前側しか消去されない。前にあるフィールドで置換が起きると,その直後の文字から次のマッチ部分を探すことになるが,置換した前部分は & や \A のマッチ対象から外されるらしい。
 どうすればいいかというと,たとえばこう。

▼ うまくいく例(OK)
   while( $fields =~ s/(\A|&)(pwv|sid)=.*?(\Z|&)/"$1$3"eq"&&"?"&":""/e ){}
   $fields; # ← deleted "pwv" and "sid" fields (OK)

 つまり,マッチするものがなくなるまで全体を繰り返して置換対象にする。ただ,正規表現マッチングの「繰り返し」って,ワリと負担なのよねぇ……。と言っても,この場合ではせいぜい2回だが。削除したいフィールドが多数ある時は,1文で書ける点は便利ではないかと思う。
 単語境界を示す“\b”が使えるなら while は不要になりそうだが,& 以外にもマッチしてしまうので,たとえば他フィールドの「値」の側にたまたま“-pwv=”なんて文字列があるとアウトよね。
 これは,整数の3桁ごとにコンマを挿入するつぎのやり方の応用。

▼ 3桁ごとにコンマ
   $integer = 整数; # Insert commas each 3 digits
   while( $integer =~ s/(\d)(\d\d\d)\b/$1,$2/ ){}

 この場合も“g”スイッチを付けてもダメで,while 文の中に入れて繰り返す必要がある。1の位を含む後ろの桁からマッチする箇所を探すから,桁が多いとコンマを入れる場所を前に戻って探す必要が生じる。で,繰り返しが必要になるわけだ。
 でもまぁ,C言語みたいに,文字列化して数字がいくつ並んでいるか数えて……なんてコード書くよりはラクだよね。

● おわりに

 正規表現って便利だわー。筆者はこれを応用して,ダウンロードした他サイトの HTML から,正規表現で必要な部分だけ抜き出して見たりしている。追加で読み込むスクリプト,広告や他記事の紹介など,余計な部分はみんな切り落とすから,読み込みも表示も早くて助かる。
 でも,そういった方法を使いこなせるのは一部の人間なのだろうね。だから,社会全体としては,筆者の想像よりもスゴく面倒な手法を使って余計な時間を費やしているんじゃないかって気がする,今日この頃。と言っても,その手のものも含めて,今のところ(2023,9 月)筆者の元に仕事の話なんか来ないけどね。



© M.Ishikawa; TREEWARE 2023.