トップページ⇒tech
131コメント32KB

正規表現

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
0002デフォルトの名無しさんNGNG
0003デフォルトの名無しさんNGNG
0004デフォルトの名無しさんNGNG
(*.*)
0005デフォルトの名無しさんNGNG
    / ̄ ̄ ̄ ̄ ̄ ミ
    /   ,――――-ミ
  /  /  /   \ |
  |  /   ,(・) (・) |
   (6       つ  |
   |      ___  |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   |      /__/ /  <   ああああああああああああああああああああああああああああああああああああああああああああああああああ
 /|         /\   \________
0006デフォルトの名無しさんNGNG
C++で使える正規表現ライブラリ教えれ。
定番のヤツない?
0007デフォルトの名無しさんNGNG
regex
0008デフォルトの名無しさんNGNG
ここが正規表現のスレかぁ・・・
0009デフォルトの名無しさんNGNG
([1-8])|([1-9][0-9]+) は逝って良し
0010デフォルトの名無しさんNGNG
規則にこういうのがありますが、

 * 直前のパターンの0回以上の繰り返し。
 + 直前のパターンの1回以上の繰り返し。

*と+について、「直前のパターン」が無かった場合、どうなるのでしょう?
例えば*だけの場合。
*
これはエラーとして弾くのが妥当ですか?
0011デフォルトの名無しさんNGNG
POSIX以外に、正規表現って規格化されてる? 例えばSQLとかだって
規格があるじゃん。ANSIだっけか。
ところが正規表現って、オレはNFA、あいつはDFAってレベルで、メタ
文字はなんでも\w(別に\aでも言い訳じゃん)なのは何故でしょう。
0012デフォルトの名無しさんNGNG
>([1-8])|([1-9][0-9]+) は逝って良し
>>9 の本文でマッチしました
0013デフォルトの名無しさんNGNG
正規表現つったら今やperlのが代表的ですが、
pythonとかrubyの正規表現ってどの程度でしょう?
0014謎NGNG
今年3月に孫のところから出版された
『性器表現の達人』
でも買って読め
0015デフォルトの名無しさんNGNG
なんで荒れるのかなあ?
0016デフォルトの名無しさんNGNG
性器豹変の達人です。
0017あれらNGNG
言語はプログラミングのためにあるわけじゃないみたい。でしょ?
話は逆で、うちらはたまたまそこにある言語とゆものを利用したり悪用したりして、偶然なんかの役に立ったりもするコードができたりできなかったりする。
0018デフォルトの名無しさんNGNG
?わからん
0019デフォルトの名無しさんNGNG
>>10
*は0回以上の繰り返し、ゆえに0でもオケ。
+は一回以上の繰り返し、ゆえに0はペケ。
だったような
0020デフォルトの名無しさんNGNG
>>19
じゃなくて、RE自体が不正だろ、/*/なんてのは。
0021デフォルトの名無しさんNGNG
>>20
そっか、直前のパターンのない*は不正って事か。
勘違いしてた、さんくす
0022デフォルトの名無しさんNGNG
つまり
*
+
単体ではペケってことでいいですか?
0023デフォルトの名無しさんNGNG
現実的で役に立ちそうな正規表現おせーて
0024デフォルトの名無しさんNGNG
>>23
http://www.din.or.jp/%7Eohzaki/perl.htm
0025デフォルトの名無しさんNGNG
>>22
直前のパターンがないときはメタキャラクタと見なさないという実
装もある。Emacsだとか。
0026デフォルトの名無しさんNGNG
>>25
それはなんか誤解を招きそうですね。
でも、普通の式解析で言えば、2項演算子の/や*とかが、
いきなり現れた様な物だから、それは演算子ではない、
では何か?→ただの文字、って解釈もアリなのかな。
0027デフォルトの名無しさんNGNG
では何か?→エラー
の方がほんとは親切だと思う。
メタキャラクタの無効化の手段は他に用意されてるわけだし。
0028デフォルトの名無しさんNGNG
s/age//
0029デフォルトの名無しさんNGNG
>>28
ageを空文字列に置き換えたら上がらないのでは……?
0030デフォルトの名無しさんNGNG
>>29
空白だとあがると思われ
003130NGNG
ごめん、sage忘れた。
0032デフォルトの名無しさんNGNG
>>26
キャラクタクラスなんかひどいもんだよ
0033デフォルトの名無しさんNGNG
オライリーの詳説正規表現は難しい。
0034デフォルトの名無しさんNGNG
正規表現だけで一冊の本が書けるものなの?
0035デフォルトの名無しさんNGNG
>>34
既にこのスレの中だけでも二冊タイトルが出ているが?
0036デフォルトの名無しさんNGNG
sage
s/a//
0037デフォルトの名無しさんNGNG
sgeにしてどうする
s/s//
0038名無しさんNGNG
性器表現
0039shigeNGNG
ぷっぷぷぷ。使い古されたネタを書き込んで楽しいか?
0040デフォルトの名無しさんNGNG
sedで改行コードを無くし複数行を連結する方法を教えて下さい。
'\n'で追加はできるんですけど削除はできないものなのでしょうか?
0041デフォルトの名無しさんNGNG
awk使えば?
0042デフォルトの名無しさん NGNG
>>39
s/g/n/
0043デフォルトの名無しさんNGNG
>>42
ワラタ。最初 sane って何よ? とか思ったけど(w

>>40
sed でできない気がする...
tr -d '\n' とかならできるけど、正規表現でもなんでもないな。
ということで sage
0044shineNGNG
ハァ?
0045デフォルトの名無しさんNGNG
>>40
s/\n//gじゃだめかい?
crlfなら
s/\r\n//g
0046デフォルトの名無しさんNGNG
昔、sedで足し算したり、
位取り付き漢数字変換(12345←→壱拾弐万参千四百五拾六)する
スクリプトを作ったことがある。
今となっては懐かしい思い出。
0047デフォルトの名無しさんNGNG
>>40
Perlだと簡単にできるような気がします。
Perlはsed、awkの機能も含んでるからいいと思います。
0048デフォルトの名無しさんNGNG
root用のシェルスクリプトにはperlは使わないね。
004943NGNG
>>45
少なくとも GNU sed 3.02 はダメだったけど...
いける実装の sed もあるのかもしれない。

>>48
そうでもないよ。
005040NGNG
遅くなりましたがレスくれた方どうもです。
えーと"sed"で、と書いたのはvi系のエディタのコロンコマンドで連結を
行いたかったからです。Perlやawkとか答えてくれた方すいません。
Jコマンド+map機能を使ってもいいのですが・・・。
パターンを含む行の改行を取り除くみたいなことが簡単に行いたいです。
ちなみに使っているエディタはviviです。vimとかなら可能なのでしょうか?
0051デフォルトの名無しさんNGNG
s/a/g/e
0052性器表現NGNG
オス qp db o|o
メス (())
0053デフォルトの名無しさんNGNG
>qp db o|o
何かと思ったら、ちんぽか。
0054デフォルトの名無しさんNGNG
御開帳: ((@))
0055デフォルトの名無しさんNGNG
良スレage!
0056おちんちんNGNG
8------------>
0057デフォルトの名無しさんNGNG
ネスレ
0058デフォルトの名無しさんNGNG
ニッポン
0059デフォルトの名無しさんNGNG
日本語対応した正規表現ライブラリ(かDLL)で
お勧め教えてください。
0060デフォルトの名無しさんNGNG
regex
0061ミルク性器NGNG
   \|/
     /⌒ヽ
    │   ヽ  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
    │  ゚ Θ゚)<ちょっと、おめこをナメてくらあ。
     〕   〔   \_______
    /   ヽ
   /  ∵  \
  / / ∵∵ト、\
  │ |ヽ ∵∵/  \ \
  │ | │ ∵│   (_)
  (_)│ ∵│
      \ \/
     / \ \
    / /  \ \
  / /     \ \
 (   ̄)      (   ̄)
0062デフォルトの名無しさんNGNG
定期age
0063デフォルトの名無しさんNGNG
yamada と tarou の両方が含まれている(大小文字及びyamadaとtarou順番は問わない)文字列にマッチするのは

(.*([yY][aA][mM][aA][dD][aA]).*([tT][aA][rR][oO][uU]).*)|(.*([tT][aA][rR][oO][uU]).*([yY][aA][mM][aA][dD][aA]).*)

とするしかないのでしょうか。
0064デフォルトの名無しさんNGNG
>>63
/(yamada.*tarou|tarou.*yamada)/i
ではダメ?
0065デフォルトの名無しさんNGNG
UZURAすごいな。
どういう仕組みになってるんだろうか…?
0066デフォルトの名無しさんNGNG
$a="yamada";
$b="tarou";
/($a.*$b|$b.*$a)/i
でもいいのかな?演算子の優先順位が良く分からんが…
0067デフォルトの名無しさんNGNG
品詞分解って何をどうやってるの?
0068デフォルトの名無しさんNGNG
形態素解析?
ttp://www.t.onlab.ntt.co.jp/sumomo/
ttp://chasen.aist-nara.ac.jp/index.html.ja

単純に文字列にマッチするかどうか調べる正規表現より
ずっと難しいと思う。
0069デフォルトの名無しさんNGNG
<history date="YY/MM/DD" memo="更新内容">

こういうタグの解析をしたいのだけど、”更新内容”には
2バイト文字が入る事を前提にしたいのね。
2バイト目の " と、半角文字の " はどうやってくべつすればいいのかしら?
/(<history(\s+)date=[\"](\d+)[\/](\d+)[\/](\d+)[\"][\s]+memo=[\"](.*)[\"]>)/i;
$year =$1;
$month=$2;
$day=$3;
$memo=$4;
でいけるかな。
0070デフォルトの名無しさんNGNG
>>69
幸いにして"はEUCやSJISとは重ならない。
ISO-2022-JPが対象ならいっぺん変換した方がいい。
0071デフォルトの名無しさんNGNG
1-3,6,7-8,9,10,111222,11111-116166
とう文字列があります
1 ハイフンでつながれた数字を取り出す
<パターン>[0-9]*-[0-9]*"
  <結果>1-3 7-8 11111-116166
2 両端が,の数字を取り出す
 <パターン>?
<結果>6 9 10 111222

1のほうは多分書いたパターンでいいと思うのですが、
2がなかなかうまくできないです。
教えていただけますか?
0072デフォルトの名無しさんNGNG
>>71

,[0-9]*?,
じゃだめ?最小マッチ指定すればよいと思うんだけど
最小マッチの記号忘れた。
007371NGNG
補足
1,2-3,4,5,6
のようなパターンもあります。
このばあいは
1 4 5 6
とマッチさせたいです
0074VB厨房NGNG
SOFTBANKから出ている「正規表現の達人」という本は良本?
0075デフォルトの名無しさんNGNG
>>73
それも72の方法でいける気がする。
0076デフォルトの名無しさんNGNG
>>75
一回マッチするとその次の検索は後ろの,のあとから始まるので、そ
の直後の数字にマッチできない。look-aheadを使えば
/,[0-9]+(?=,)/
あるいはlook-behindをつかって
/(?<=,)[0-9]+,/

前後の,を除外するにはlook-ahead/look-behind両方が必要。
/(?<=,)[0-9]+(?=,)/
0077デフォルトの名無しさんNGNG
こういうことか?Perl Regexだけど。
(?<=,)[0-9]*?(?=,)
007871NGNG
look-aheadはPerl6からの機能ですか?
org.apache.oro.text.perl.Perl5Util
をJavaでつかってます
(?<=,)
の部分が例外になってしまいます。
やっぱり手で書くしかないのかな
0079デフォルトの名無しさんNGNG
http://natto.2ch.net/test/read.cgi?bbs=gender&key=997593620
0080デフォルトの名無しさんNGNG
[^,][0-9]*[$,]
じゃなくて?
0081名無しさんNGNG
>単純に文字列にマッチするかどうか調べる正規表現より
>ずっと難しいと思う。
正確さを諦めればずっと簡単。
かんなの辞書データで最長一致を求めていけば意外と
辞書の構成の妙でうまく単語分解するのでびっくり。
もちろん、本格的なシステムにはなんないですけど、
キーワード検索程度には使える。
0082デフォルトの名無しさんNGNG
>>78

Perl5.005 からの機能
0083デフォルトの名無しさんNGNG
性器表現で痴漢
0084デフォルトの名無しさんNGNG
>>74
オライリー「詳説 正規表現」を飼え
「正規表現の達人」は浅すぎる。
0085デフォルトの名無しさんNGNG
超厨房質問だけど、文字列hogeが*含まれない*行全体にmatchするのって
どうやればいいのかな?
0086デフォルトのななしさんNGNG
そこらへんは正規表現の機能ではない。
egrepやsedなら-vオプション、
Perlなら{ hogehoge if $_ !~/pattern/; }
だろうな。
0087デフォルトの名無しさんNGNG
^[^h][^o][^g][^e]*$
でウチのエディタ(JRE32.dll使用)は何故かマッチした。アレ?
008887NGNG
いや、勘違いだった。ごめん。
0089デフォルトの名無しさんNGNG
>>85
/^(?!.*hoge.*).*$/
009085NGNG
>>89
二つ目の.*はいらなかった。
/^(?!.*hoge).*$/
009190=89NGNG
なにやってんだか。鬱。
0092デフォルトの名無しさんNGNG
数字が入っていない半角かっこを全角に置換する
ためにヒットさせる正規表現として「置換前」に入れるもの

  \(\f[^0-9)\n]*\f\)

をどこかで読んで使ってるんですが、分析ができないので、応用が利きません。
これを日本語にしてもらえないでしょうか?
とくに0-9の後の ")" が分からないんです。
0093デフォルトの名無しさんNGNG
>>92

何の正規表現?


\([^0-9]*\)

だと
(aaa)aaa) という文字が来たとき、1つ目の ) を含めて全体を置換してしまう(*は欲張り)。
[^0-9]* は「0から9以外のいずれか1文字が0個以上」という意味なので ) という文字も含まれてしまうため。

\([^0-9)]*\)

だったら 「0から9と ) 以外のいずれか1文字が0個以上」という意味になるので、
) という文字が来たときにマッチングは止まり、 (aaa) の部分のみが正しく置換される。
つまり、92さんの分からないという ) も 0-9 と全く同じように文字を指定しているに過ぎない。

一般に最小マッチが出来ない環境で * や + といった文字の欲張りな挙動を抑えるために

.*終了文字
.+終了文字

を

[^終了文字]*終了文字
[^終了文字]+終了文字

と書く。


(正確には

[^終了文字\n]*終了文字
[^終了文字\n]+終了文字

)

こんなんでどう?
0094名無しさんNGNG
[知っていると便利な女性器の主な隠語]
  穴、赤貝、赤烏帽子、赤団子、赤門、あけび、あぐら開き、上がりぼぼ、
 あさぼぼ、葦原、天岩戸、穴熊、あわび、あわびくぼ、あらばち、蟻の門
 渡り、青田八反、あたたかまんじゅう、空家、合わせ貝、泉、池、猪、磯
 巾着、淫門、厩、うなぎ開き、大口、おかんこ、奥の院、御香箱、お黒も
 の、おとし穴、斧きず、お鉢、大皿、お箱、落ちくぼ、おまんじゅう、お
 まん、おまんこ、おめこ、おちゃっぴい、かくしどころ、かくれどころ、
 かんこ、観音、開帳、歓器、柏餅、かわらけ、皮財布、貝、蟹、きず、巾
 着、玉門、客間、局所、くぼ、くみど、くぼみ、くど、桑名、くるみ、栗、
 毛雪駄、毛巾着、毛まんじゅう、毛靴、毛桃、鯉口、御秘蔵、木ノ実、故
 郷、香開、細工場、さかずき、ささげ、三寸、三角、逆さ富士、逆さ舟、
 鞘、蜆、四十八ひだ、しなたりくぼ、しも、下の口、品物、朱門、女根、
 すずり、すだれ、巣、すり鉢、せり箱、そそ、空、そら豆、空割、たれ、
 たま、谷間、大衆風呂、足袋、たらい、丹穴、茶碗、茶釜、茶壷、筑紫つ
 び、ちゃんこ、ちゃんべ、ちょこ、ちんつび、つびたり、つぼみ、つぼ、
 つか袋、露穴、鉄開大明神、兜巾、戸口、洞庭の月、洞門、道具、常闇、
 とさか、戸立、薙刀、情所、内陣、なま貝、奈落、肉まんじゅう、如来、
 沼、のこ、乗合舟、畑、蛤、花、はじけ豆、はりま鍋、火消壷、ひなさき、
 びり、菱餅、秘境、人穴、船霊、風呂、舟、ふいご、篩、へき、べにうす
 ざん、へへ、へっぺ、べっちょ、へその下、べこ、ほと、ぼぼ、ぼぼじょ、
 ほがみ、報謝開、ぼぼっこ、牡丹餅、ぼっしょー、ぽっぽ、ぽっぽじょ
0095デフォルトの名無しさんNGNG
>>93
多分秀丸の正規表現だと思われ。
マッチした部分を置換後文字列に反映させる時に\fって使ったような。
009692NGNG
>93さん、ありがとう。
秀丸マクロです。
ご説明、よくわかりました。特に前半部分。

あと、後半部分の、「終了文字」あたりがまだ理解不十分です。
良い例があったらと探しているんですが、思いつかないので、
よかったらお聞かせください。
0097デフォルトの名無しさんNGNG
秀○と荒らしが出てきた所で、
このスレは終了します。
0098終了中申し訳ありませんが・・・NGNG
例えば、$lines[20-21]について・・・
<td><a href="./kabe/shingomama.gif"><img src="new.gif">慎吾ママ</a>[120*120]<br>
<a href="./kabegami/you.gif">IS IT YOU?</a><br>
こういった文字列の<a href=■■■■.gif>って文字列だけを、
<a href=■■■■.htm>に変える方法がわかりません(^^;
どなたか解いていただけませんか?
0099デフォルトの名無しさんNGNG
そもそも正規表現ってどういう意味なのですか?
0100デフォルトの名無しさんNGNG
>>99
正規文法・正規言語・正規表現・有限オートマトンあたりで検索。
0101デフォルトの名無しさんNGNG
「何が正規表現であるか」はおれもわかるけど、
「なぜそれを正規表現と呼ぶか」は、たいていだれも、
なかなか技術の本では教えてくれないな。

たぶん言語学の本にのってる?
0102デフォルトの名無しさんNGNG
>>98
undef $/;
while(<>){
s/(<.*?>)/gif2html($1)/esg;
print ;
}

sub gif2html{
my $string = shift;
$string =~ s/([\w\d]+\.)gif/$1html/g;
return $string;
}
0103デフォルトの名無しさんNGNG
>>101
「正規文法と同等の表現力を持つから」だと思うが、そもそも何で
正規文法と呼ぶのかは謎ですね。

文脈自由文法あたりは、なんとなく意味が通るけど。
0104デフォルトの名無しさんNGNG
>>102
s/(<a href="\w+)\.gif(">)/\1.html\2/g;
じゃだめなの?
0105104NGNG
スラッシュわすれた。あと.htmか。
s/(<a href="[\w\/]+)\.gif(">)/\1.htm\2/g;
0106デフォルトの名無しさんNGNG
知らない人のために:
http://ei5nazha.yz.yamagata-u.ac.jp/~aito/lang-model/node18.html
文法とクラス

「文法とクラス」っていうよりは「文法のクラス」だろって
つっこみたいが。。あるいは「文法とその諸クラス」
0107デフォルトの名無しさんNGNG
>>103
文字通り、文法の規則性が高いからじゃないの。

入力文字列にどういう規則があるか、と考えたときに
有限個のキャラクタと数少ない規則で全てが表現
できます、というわけだから。微分もできるし。
0108デフォルトの名無しさんNGNG
じゃあ、「正則文法」とかいったほうが数学的にぴったりってこと?
0109デフォルトの名無しさんNGNG
>>108
あくまで「数学的には」そうかもね。

regularの訳語 正規/正則 は両方ある。
regularって原語でどういう意味に使われてるんだろうな。
0110デフォルトの名無しさんNGNG
"regular expression"と呼ばれる理由が書いてあるよ。

−正規表現の起源−
http://www.microsoft.com/japan/developer/scripting/jscript/doc/reconearlybeginnings.htm
0111デフォルトの名無しさんNGNG
マカロックとピッツ!こんなところで名前をみるとは。。
0112デフォルトの名無しさんNGNG
>>110 ほぉ。ふむ。

じゃ、正則じゃなくて正規って呼ばれるのは何でだろうね。
数学のほうのregularの訳語で正規って使うのかな?
0113デフォルトの名無しさんNGNG
ほんとは性器表現と書きたかった
とか
0114デフォルトの名無しさんNGNG
>>113
なんか、一気にレベルが下がったな。
0115デフォルトの名無しさんNGNG
>113
「詳説 正規表現」と同レベルだな
0116デフォルトの名無しさんNGNG
Cのプログラムを正規表現であらわしてください。
0117デフォルトの名無しさんNGNG
>>116
理論的に無理です。
0118デフォルトの名無しさんNGNG
$VAL = ([0-9]*)|([0-9].[0-9]*)
$NAME = [_A-Za-z][_A-Za-z0-9]+
$TYPE = (int|double|float|char)
$VAR = TYPE[ ]*(NAME|NAME = $VAL)*;
$FUNC = $TYPE[ ]+NAME[ ]+\(|TYPE NAME(;TYPE NAME)\)
0119デフォルトの名無しさんNGNG
「regular」という語には「気持ちの良い」という意味があるんだよ。

例: a regular fellow
  いいやつ、好漢
0120デフォルトの名無しさんNGNG
>>117-118
「Cの構文規則を」とは言ってないみたいだけど?
0121デフォルトの名無しさんNGNG
正規表現で検索できるWebの検索エンジンって無いッスかね
0122デフォルトの名無しさんNGNG
value="value"
でvalue以外をnullに置き換えたいんです

value=\"*\"
以外ってどう表現したらいいですか?
0123デフォルトの名無しさんNGNG
>>122

言語/環境は?

Perl ならたとえば

s/^value="(?!value\b)[^"]*"$/value="null"/;

…なんてのがうまく動いているようにみえる。
0124デフォルトの名無しさんNGNG
正規表現で、開き括弧と閉じ括弧が対応した文字列のマッチが作れないことって証明できる?
0125デフォルトの名無しさんNGNG
大学生の演習問題だな...
DFAと正規表現が同等なことを利用して、
DFAをつくろうにも状態数が無限になってしまうといえればいいのか?
0126デフォルトの名無しさんNGNG
>>125
なんとなく分かった気がする。
0127124NGNG
DFAがなんなのか知らなくて、ウェブでちょろちょろ検索してみたんだが、
今も漠然としか分かってないんだけどね、まぁ要するにツリー状に
表せる状態遷移の系図ですか?

Perlの正規表現は\1とかで後方参照できるから、厳密には
正規表現からDFAへの対応は作れないような気がするんだけど、
どんなもんでしょうね。
0128デフォルトの名無しさんNGNG
>>127
後方参照は言語の機能であって正規表現とは関係ない。
0129デフォルトの名無しさんNGNG
関係あるだろ。\1入れたら本来の正規表現じゃない。
よって DFAにも落とせないと。
0130128NGNG
すまん。POSIX規格には普通に後方参照があった。
http://www.linux.or.jp/JM/html/LDP_man-pages/man7/regex.7.html
0131デフォルトの名無しさんNGNG
正規表現実装した(実装しようとした)ことがあれば、
\1がまっとうなDFAではできないことは明白だな。
サポートしてるやつはだいたい、NFAで工夫してるようだね。
■ このスレッドは過去ログ倉庫に格納されています