正規表現

■ このスレッドは過去ログ倉庫に格納されています
NGNG
正規表現
NGNG
>>241
そりを正規表現(だけ)で実現するのは難しいのでは?

普通は、grep なら -v とか、スクリプト言語なら !~ /word/ とかするんじゃないかと。
243189=207
垢版 |
NGNG
>>241
perlの拡張正規表現を使えば出来るよ。
/^(?!.*word)/

244あぼーん
垢版 |
NGNG
あぼーん
NGNG
オ来リーの者じゃありませんが・・・

『詳説 正規表現 第2版』

Jeffrey E. F. Friedl 著
田和 勝 訳

2003年5月発行 -- 5月27日発売
464ページ
本体価格5,400円
ISBN4-87311-130-7

テキストやデータの処理に欠かせない強力なツールとして瞬く間
に普及した「正規表現」。現在ではPerl、Java、VB.NETやC#など
数多くの言語やツールに標準で装備されています。その幅広い可
用性、柔軟性と比類ない強力さにもかかわらず、実際に正規表現
を使いこなすことは難しいです。本書は正規表現の概念を詳細に
掘り下げる一方で、数多くの言語やツールの実例を示しながら、
正規表現についての理解を深める解説書です。第2版では、豊富
な実例を使い、詳しくていねいに解説するスタイルはそのままに、
Perl5.8の新機能に加え、Javaと.NETの正規表現にもそれぞれ独
立した章を設けるなど、全編にわたって大幅に加筆がなされまし
た。正規表現の本質を読み解く決定版です。とくに正規表現を使
いこなしていると自負している人にほど読んでほしい本です。
NGNG
あれ?今日買ってきたんだけど27日発売だったのね…
NGNG
>>246
つーことで発売記念age
NGNG
素数にマッチする正規表現募集。
NGNG
>>245
第1版と比較してのレビューきぼんぬ
NGNG
>>249
> 2003年5月発行 -- 5月27日発売
とあるからまだ無理なのでは
NGNG
>>248
正規表現だけでなく、なんかしら言語使ってやればよい。
NGNG
>>248
何故敢えて茨の道を行くのか?
253名無しさん@お腹いっぱい。
垢版 |
NGNG
>>245
これの第1版買ったのですが、いまいち難しかったです。
もっと易しい本ってないですか?
NGNG
>>253
Ruby の初・中級者なら、「Ruby Magic―Rubyで極める正規表現」はお勧め。
255245
垢版 |
NGNG
>>249
第1版を持ってないので比較は出来ないっす。
# 買おうと思ったら第2版が出ることを知ったので待ったのだ。

ここに特徴や目次が紹介されているので見てもらうとして
  ttp://www.oreilly.co.jp/BOOK/regex2/
  ttp://www.oreilly.co.jp/BOOK/regex2/contents.htm

まえがきから第1版との違いを判断すると
  - Unicodeのちょっとした解説
  - Perl5.003からPerl5.8対応に
  - Java1.4のjava.util.regexと、その他6つの正規表現パッケージの比較
  - .NET framework正規表現の特徴と問題点、M$のドキュメント(貧弱らしい)の補足
のように言語サポートが新しくなった/増えたって感じ。

最初はHTMLのサンプルを少々追加する程度の予定(3ヶ月の見込み)だったみたいだけど、
結局は2年の歳月をかけて全面的に加筆修正することになったそうだ。

難易度は第1版と変わらないのではないかな?
# 読み易くなってるのかもしれないけど。。
>>253の期待には応えられないと思う。
> とくに正規表現を使いこなしていると自負している人にほど読んでほしい本です。
という宣伝文句があるくらいだしね。

>>250
いや、24日に買えたのよ。
NGNG
今日発売か。
昼休みに買ってくるか。
NGNG
>>256さん、どうですた?
258249
垢版 |
NGNG
>>255 さんのと、今日立ち読みした感じで、第2版も購入することにしますた。
そういえば、翻訳者 (監訳者) が変わってたんですね。
NGNG
sed のタグ付き正規表現についてちょっと教えれ。たとえば、

