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

正規表現

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
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で工夫してるようだね。
■ このスレッドは過去ログ倉庫に格納されています