1: ノチラ ★ 2018/06/01(金) 18:00:49.92 _USER
8278index
皆さん、正規表現は使っていますか? 開発者にとってテキスト処理は面倒な場面も多いですが、正規表現を駆使することで一気に効率化することもできます。今回、『正規表現辞典 改訂新版』の著者・佐藤竜一さんに、正規表現を使うメリットや本書についてうかがいました。

――『正規表現辞典 改訂新版』は目的別の検索ができるリファレンスですが、正規表現の歴史や背景についても解説されています。今回は佐藤さんに本書についてお尋ねしますが、まずはご自身のことを教えてください。

佐藤:勤務先はいわゆるSIerですので、各種システムの企画・構築を主業務としています。主に担当しているのは企業向けのアプリケーション開発基盤の構築や、個別システムに対するアプリケーション・アーキテクチャの立案といった分野ですね。

 世間的には「アーキテクト」と呼ばれる職種になりますが、私自身はプログラマーとして個別の問題と向き合い、頭を絞るほうが好きです。

――仕事では正規表現をどう活用されているのでしょうか。

佐藤:個別のアプリケーションにおける入力値検証などに利用することはもちろん、アプリケーションやミドルウェアのトラブルシュートにおけるログの分析や、既存データのクレンジングなどに活用しています。

 ログ分析では必要なログのみを抜き出す、あるいは不要な部分を刈り取るために正規表現は欠かせません。データのクレンジングでは不要なデータを排除する、あるいは不正なデータを正しい形式に整形するといった作業が必要となりますが、このような局面でも正規表現はそのパワーを存分に発揮してくれます。

読みやすさやメンテナンスのしやすさで差がつく
――プログラマー(開発者)として、正規表現を使いこなすのと使いこなさないのとでは、どんな差がつきますか?

佐藤:テキストを相手にする処理では、正規表現を活用することで簡潔かつ分かりやすい記述が可能となるケースが多々あります。正規表現をうまく使えないプログラマーは、ちょっとした処理でもループでテキストを文字単位に分割し、複雑な条件分岐を処理中に記述してしまいます。

 このようなプログラムは確かに動作するかもしれませんが、読みやすさやメンテナンスのしやすさという観点で見れば大きなマイナスとなるでしょう。

「正規表現を使いこなす」という質問からすると拍子抜けされるかもしれませんが、正規表現を使って解決すべき現場の問題の多くは、基本正規表現と拡張正規表現の範囲でも十分まかなえます。

 ですので、本当に基本的な部分をちゃんと理解するだけでもプログラマーとしては大きなアドバンテージになります。大切なのは個々のメタキャラクタの意味をきちんと押さえること、そして実践を繰り返すことでしょう。最初はとっつきにくく見える正規表現も、慣れてくるうちに自然と記述できるようになります。

――開発者以外でも正規表現を使えることでどのような利点がありますか?

佐藤:現在は開発者以外の方でも、各種のクラウドサービスなどのツールやリソースを活用して生産性の向上、さらにはビジネス上の成果を求められる時代です。処理対象の指示や結果の加工に正規表現が必要とされる、あるいは正規表現を使うことでより柔軟な処理を実現できるといった局面は今後も増えてくるはずです。

 たとえば、RPA(Robotic Process Automation)ではExcelやPDFファイルから特定のデータのみを抜き出し、妥当性を判断し、加工したうえで最終的な結果を得るといったことが普通に行われます。このような処理は、それこそ正規表現が最も得意とする領域です。

結果に辿りつく過程を理解してほしい
――2005年に出版された初版と、この改訂版が出る間に、どのような変化がありましたか?

佐藤:本書の前書きにも書きましたが、Unicodeが文字コードの標準的地位を獲得したことです。文字の選択はUnicodeのプロパティにもとづいて行われるため、たとえば1文字の数字を表す「\d」はUS-ASCII以外の数字にもマッチすることが当然になりつつあります。

 また、絵文字のように複数のコードポイントを消費して目に見える1文字を表すケースもこれまで以上に増えました。本書でも可能な限り、これらのポイントについて説明しています。
https://codezine.jp/article/detail/10855
引用元: http://egg.5ch.net/test/read.cgi/bizplus/1527843649/


3: 名刺は切らしておりまして 2018/06/01(金) 18:09:26.74
覚えても使わないと忘れるんだよな