{________I'm_dreaming_of_a_White_Christmas_}
{_Just_like_the_ones_I_used_to_know__}
{____Where_the_tree_tops_glisten_}

の前後の余計な _ のトリミングをしようと思って
sed 's/{\(_*\)\(.*\)\(_*\)}/{\2}/g'
とやっても意図した結果にならない。\2 をうまくマッチさせる方法は?

まぁこの例なら簡単に逃げられる - たとえば sed 's/{_*/{/;s/_*}/}/' -
わけだが、apache の log とかの簡単なパース(並び替えとかそんな程度)を
タグ付き正規表現でさくっと処理できれば楽でうれしい。よろしく。
NGNG
二個目の*がlongest matchしようとして
3個目の*にmatchさせたいであろう_まで持っていってしまうのが原因。

sed -e 's/{_*\(.*[^_]\)_*}/\1/'
NGNG
'<,'>s@^@//@
NGNG
最少マッチって perl とか ruby にしかない?
sed, grep 等の伝統的 tool にはないの?
NGNG
>>262
ないよ
264名無しさん@お腹いっぱい。
垢版 |
NGNG
>>262
grepに最小一致の機能があったとして
それの魅力はイッタイ何なのだろうか?
265あぼーん
垢版 |
NGNG
あぼーん
266262
垢版 |
NGNG
確かに sed では使っても grep では使わないかも。
いや、でも後方参照する時に必要なこともありえますね。
NGNG
>>257
昼休みにいきつけの書店にいったが売ってなかったんで。
帰りに別の書店で買った。
でもまだ読んでない…
通勤時間に読むっつーてもあれを毎日持ち歩くのは
重たいしなぁ。
268名無しさん@お腹いっぱい。
垢版 |
NGNG
文字列中、丸括弧(全角、半角問わず)で閉じられた部分を取り出す表現を考えているけど、うまくマッチしてくれない。
(丸括弧の中に丸括弧は含まない。Perlの正規表現を使用)

$string = '(22(1)';
if($string =~ /[((]([^()()]*)[))]/){
print $1;
}
else{
print "No match..";
}

この場合は"1"がマッチするのを期待しているのだけど、なぜか"22"の部分がマッチした。
OS(UNIX/WinXP)、Perlのバージョン(5.0/5.8)の異なる環境で同じことを確認したけど、結果は変わらず。
さらに、文字コード(Shift-JIS/EUC)の違いでも、結果は変わらなかった。

"1"をマッチさせる別の表現はないですかね?

# 全角"("の中にどうも半角")"の文字が隠れてるのかなぁ?(あくまでも推測)

NGNG
>>268
おめな、2byte文字と1byte文字が同じに扱われると思ってるらしいな。たぶん、
文系のドキュソだな。しかも、すぐ上で2byte文字コードの話出てたの見てね
えな。こいう、初心者質問は、webprogのPerl初心者スレ逝け。

NGNG
>>268
Perl5.8.0 + UTF8 でやったら 1 になったよ。
NGNG
[ ] のなかに '-' と ']' の両方を入れたい場合はどうすればいいのですか?
NGNG
>>271
何で?
NGNG
>>271
[]-]
NGNG
>>271
!.-[
NGNG
保守
NGNG
regexp ml盛り上がってますね。読んでて楽しい。
NGNG
このスレはいつからまともな人たちをヲチするようになったのですか?
NGNG
すいません、テキストファイルの中の .bananaなどの単語(行頭ではなく)の先頭が
ドットがあるものだけをgrepで抜き出したいのですが、jp.appleのような単語までひっかかって
しまい上手く絞り込めません。

アドバイスをお願いします!!
NGNG
>>278
\b?\.\w+?
で、どうじゃろ?
NGNG
>>279
すいません、なんか上手くいかないです。
ls -laでディレクトリ内の全ファイルを表示して、grepで隠しファイルだけを抽出したかったのですが。
NGNG
ls -la | grep ' \.'
ではあかんの?
NGNG
>>281
行のどこかに"."があれるとヒットしてしまうんです
NGNG
ls -la | grep '^\.'
こういうこと?
NGNG
>>282
とはいえ、"."って、ファイル名にしかでてこないよね?
>>281 をよーくみる。
285283
垢版 |
NGNG
間違えた。

ls -1a | grep '^\.'
これか
ls -la | grep ' \.'
これだな。下は余計なものを拾う可能性もあるが。
NGNG
ls -d .*
なんてね。
NGNG
あ、正規表現スレだった。すまん。
NGNG
ヤハリココハオモッテタトオリバカバッカリダッタナ(プ
NGNG
ls -la | awk '$9 ~ /^\./{print $0}' はどうよ。
290名無しさん@お腹いっぱい。
垢版 |
NGNG
>>280 ふつーそういうときは ls つかわず findつかえ。
find ./ -type f -name "\.*" -print
NGNG
(())
NGNG
>>290 ふつーそういうときは >> つかわず >> つかえ。
NGNG
backreferenceを前方参照と訳したのはなぜですか?
NGNG
後方参照としている訳もあるよ。
まぁ、現在の位置よりも前を参照するという意味では
日本語的には前方参照であってると思う。
ようするに「今いる位置より戻って参照」って意味になるんだから。

んでも、意味を考えて訳すなら「戻って参照」とか、どう?
NGNG
>>294
ちょっと前にCスレで話題になったんだけど、Cで「前方参照」といった場合の前方って、
ファイルの終端方向を指す。「ひどい訳語だ」ってことで話は終わったんだけど、
正規表現でも混乱が見られるしなんかいい言葉ないもんかねえ。

日本語では時間を表す文脈で「前」にまるで正反対の意味があるからよくないのだと思う。
「以前」だと過去だし「前進」だと未来だし。

あとこれはすれ違いか? そうだよね。すまん。
NGNG
>>279 >>281 >>283 >>284 >>285 >>286 >>287 >>289 >>290

みなさま、ありがとうございます。

シングルクォーテーションに空白が使えたり、
アッパーチルダとハット(キャレット?)の区別を知ったりと、
正規表現の難しさを知りました。

今、「テキストデータ料理学」っていう古い本を読んでいるのですが、
オライリーの正規表現本は買ったほうがいいですか?

(もう2〜3週間前にオライリーのサイトでカタログを注文したのに、
まだ来ない…)
NGNG
おれは初版も新しいのも持ってるけど、自分の知識に自信がないうちは
お薦めしない。もちろんあったらあったで便利だけど。

やっぱり、「俺、正規表現バリバリだぜーYAH」状態で買って読んで
目からうろこ落ちまくり感を堪能するのがいいんではないかと。
298名無しさん@お腹いっぱい。
垢版 |
NGNG
>294
するってえと、正規表現的には日本語で前方参照あるいは後方参照と書いてあったら
どっちもbackreferenceと思えってわけだぁね。
>295
計算機分野だと「前方」という言葉はforwardの訳語というのがあたりめえだと思ってたから、
正規表現関係だと、「前方参照」がbackreferenceのことだっていうのがわかんなくて
難儀したってわけよ。
NGNG
>>297
>>296は学ぶ意欲を持っているから、今のうちに買っておいて損はないと思う。
むしろ薦める。
オイラリーはハズレが少ないからな。
NGNG
>>298
俺はperlから入ったから後方参照が当たり前かと思ってた。
他言語使うようになってから吃驚したってわけよ。
301298
垢版 |
NGNG
perl5の日本語マニュアルで、「前方参照」を "lookahead assertion"の訳語として
使っているやつがあった。

(?=regexp) 長さの無い、前方参照位置指定子。
(?!regexp) 長さの無い、前方参照否定位置指定子。

英語だと

(?=pattern) A zero-width positive lookahead assertion.
(?!pattern) A zero-width negative lookahead assertion.

わけわかんねぇな(w
302298
垢版 |
NGNG
ありゃりゃ?

(?<=pattern) A zero-width positive lookbehind assertion.
(?<!pattern) A zero-width negative lookbehind assertion.

"lookbehind assertion" の訳語って何だ?
NGNG
「俺の背後に立つな」
デューク東郷の格言だろ。
NGNG
lookahead 見越し
lookbehind 見返り
NGNG
前後不覚だな。
NGNG
>>296
>オライリーの正規表現本は買ったほうがいいですか?

持ってなくても覚えられるし、
エディタのサーチとか grep とかで実験しながら
感覚的に慣れるのも悪くないんじゃない?

ただし emacs で覚え始めるのはすすめない。
backslash で混乱する。
NGNG
>>297
>>299
>>306
ちょっと大きな本屋に行って立ち読みしてみます。
ありがとうございました〜
308あぼーん
垢版 |
NGNG
あぼーん
NGNG
>>308
二度と目を覚ますな。
310あぼーん
垢版 |
NGNG
あぼーん
NGNG
さげ保守
NGNG
OOはもうすぐ1.1出るけど、MSWORDよりセキュリティ大丈夫かな?
http://pc2.2ch.net/test/read.cgi/bsoft/1055292975/392
313あぼーん
垢版 |
NGNG
あぼーん
314高校生
垢版 |
NGNG
boo
baa
baz
っていうテキストが例だとして、sedを用いて、
booまたはbaz、っていう正規表現はどうなるの?
rubyやperlならパイプ記号で条件和の表現が出るけど、
同じように書いてもsedに誤解されてしまう。
NGNG
>>314 ん? \|使えば良いのでは
316高校生
垢版 |
NGNG
sed 's/boo\|baa/hoge/g' ./hage.txt
とかだとやっぱりだめなんすよね。
「boo」とかの単語の括り方がよくわからんのです。
NGNG
GNU sed 4.0.7版 ではそれでもできてるけどな。
sed 's/\(boo\|baa\)/hoge/g' これでどう?
NGNG
>>317
gsedならできるがsedは食ってくれない。
NGNG
単一の正規表現じゃなきゃいかんの?
sedと決まってるなら
sed -e 's/boo/hoge/g' -e 's/baa/hoge/g'
でいいんちゃう?

置換後の文字列と置換前の文字列の片方とで重なりがある場合
どうするかひとしきりモメたりする ↓↓↓ のがお決まりだな。
NGNG
単一の正規表現でないと記述が冗長で見た目がキモイ、
っていうのはあると思うよ。
おいらはインストール直後のFreeBSDの環境構築をスクリプトに任せたくて、
結局シェルスクリプトにawkな記述を書いて解決した。
カーネルの再構築にしても、/etc/下の記述にしても、要はテキストの置換なわけで。
本当はrubyがFreeBSDの/usr/bin下にあるようなご時世だったら
楽ができるんだけど、そこら辺は個人的な勉強不足だなぁ。
321名無しさん@お腹いっぱい。
垢版 |
NGNG
{a,b}上の言語Lが
『aaで開始し、かつ、bbを部分列として含む』という条件を満たす語からなるとき
Lを表す正規表現ってどうなるの?
L=aa(a*b*+bb)* ?
NGNG
L=aa(a+b)*bb(a+b)*
NGNG
>>321
*+ ???
NGNG
>323
'+'より'|'のほうが普通かな。
L=aa(a|b)*bb(a|b)*

本来的には連接、選択、閉包が表現できればいい。
NGNG
L ::= aA
A ::= aB
B ::= aB | bC
C ::= aB | bD
D ::= ε | aD | bD
NGNG
.*
何にでもマッチする最強の正規表現です!
327名無しさん@お腹いっぱい。
垢版 |
NGNG
>>326
ドットが含まれてなかったらマッチしない罠
NGNG
キター
NGNG
ageてるし、ネタと見た。
NGNG
>>329
しね!
331あぼーん
垢版 |
NGNG
あぼーん
332あぼーん
垢版 |
NGNG
あぼーん
333名無しさん@お腹いっぱい。
垢版 |
NGNG
うまづら。
NGNG
ほす。
NGNG
☆湯
NGNG
[ruby-list:38393] じゃないけど、[a-z] みたいな文字クラスの表現は、
EBCDIC とかだと「意図した通り」には動かないと思うんだけど、
ASCII か ASCII を包含したキャラクタセットという前提で書くべきものなの?
NGNG
>>336
[:lower:] とかは使っちゃだめ?
NGNG
>>337
あ、いや、質問が悪かったですね。
範囲指定する文字クラスはどうあるべき (書くべき) か?っていう話です。

ていうか、 re_format(7) を私の拙い英語力で読んでみたところ、
ASCII コードの並びを前提とするような文字クラスの範囲指定は、
portable じゃないからやらない方が良い、ということのようですね。

というわけで、極力 >>337 さんのみたいな文字クラス指定を使った方が良い、と。
NGNG
NGNG
保守
341名無しさん@お腹いっぱい。
垢版 |
NGNG
vimで"DEL"という文字列が含む行で、"DEL"以下を削除したい場合はどうしたらいいでしょうか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況