123: 名刺は切らしておりまして 2018/06/01(金) 21:53:29.32
>>3
これ

5: 名刺は切らしておりまして 2018/06/01(金) 18:13:10.82
言語によって書き方が違って覚えられない

50: 名刺は切らしておりまして 2018/06/01(金) 19:48:59.91
>>5
ほんとそれ
特に最短一致はよく使うので
何とかして欲しい

6: 名刺は切らしておりまして 2018/06/01(金) 18:13:22.06
否定先読み便利です

8: 名刺は切らしておりまして 2018/06/01(金) 18:15:29.97
1行のif文ってどうすればいいんや

10: 名刺は切らしておりまして 2018/06/01(金) 18:20:11.05
>>8
改行しないでダラダラ書けばいいんじゃね

12: 名刺は切らしておりまして 2018/06/01(金) 18:26:46.39
>>8
?

9: 名刺は切らしておりまして 2018/06/01(金) 18:18:07.48
都道府県と市区町村とその他に分けたやつは軽く感動したね

11: 名刺は切らしておりまして 2018/06/01(金) 18:22:45.00
頭の体操になる

13: 名刺は切らしておりまして 2018/06/01(金) 18:27:59.00
そのうちAIが補正してくれるようになるよ

16: 名刺は切らしておりまして 2018/06/01(金) 18:30:47.70
ある程度理解すると小回り効いて便利だ
ただそれは自分だけの世界ならではの話

他人が書いた正規表現はメンテの時に混乱する
特に一行で収めようと頑張ってる人が書いた正規表現は鬼門

20: 名刺は切らしておりまして 2018/06/01(金) 18:33:16.42
>>16
一週間前に自分で書いたやつが理解できないときあるもんな

85: 名刺は切らしておりまして 2018/06/01(金) 21:07:12.65
>>20
用途を添えて別のテキストへ蓄積

17: 名刺は切らしておりまして 2018/06/01(金) 18:31:22.08
必須やん

語尾に英字は全部消す
はくちっぽいので

18: 名刺は切らしておりまして 2018/06/01(金) 18:31:40.72
姓企業元が使えない言語、環境ではもう仕事したくない

21: 名刺は切らしておりまして 2018/06/01(金) 18:34:42.86
 


〜以外っていうのがやりにくいんだよな。


 

24: 名刺は切らしておりまして 2018/06/01(金) 18:37:35.24
正規表現が役に立つのは、テキストエディタのみで不具合解析とかソースコード解析する時だな。
たまに統合開発環境すら入れさせてくれない現場で、サクラエディタとか秀丸を駆使して解析したわ。

25: 名刺は切らしておりまして 2018/06/01(金) 18:39:32.12
すぐ忘れてしまう
老いたな

26: 名刺は切らしておりまして 2018/06/01(金) 18:40:59.69
パキュレーションサイトってこれで変換してるだけだろ

27: 名刺は切らしておりまして 2018/06/01(金) 18:42:18.62
簡単な正規表現だったら、誰でもできるだろ・・・

yy/MM/dd kk:mm:ss の日付の日だけ欲しいときに、いろいろ処理するのと
正規表現を使うのとでは、まあ確かに正規表現のほうがわかりやすそうではある
処理でやるのだと、" "でsplitして〜とかやるんだろうなw

62: 名刺は切らしておりまして 2018/06/01(金) 20:20:50.89
>>27程度なら普通に使ってるしsplitとかを駆使するより分かりやすいと思う

28: 名刺は切らしておりまして 2018/06/01(金) 18:42:39.29
メンテの仕事は俺に回ってこないし、それで俺の給与が増えるとも思えない
本当にアドバンテージになるの?

43: 名刺は切らしておりまして 2018/06/01(金) 19:23:27.90
>>28
今こそ転職じゃい

121: 名刺は切らしておりまして 2018/06/01(金) 21:51:42.45
>>28
そういうことを聞いているレベルじゃ
お前さんの役には立たないよ

30: 名刺は切らしておりまして 2018/06/01(金) 18:46:45.27
覚えてたけど忘れた

33: 名刺は切らしておりまして 2018/06/01(金) 18:53:44.48
ワイ中卒javascriptはnode::repl
phpはartisan
ダックタイピングしないと死ぬ病
書いてる最中に全てを忘れてくので
phpはリフレクション必須

34: 名刺は切らしておりまして 2018/06/01(金) 18:53:51.22
正規表現で表現しきれないものまで無理に正規表現を使うな

71: 名刺は切らしておりまして 2018/06/01(金) 20:46:49.31
>>34
これは鉄則だよね

35: 名刺は切らしておりまして 2018/06/01(金) 18:56:41.01
使わないとすぐ忘れるんだよな

37: 名刺は切らしておりまして 2018/06/01(金) 19:03:05.07
ログ分析の前処理に正規表現かけてデータ取り出してログストレージに突っ込んでるお(´・ω・`)

39: 名刺は切らしておりまして 2018/06/01(金) 19:12:10.51
逆に正規表現ができないプログラマとか、Sierとか、なんの冗談ですか?

40: 名刺は切らしておりまして 2018/06/01(金) 19:13:51.24
これを正規表現で抽出するにはどう書けばいいんだっけ... てあんちょこと睨めっこしてるうちに
正規表現使わずに文字列処理するプログラムが書けてしまうという

44: 名刺は切らしておりまして 2018/06/01(金) 19:34:41.56
結局やりたいこと出来ない場合が多い。
互換性あって、もっと簡単にできないの?
解析で覚えても時間の無駄な気がしてイライラする

45: 名刺は切らしておりまして 2018/06/01(金) 19:36:10.93
47歳でいきなり社会復帰しろといっても無理だわな

67: 名刺は切らしておりまして 2018/06/01(金) 20:42:20.56
>>45
おまプログラミング最高やで!
しかも元プロなら言うことなし

46: 名刺は切らしておりまして 2018/06/01(金) 19:37:59.05
俺が正規表現を覚えて絶望したことは
言語毎に正規表現が微妙に違うことに初めて気がついた時。
二つ目の言語やるまで、恥ずかしながら知らなかった。

47: 名刺は切らしておりまして 2018/06/01(金) 19:40:05.83
>>46
あんまりにも複雑な表現は覚えても仕方ないし使い所ないよね?
VIの検索置換とか、そういうのを使うために覚えるのはありだが
簡単なものは覚えてると仕様書書くときとかにも使える
相手もある程度コーダーな人であるという前提になるが
下手な絵よりもわかりやすく誤解がないのがプログラム構文的な式を直書きすること

72: 名刺は切らしておりまして 2018/06/01(金) 20:49:10.59
>>46
極力、基本正規表現だけで表して、覚えることを
最小限にしてるよ。

51: 名刺は切らしておりまして 2018/06/01(金) 19:49:48.92
 
拡張正規表現でないと不便

52: 名刺は切らしておりまして 2018/06/01(金) 19:51:00.79
遠い記憶だと

意識して使い始める

統一を意識するあまり一部が難解になる

無理に統一する意味無くねと思い始める

忙しいのに、やってられるかとちゃぶ台を返す

記憶から消去

みたいな感じだったような...
簡単なやつは使えたはず

57: 名刺は切らしておりまして 2018/06/01(金) 19:56:04.01
>>52
みんなそうだと思う
使うにしたって、PGを相手に実装されたような一部のツールで使うくらいだ
そのツールの一部有用な記述だけ習得して大多数は記憶から抹消するよ
コーディングにこんなもん本格的に使ったら引き継いだやつが泣きを見るし
UIで正規表現前提のもの作ったら客からクレームが来る

55: 名刺は切らしておりまして 2018/06/01(金) 19:53:59.14
ボケ防止

58: 名刺は切らしておりまして 2018/06/01(金) 19:57:33.67
一番役立ってるのが、数字に3桁毎にカンマを入れるやつ
$val =~ s/(?<=\d)(?=(?:\d{3})+$)/,/g;

59: 名刺は切らしておりまして 2018/06/01(金) 20:02:12.92
>>58
俺はあれやな
ファイル名の連番の桁揃え

60: 名刺は切らしておりまして 2018/06/01(金) 20:02:49.81
ERGのテキスト監視→コピペ→棒読み自動読み上げで鍛えた正規表現を仕事で活かし、さらにレベルアップを図って正確なERGセリフの抜き出しが出来るという相乗効果

63: 名刺は切らしておりまして 2018/06/01(金) 20:22:05.11
素人さん辺りからそんけーの目で見られる

65: 名刺は切らしておりまして 2018/06/01(金) 20:31:34.99
正規表現はプログラム書くなら常識中の常識でしょ

個人的にはそれよりも
ちゃんとした擬似言語を書けるようになりたい

73: 名刺は切らしておりまして 2018/06/01(金) 20:51:19.39
>>1
正規表現使わないプログラマーとかっているの?

78: 名刺は切らしておりまして 2018/06/01(金) 20:58:44.36
>>73
プログラム以外で正規表現って?

76: 名刺は切らしておりまして 2018/06/01(金) 20:56:00.48
単純なのものは便利だけど長くなるとメンテできない

77: 名刺は切らしておりまして 2018/06/01(金) 20:56:06.33
>>1
スクワーム
クリープショー
物体X

79: 名刺は切らしておりまして 2018/06/01(金) 21:00:43.59
全く使ったことないけど、データベースとかだとつかうの?

80: 名刺は切らしておりまして 2018/06/01(金) 21:04:32.60
>>79
SQLではまずつかわないだろうな
完全一致、前方一致、後方一致、部分一致くらいなもんだろ

81: 名刺は切らしておりまして 2018/06/01(金) 21:05:21.90
>>79
たとえばMySQLではREGEXP演算があるね
抽出条件の記述に使える

83: 名刺は切らしておりまして 2018/06/01(金) 21:06:01.51
通常言語の記述が複雑になりすぎるとき以外は使わない
メンテを考えるとほかの人に渡しにくいから

88: 名刺は切らしておりまして 2018/06/01(金) 21:08:48.80
無いと仕事にならん

92: 名刺は切らしておりまして 2018/06/01(金) 21:12:31.19
Jgawkの一行野郎!で多用されるあれか

93: 名刺は切らしておりまして 2018/06/01(金) 21:13:32.41
IoT(処理)の半分は、RegEx(処理)だろ。
言語の内部処理も、半分は同じだろ。
知らないのは、お前だけ。

95: 名刺は切らしておりまして 2018/06/01(金) 21:15:39.59
NGワードくらいしか

97: 名刺は切らしておりまして 2018/06/01(金) 21:17:05.68
現状の正規表現を機械語としたときの高級言語が欲しいよね

99: 名刺は切らしておりまして 2018/06/01(金) 21:23:14.31
>>97
解析するためのツールとしては役に立つかもしれない
入力に関しては表現を冗長にしたら利便性が失われるだけ

102: 名刺は切らしておりまして 2018/06/01(金) 21:25:06.84
醜い片仮名語を多用する奴は知恵遅れ。

105: 名刺は切らしておりまして 2018/06/01(金) 21:29:32.62
 
正規表現1行でも
効率を考慮して記述しているのか
プログラマの力量がバレる

同じ記述のムダな繰り返しとか
超絶カッコ悪いw

106: 名刺は切らしておりまして 2018/06/01(金) 21:29:40.33
正規表現の必要性は認めるけれど
ちょっと長い正規表現をみて、どういう処理をしているかすぐに説明できますか?

108: 名刺は切らしておりまして 2018/06/01(金) 21:30:51.79
>>106で解決♪

111: 名刺は切らしておりまして 2018/06/01(金) 21:36:50.33
長い難解な正規表現を1行書く事が「俺ってカッコイイ」というおかしな風潮があるよね

そんな事しないで、論理的な単位で分割して、わかりやすい変数名で文字列を定義して、最後に連結してコンパイルする
とかしてくれればいいのにねー
もちろん、コンパイルは遅いので、最初の1回だけで済むようにしたいけど

113: 名刺は切らしておりまして 2018/06/01(金) 21:41:25.76
>>111
個人でやっている分にはそれでもかまわないんだけどね
企業ベースだと、正当性の検査、メンテナンスチームへの引継ぎ、等々

あと、個人ベースでも時間がたって見直すと、あれ何やってたっけとか

117: 名刺は切らしておりまして 2018/06/01(金) 21:44:54.82
>>111
この種の問題全般に言えることだけど
やってる当人は必要にかられてやってることでも、周辺の人間が異様にバイアスの掛かった視線で見てることって多いな

118: 名刺は切らしておりまして 2018/06/01(金) 21:47:45.47
でも正規表現使えない検索ボックスであああああってなる
地元図書館の蔵書検索とか

スポンサード リンク