1 :
nobodyさん :
05/01/17 11:51:25 ID:SH1ygN1P
(´・ω・) 2ゲットしちゃった
余裕で3ゲト
。 屁
perlなんですが、 $msg = "組織運営図"; if ( $msg =~ /(.*)運営(.*)/ ){ print "ok. $1$3\n"; } else { print "NG\n"; } 上のコードで okに行って欲しいんですが、 マッチしてくれません…。 何か根本的な勘違いしてますでしょうか。
>>5 文字コードは Shift_JIS だよね?あと $1$3 じゃなくて $1$2 だよね?
Perl 5.8 を使ってるなら、最初で use encoding 'Shift_JIS'; としてみる。
それ以前のバージョンの Perl ならとりあえず /(.*)\Q運営\E(.*)/ としてみる。
本題とずれるけど、最初のサブパターンは(.*?)にしたほうが効率いい。
8 :
5 :05/01/18 09:38:37 ID:???
>>6 ,7
use encoding 'Shift_JIS';
これでいけました。
こんな単純なことだったとは…
これで昨日一日つぶしちゃった…orz
激しく感謝ですw
Speeeeedと言う置き換えソフトを使っています。
ヘルプには
・メタ文字 \Gは使用できません。
・'/'はエスケープする必要はありません。
修飾子は以下の3つをサポートしています。
k 文字を日本語(シフトJIS)として扱いします。
m 文字列を複数行として扱います。
i 大文字と小文字を区別しないで検索します。
と、あります。
--------この下が一行目-------
スレッド名
Thu, 29 Jan 2004 17:27:16 GMT
1002
0
http://hoge.com/bbsname 3
0
0
1075476984
0
-----ここまで--------
の2chブラウザのidxファイルを置き換えて
3行目の一文字目("1002"の"1")が1で、
3行目が4桁である時に
7行目を"3"にしたいのですが
speeeeedの検索文字列と置き換え文字列の欄には何を入れれば良いのでしょうか?
よろしくお願いします。
10 :
nobodyさん :05/01/18 17:37:11 ID:TA2apQcG
>>9 「・・・で・・・である時に」なんていう条件分岐の機能は持ってないだろ。
>>9 修飾子 m をセットして、検索文字列、置換文字列をそれぞれこんな感じかな。
\A(.*\n.*\n)(1\d\d\d\r\n)(.*\n.*\n.*\n)(.*\n)
$1$2$3\r\n
12 :
nobodyさん :05/01/19 03:18:24 ID:hI5VxZ7o
「ある文字列を含んでいたら」という判断をさせたいのですが、 どんな風に記述すればよいでしょうか?
14 :
12 :05/01/19 03:40:05 ID:hI5VxZ7o
言い方が悪かったですね、 変数がある文字を含んでいたら、という判断をさせたいのです
if (変数 =~ /ある文字列/)
$_ = 変数; if (/ある文字列/)
>>14 判断は正規表現とは関係ない。
それはただの条件分岐。
>>10 プログラム側の処理を分けるのは制御構造の役割だが、
正規表現内部では、条件付きサブパターンというのがある。
>>18 特定の言語での独自拡張を持ち出したってしょうがないだろ
20 :
9 :05/01/19 16:01:45 ID:???
PCERはC言語だっけ 正規表現を独自拡張してない実装ってどれのこと?
>>18 ,21
条件付パターンマッチと言っても、変遷で表現できるので、正規表現で解が求まる
ペールはたまたま、読みやすさかなんかのために、独自の表記方法を導入してるが、
処理としては普通。実装とは関係ない。abcはabならcにマッチする、というのと変わらん
>>23 そもそも組み合わせ爆発する「条件分岐」を事も無げに処理してくれるのがオートマトンさんのクールなところですよ
>>20 どいたしまして。
Speeeeed は初めて知ったので自信無かったけどうまくいったみたいでよかった。
なんだか話題が変な方向に行ってるみたいだけど、
>>12 =14 が実装言語に何を使っているか限定せずに質問を始めたのがまずい気がする。
質問するひとは、はじめに何使ってるかをちゃんと示しておくべきだと思う。
関係ないけど、丸投げ体質の奴ってどこまでも果てしなく丸投げるよな
おまいら前スレ埋めれ
丸投げしちゃう
EUC-JPの漢字だけにマッチするようにしたいのですが 下記だとどうやら全角英数にもマッチしてしまうみたいです。 preg_match('/[\xB0\xA1-\xF4\xA4]/', $str) どのようにしたら漢字だけにマッチするようになるでしょうか?
30 :
nobodyさん :05/01/21 11:13:19 ID:ALcAsVlr
1005hw9fCDDLlBeZ0%253D を 1005hw9fCDDLlBeZ0 にしたい(ようは、%以降の文字列を削りたい。%は1回しかでてこない) にはどうすればいいでしょか? なお、php4です。 $srt_o = preg_replace("/^(.*)(\%.*)(.*)$/i", "$1$3", $srt_o); でもうまくいかず・・・
31 :
30 :05/01/21 11:22:49 ID:ALcAsVlr
むだをはぶいて、以下のようにしましたが 変換されずでしたわ・・・ $srt_o = preg_replace("/^(.*)(\%.*)$/i", "$1", $srt_o);
32 :
30 :05/01/21 11:25:14 ID:???
すいません、仕様変更で(汗) 、最後に出てきる%の文字列以降を削除する方法を教えてくださいませ
>>30 $str = '1005hw9fCDDLlBeZ0%253D';
$str = explode('%',$str,1);
var_dump($str);
で。正規表現(゚听)イラネなときは出来るだけ使わない。
それなら正規表現使わんでもstrpos+substrとかexplode+array_shiftでも可能だけど とりあえずpreg_replace('/%.*/', '', $str_o);
「最後に」ってことならstrrpos+substrの組み合わせか、 preg_replace('/%[^%]*$/', '', $str); %はエスケープ不要よ。
36 :
33 :05/01/21 11:30:24 ID:???
>>30 訂正
$str = '1005hw9fCDDLlBeZ0%253D';
$str = explode('%',$str,2);
var_dump($str);
37 :
nobodyさん :05/01/22 16:28:46 ID:Z5CU+gTj
レベルの高い会話の中申し訳ありません。 2 00:02:19,916 --> 00:02:21,084 I can't move! 3 00:02:24,879 --> 00:02:27,215 Help me! I can't move! 4 00:02:27,882 --> 00:02:28,591 Oh my god! このような文字列のtxtファイルを英語の部分のみ下のように取り出したいのですが I can't move! Help me! I can't move! Oh my god! いいソフトはありますかと聞いたところ正規表現ならできると聞き、このスレに来ました。 上の条件を満たすにはどのようにすればいいのでしょうか?
>>37 「ソフトありますか」からここに来るのがいまいちよくわからんな。
正規表現の書き方が知りたいのか?
できるけど正規表現が使えるソフトかなんらかのスクリプトなどが
ないと意味ないぞ。
39 :
nobodyさん :05/01/22 17:04:14 ID:Z5CU+gTj
>>38 正規表現が使えるソフトは自分でみつけました。
あとはそこに%$?みたいな記号を入れるのですが、それがわからないのです。
>>39 しょうがないな。
そのソフト名が俺らにはわからんから、アドバイスするのは不可能。
>>29 $strが漢字一文字の時マッチ。
preg_match("/^[\xb0-\xff][\xa0-\xff]$/", $str)
意図が今ひとつ分からないから、こんなもんで。
「」に囲まれていないタグ(<と>)を<、>に変換したいのですがどのようにすればよいでしょうか? 逆に囲まれているというのは出来るのですが囲まれていない方が分からないです。。。
すいません。上の変換後の文字は「&lt;」「&gt;」です。
>>44 囲まれているのができるのならば、
(1) 囲まれている<と>を適当にぶつからない文字or文字列に変換する。
制御文字とかがオススメ。
(2) 残った全ての<と>は囲まれていないのでお前の好きなように変換する
(3) (1)で変換したものを元の<と>に戻す
とすればいいはずだな。
>>44 Perl でいい?ちょっと苦しい感じもするけどこんなのとかどうでしょう?
$str =~ s/(?:(「.*?」)|(\<))/$1||"<"/ge;
$str =~ s/(?:(「.*?」)|(\>))/$1||">"/ge;
48 :
47 :05/01/26 13:33:15 ID:???
ガーソ! 置換後のダブルクォーテーションの中は「&lt;」「&gt;」です。 $str =~ s/(?:(「.*?」)|(\<))/$1||"&lt;"/ge; $str =~ s/(?:(「.*?」)|(\>))/$1||"&gt;"/ge;
>>46 >>47 おおぅ!ありがとうございます。おかげで実現出来ましたm(_ _)m
>>44 >>47 &lt;って書きたいときには&amp;lt;って書けばいいんだよ。
SQLのエスケープをしようと、「'」「\」「%」は全て「\'」「\\」「\%」に 変換する正規表現を書いてみました。 $sql =~ s/(\'|\\|\%)/\\$1/g; 正常に動作しているみたいなのですが、異常系のパターン 文字列等ございましたらご指摘いただきたい次第です。 宜しくお願いします。
>>51 それで特に問題ないように思うけど、
そもそもな話で、SQL のエスケープの仕様ってそれで良いの?っていうのと、
DB のライブラリにはエスケープする関数が用意されてることが多いので
そっちを調べた方が良い気がする。
>>52 ご返答有難うございます。
おそらくこの3つをエスケープすれば良いかと思うのですが、
他にもあるのでしょうかね、、
スレ違いっぽいので他のところで聞いてみます。
$a = "a1a2a3a4s1s2s3s4d1d2d3d4f1f2f3f4" %a = $a =~ /([a-z])(\d)/g; とすると $a{a} == 1; のようになりますが、括弧が4つの時に$2と$4だけを毎回ハッシュに渡すには どうすればいいんですか? %a = $a =~/(([a-z])\d)([a-z](\d))/g; $2と$4だけを毎回%aに渡したいのです。
>>54 (?: ) で後方参照されなくなるので、こうするとか。
%a = $a =~/(?:([a-z])\d)(?:[a-z](\d))/g;
56 :
54 :05/01/28 13:37:42 ID:???
57 :
54 :05/01/28 13:50:40 ID:???
すみませんもう一つHTMLに対しての正規表現なのですが、 $html_1 = qq|<input type="hidden" name="test1" value="a">|; $html_2 = qq|<input type="hidden" value="a" name="test1">|; %hiddenというのの中にnameの値をキーにvalueの値を値にしたハッシュを作成したいです。 わからないのは my %hidden = $html_1 =~ m{<input type="hidden"\s*(?:name="(.*?)")?\s*(?:value="(.*?)")?.*?>}; $html_1に対してはこれでいいですが$html_2に対してはこれではキーがありません; nameとvalueの順番がなんでもいいようにするにはどうすればいいですか?
>>57 一発でマッチする方法はあるかなあ?俺はこんなのしか思いつかなかった。
my $params = ($html =~ m{<input\s+type="hidden"([^>]+)>})[0];
my %hidden = $params =~ m{(?:\s+(\w+)="([^"]+)")}g;
>>57 素直に 2 回マッチさせるのが無難じゃないかなぁ,こんな感じで。
my %hidden = map {/\bname="(.*?)"/, /\bvalue="(.*?)"/} $html_2, ;
こんな? my %hidden = $html_2 =~ /<input type="hidden".*?(?=.*?\bname="(.*?)").*?\bvalue="(.*?)".*?>/;
>>60 それいいなw
%hidden =
$html =~
/<input(?=.*?\btype="hidden")(?=.*?\bname="(.*?)")(?=.*?\bvalue="(.*?)").*?>/g;
こうすると type=hidden が後ろになっても取れるのかー。戴きます。
62 :
nobodyさん :05/01/30 19:07:48 ID:60wlVefX
質問です。 test.txtというファイルに |aaaaaaaaaa|ddddddddddddd|ggggggggggggg| |ffffffffff|hhhhhhhhhhhhh|jjjjjjjjjjjjj| |mmmmmmmmmm|uuuuuuuuuuuuu|lllllllllllll| というのが書かれているとします。 このファイルをUNIX上でcat test.txt | perl test.cgi というコマンドを打ちます。 test.cgiの処理として '<>'で標準入力からtest.txtの内容を読み込んで、 '|'を区切り文字としてテーブルタグに変換させる 正規表現を書ける人いませんか? <table> <tr><td>aaaaaaaaaa<td></td>ddddddddddddd<td></td>ggggggggggggg</td></tr> <tr><td>ffffffffff<td></td>hhhhhhhhhhhhh<td></td>jjjjjjjjjjjjj<td></td> <tr><td>mmmmmmmmmm<td></td>uuuuuuuuuuuuu<td></td>lllllllllllll<td></td> </table> というふうに変換したいのですが、うまく正規表現が書けません
63 :
nobodyさん :05/01/30 19:10:42 ID:60wlVefX
間違えました。 <table> <tr><td>aaaaaaaaaa<td></td>ddddddddddddd<td></td>ggggggggggggg</td></tr> <tr><td>ffffffffff<td></td>hhhhhhhhhhhhh<td></td>jjjjjjjjjjjjj</td></tr> <tr><td>mmmmmmmmmm<td></td>uuuuuuuuuuuuu<td></td>lllllllllllll</td></tr> </table> ↑のように変換したいのですが
書ける人いませんか? という質問か。 ま、いくらでもいます。
65 :
nobodyさん :05/01/30 19:17:56 ID:60wlVefX
>>62 どのような正規表現で処理したら良いのか教えてください。
>>62 行頭の|を<tr><td>に置き換え。s/^\|/<tr><td>/;
行末の|を</td></tr>に置き換え。s/\|$/<\/td><\/tr>/;
その他の|を</td><td>に置き換え。s/\|/<\/td><td>/g;
<table></table>は適当に付ける。
Perlで、 \Q〜〜\E はどういう意味ですか?
各サイトでCtrl+Fしてみましたが、\Qも\Eも見つかりませんでした
>>69 誰が Ctrl+F しろと言った?見つかるまで全て読めよ。
いや、普通にマニュアル読んだほうが早いが・・
すみません、たまたまJAVAスレを見ていたら書いてありました;
m9(^Д^)プギャーーー!!
75 :
nobodyさん :05/02/02 10:56:57 ID:hb9v8KSn
すみません。 若気の至りで、アクセス解析を読み込むためのJSファイルをHTML文書の頭に付けてたのですが、 思い直して</body>直前に入れなおしたいと思ったのですが、 speeeeed!(k,m,iオプション有)で、置換する際に、 <body><script type="text/javascript" src="foo.js"></script> 本文 </body> ・bodyとscriptの間に改行はない ・bodyにidが振られている場合もある で、 <body(.*?)>(<script.*?script>)(.*?)</body> ↓ <body$1>$3$2</body> とやってみたのですが、うまくいきませんでした。 ためしに、 <script.*?script>だけでマッチングを試してみたのですが、 <script type="text/javascript" src="foo.js"></script>にマッチしませんでした。 どう書き直したらよいのでしょうか? 全く根本的に間違ってるような予感がしますが、お教え下さいますよう宜しくお願いいたします。
>>75 <body(.*)>(<script.*script>\r\n)((.*\r\n)*)</body>
<body$1>\r\n$3$2</body>
perlで文中の"&"を"&"に変換したいと思ってます。 でも"¥"などの実体参照化されてる部分の"&"は変換しません。 で自分なりに考えたのですが↓ $text="<p>キュウリ&ナス=¥200</p>"; $text=~s/&[^(yen;|euro;|amp;|copy)]/&/g; print "$text¥n"; を実行すると、結果が <p>キュウリ&ス=¥200</p> となり、うまくいきません。 2行目の正規表現がおかしいと思うのですが、どう変えたらいいのでしょうか? よろしくお願いします。
どこから突っ込んだものか・・・
79 :
77 :05/02/02 15:12:58 ID:???
再びすいません実体参照部分が化けてしまいました、文中の全角記号、英字は実際は半角です;; perlで文中の"&"を"&amp;"に変換したいと思ってます。 でも"&yen;"などの実体参照化されてる部分の"&"は変換しません。 で自分なりに考えたのですが↓ $text="<p>キュウリ&ナス=&yen;200</p>"; $text=~s/&[^(yen;|euro;|amp;|copy)]/&amp;/g; print "$text¥n"; を実行すると、結果が <p>キュウリ&amp;ス=&yen;200</p> となり、うまくいきません。 2行目の正規表現がおかしいと思うのですが、どう変えたらいいのでしょうか? よろしくお願いします。
>>77 これでどう?
$text =~ s/(?:(&(?:yen|euro|amp|copy);)|&)/$1?$1:"&"/ge;
ここに居る人たちからすると10点くらいの答案だと思う
82 :
80 :05/02/02 15:39:46 ID:???
>>81 ならどこがどうダメとかこうしろとかくらい言ってくださいな。
この質問者にレスを打っただけで50点はかたいだろ。
84 :
77 :05/02/02 15:41:45 ID:???
>>80 難しすぎて分かりませんが、バッチリ出来ました!
ありがとうございます。
$text=~s/&[^(yen;|euro;|amp;|copy)]$/&amp;/g;
偉そうにしてるだけのカスがいるようだなw ダメだとか言う前に自分のコード見せてみなm9(^Д^)プギャー
煽ってるだけの人も、変わらんかとm9(^Д^)プギャー
>>77 $text =~ s/&(?!(?:yen|euro|amp|copy);)/&/g;
$text =~ s/&$/&/g;
考えてみたけど汎用的なのはどうやっても無理
>>89 それは
>>77 が判断すればいいことで、わざわざそんな表を持ち出す話ではない。
一から教え込むスレじゃないんで、既存のを丸パクりしろって回答で100点じゃね。
m9(♥Д♥)プギャー
my %entref = ( yen => 1, euro => 1, amp => 1, copy => 1, # 気が済むまで並べる ); $text =~ s/(?:(&(\w+);)|&)/$1&&$entref{$2}?$1:"&"/ge;
アイディア出す人は古い車輪に対するアドバンテージが何か書いてくれると助かる
見易さかな?
「車輪」言いたかっただけちゃうんかと
根こそぎひろってハッシュサーチのほうが性器表現でやるより早いってとこだろ。 古い車輪だと機械的に最小の性器表現を生成したりするんだが、まず読めないし遅い。
スピードにばらつきが出ないだけで、体感的にはかわらなそう
104 :
97 :05/02/04 00:47:42 ID:???
いや、速度とかはどうでもよくてメンテナンス性重視のつもり。
>>104 今どきだな。俺も保守的なので97のコードはいいと思う。
結局ココの奴もたいしたことない。
>>106 大したこと無いのは俺とお前だけで、
他のみんなすげえよ!俺なんかすげえ人間が小さいの。
実は考えてたんだけど、
>>97 さんに先を越されて出せなかったやつを出してみる。
三項演算子使いまくりなのはuse warnings対策。
中身はほぼ
>>97 さんと同じ。
my %sp = map{$_ => 1} qw(
quot amp lt gt
nbsp iexcl cent pound
curren yen brvbar sect uml copy ordf laquo
...
lceil rceil lfloor rfloor lang rang loz
spades clubs hearts diams
);
$text =~ s/&(?:(\w{2,8});)?/$1 ? ($sp{$1} ? "&$1;" : "&$1;") : "&"/ge;
気の済むまでハッシュを手書きする仕組みはむしろメンテナンス性低いと思った。 Wikiでプラグインをコールするような用途に向いていている。 &置換だけなら、よくある(?![\w\d]+;|#x?[A-Fa-f0-9]{1,6};)みたいので十分では。適当だけど。 全部羅列するならDTD依存で生成するから、コンパイラが吐いた長い正規表現でも、スクリプト生成の でかいハッシュでも、保守性は変わらないかな。【代】
どれだけ厳密なものが必要かは、分からないから。 完全にstrictなHTMLが必要なのかも知れ無いし。 ハッシュ作るのマンドクセなら、他のモジュールから借用する手もある。 内部の変数に依存しているから、使い捨てのスクリプト程度にしか使えないけどね。 use HTML::Entities; ... $text =~ s/&(?:(\w{2,8});)?/$1 ? ($HTML::Entities::entity2char{$1} ? "&$1;" : "&$1;") : "&"/ge;
>>112 たまたま忘れただけさ orz
$text =~ s/&(?:(\w{2,8});)?/$1 ? ($HTML::Entities::entity2char{$1} ? "&$1;" : "&$1;") : "&"/ge;
DTDぶっこ抜きだから面倒臭さも保守性もかわらんという話だろ
115 :
名無しさん@Vim%Chalice :05/02/07 18:32:59 ID:cdJVzA6k
Cのソースを追うことが多く、何の変数でもいいので とにかく変数を検索するための正規表現を作りましたが 全然だメッス。↓が限界 \b[A-z_][A-z0-9_]*[\s]*?[^\(]
116 :
名無しさん@Vim%Chalice :05/02/07 19:01:26 ID:cdJVzA6k
>>115 変数はつらいが、関数もしくはメソッドならこれだぜ!!
(?=.)(?!(if|while|for|switch))\<[A-z_][A-z0-9_]*?[\s]*?(?=\()
117 :
nobodyさん :05/02/08 00:19:26 ID:aXE3qbDZ
はじめまして、 "【PHP】くだらねぇ質問はここに書き込みやがれpart3" から誘導されてきました。 HTMLソース内に記述されている画像ファイル名を抽出しようと四苦八苦しています。 画像ファイル名は相対パスで指定されており、「../../」の部分も一緒に抽出させたいのです。 検索条件をお教えいただけないでしょうか。 $html = HTMLソース; eregi("xxxxxxxx", $html, $var); -- このような結果が返ってくる -- $var[0] == "../../aaa.jpg"; $var[1] == "image/bbb.gif"; ・ ・ ・ お力添えをお願い致します。
>>117 preg_match_all('!<img .*src.*"(.+?)"!', $html, $var)
こういうやつとか?
>>118 <img src='hoge.jpg'>
<img src=hoge.jpg>
120 :
117 :05/02/08 09:49:40 ID:9oMQzPoD
>>118 ありがとうございます!
マニュアルを見てみると、preg_match_all関数のほうが良さそうですね。
さりげなく教えていただき、大変感謝です。
あとは119で指摘されているクォーテーションマークの問題を
色々試して解決してみます。
あ〜正規表現を勉強しないと…(汗)
便乗で質問です。
>>119 の問題を回避するとしたらこんな感じでよろしいのでしょうか?
preg_match_all('!<img .*src=('|\")(.+?)('|\") .*>!', $html, $var)
122 :
121 :05/02/08 10:10:46 ID:???
間違えました preg_match_all("!<img .*src=('|\")(.+?)('|\") .*>!", $html, $var) です…
駄目。つかテストしろ。
<から>のタグの抽出を行っているんですが、 < >の中ににある ” ”または ’ ’の中にある > は無視したいんですが、 どうしたらよいでしょうか・・・。
125 :
124 :05/02/09 10:03:20 ID:clTgmqY1
あ、ちなみに、PHPのpreg_replace_callbackで 抽出しております。。 宜しくお願いします。
>>124 こんなのとか。
'/<\w+(?:\s+(?:"[^\"]+"|\'[^\']+\'|[^"\'\>]+)+)?>/'
>>126 ありがとうございます。
貼り付けてみたんですが、Parse errorになっちゃいました
何がまずいんでしょうか・・・
>>124 ベタ取得、"'でとめて引用符内を取得の1以上繰り返し
>>124 '/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*\1)|noshade|selected|checked|multiple|noresize))*>/'
こんなとこで。
見落としありそうだけど。
>>130 たとえば '<a a=><a>' とか '<a a=""><a a="">' とかでダメっぽい。
132 :
130 :05/02/09 20:47:31 ID:???
>>131 なるほど
'/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*?\1)|noshade|selected|checked|multiple|noresize))*>/'
とりあえず対応してみる。
PHPにはタグを抜き取る関数があるだろ
まじ?
つか何でタグなのに引用府内に<>が入ってんの?
137 :
136 :05/02/10 17:43:29 ID:???
一行レスじゃ芸がないので代案
'/<(?:[^"\'>]*?|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*")*>/'
>>132 <a href=">" />も
<a href=">" >か<object data=">" />にしとけ。
139 :
130 :05/02/10 21:00:18 ID:???
>>137 ども、対応してみる。
'/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*\1)|noshade|selected|checked|multiple|noresize))*\s*\/?>/'
これはいかがですか。
<![INCLUDE CDATA [ >>> ]]>
<script><!-- if (a>c) --></script>
>>139 これでダメみたい。
<a href=hoge>hoge</a>
hoge が消えちゃう。
'#</?\w+(?:\s+(?:\w+\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^"\'>\s]*)|\w+))*\s*/?'.'>#i';
JSPで入力された項目がメールアドレスであるかを 正規表現で調べたいんだけど、うまく動作してくれない。 メールアドレスの正規表現って、 ^[a-z0-9][\\w\\.]*@[^\\.][\\w\\.]+[^\\.]$ でいいよね?
>>141 とりあえずパッと見て気がついた点は、
[...] の中の '.' はエスケープしなくて良いのと、
ドメインにはハイフンもありうるけど \w にはハイフンは含まれない。
143 :
130 :05/02/10 23:09:13 ID:???
>>140 エンバグしてました orz
'/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*?\1)|noshade|selected|checked|multiple|noresize))*\s*\/?>/'
# ああ、もういいや。
strictなHTMLだけを対象にすりゃええやん。 クォートなしの属性値はHTML4.01までならOKだから考慮する必要があるけど 実体参照になってない&<>"なんかは論外。
パーサーかCC使ったほうが楽かもね。 <!CDATA[ <tag attr=""> ]]>
グダグダだな
147 :
130 :05/02/12 08:02:28 ID:???
$html = '<\/?[\w\.]+(?:\s+(?:\w+\s*=\s*(?:\'[^\']*\'|"[^"]*"|[^>"\'\s]*)|\w*))*>'; $sgml = '<!(?:\[\s*(?:[\w\.]+|\%[^;]+;)\s*\[.*?\]\]|[\w\.]+(?:\s+(?:\'[^\']*\'|"[^"]*"|\[[^\]]\]*|[^"\'>\s]*))*)>'; $remark = '<!(?:\s*--(?:\'[^\']*\'|"[^"]*"|[^"\']*?)*--\s*)?>'; "/$remark|$sgml|$html/is" グダグダついでに。 SGMLをマッチする方向に変更。 ショートタグの大部分、エンプティタグ、NET、一つのタグ内の複数の注釈は非対応。
148 :
130 :05/02/12 08:10:57 ID:???
ああ、また orz $html = '<\/?[\w\.]+(?:\s+(?:\w+\s*=\s*(?:\'[^\']*\'|"[^"]*"|[^>"\'\s]*)|\w*))*\/?>'; でおながいします。
教えてください。 数字が10個以上連続していない行をマッチさせたいんですが、 どのような正規表現を書けばいいでしょうか?
↑あ、言語はPHPです...
>>149 数字が10個以上連続している行を除外するのではだめでしょうか?
>>149 直前に数字十個以上がない全ての文字の連続という正規表現を書けばいい
PCRE系ならMオプションをつけて行マッチさせろ
153 :
149 :05/02/13 00:51:12 ID:???
うー・・よくわかりません… 数字10個のものを除外するのでは、 意図していることと違っちゃうのでちょっとだめです。
後ろに十個以上の数字を伴わない任意の文字、の連続 のほうが書きやすいか。
分からんのは回答者のほう。お前の意図なんか知らんよ。エスパーじゃないし。
pcreなのかposixなのかも知らんし、どのくらい噛み砕けば理解できるのかも分からんし、
よく分からない、の「よく」がどの程度かも知らんし、データが複数行なのか単一行なのかも知らんし、
Gマッチなのか一個でいいのかも知らんし、正規表現書けるかどうかさえ知らんのだYO。
>>154 言葉からだといくつかパターンが考えられるけど、数字が続かない文字だと、
数字のみからなるデータで常に文末にマッチすることないか?
>>152 のように否定言明を使って (?!\d{10,}). みたいにするしかないと思う。
後方言明だと可変長の正規表現を扱えないし、、、。
156 :
155 :05/02/13 02:19:44 ID:???
あれ、直前に?なんか解釈間違ったかも。 ともかく普通に否定言明にドットつなげばいけるよ。
157 :
nobodyさん :05/02/13 17:13:27 ID:iVFDDmsL
php4なんですが、 ある文字列が、全角カタカナで50字以内かいなかは どうやっってかけばいいのでしょうか?
158 :
154 :05/02/13 18:52:34 ID:???
>>155 あーそうかも。とりあえずパフォーマンスの悪い別解。激しくナンセンスだがw
/^(?(?!\d{10,}).*)$/
>>157 全角カナ換算で50文字以下なら、エンコード指定してmb_strcountか、strlenの結果を一文字の
バイト数で割って算出。
振り仮名などで対象がすべてカナであることも保障したい場合は、使用している文字コードの
全角カナのブロックをすべて文字クラス[]に放り込んで{,50}$を指定すれば、正規表現的にはOK。
×mb_strcount ○mb_strlen ね
PHP 使う奴は、まず pcre や mbstring の利用の可否を書いておくべし。
perlの正規表現で、記号類はどのように表現すればよいですか? やりたいことはUTF8で書かれた日本語の文章から、 > −-―・「」!'(),….『』´’~☆‐/?“”、!+。 > []:→〈〉&()←×‥♂〜#`℃@"‘*¨「」φ|【】; % > =〔〕《》◇∞〓♯●\^◎°○★U♭?〃?\▲≪≫ などの記号類を全て取り除きたいのです。 EmEditorの正規表現では\Wでこれが実現できるのですが、 perlで\Wとすると・・・。 宜しくお願いします。
162 :
nobodyさん :05/02/14 17:22:57 ID:SqkH/Xuz
>>124 に近いのですが、HTMLにおけるリンク先の抽出に手間取ってます。
タグはとりあえず見ずに、srcとhrefの後ろの=から"か'をキャッチして対応する
"or'までを取得したいのですが。。。
言語はPHPです。
>>161 perl5.8.1以降ならtr///が使える。
スクリプトもUTF-8で書かれていると仮定。
(\r\nは、マッチ文字列に改行が含まれていて、
改行コードが削除されてしまうための対策。不要なら削る。)
use encoding qw(utf8);
tr{\r\n
−-―・「」!'(),….『』´’~☆‐/?“”、!+。
[]:→〈〉&()←×‥♂〜#`℃@"‘*¨「」φ|【】; %
=〔〕《》◇∞〓♯●\^◎°○★U♭?〃?\▲≪≫
}{\r\n}d;
164 :
nobodyさん :05/02/14 21:38:42 ID:KmG+pbP2
PHP環境なのですが、「半角記号にマッチ」というのを シンプルにあらわす方法はないですか?
>>162 何が出来ないのか分からんが、上であがったのを流用すればいいだろう
168 :
nobodyさん :05/02/16 16:27:58 ID:SLDSz7ZK
質問です。たとえば1〜20までの数字があって、 1と3の2つだけをマッチさせたいのですが、 /^[1|3]/ とすると、1、3はもちろんマッチするのですが、 11も12も13も・・・マッチしてしまいます。 この場合、どう書いたらいいのですか?
/^[1|3]$/
>>169 すみません、ソース晒します。phpです。
for($i = 1; $i <= 100; $i++) {
if(preg_match("/^[1|10|25|45|60]$/", $i)) {
echo $i."<br>";
}
}
この場合1、10、25、45、60がマッチして出力されるように
したいのですが、実際出力されるのは1、2、3、4、5、6と
なってしまいます。これを思い通りにマッチさせるのは
どうしたらいいのでしょうか?
"/^(1|10|25|45|60)$/"
htmltodatで、 <dt><a name=9>9</a> :<font color=green><b>名称未設定</b></font> :04/11/16 21:50:08 ID:VtVZWEIG<dd> てすと<br><br> <dt><a name=8>8</a> :<a href=mailto:sage><b>名称未設定</b></a> :04/11/16 17:48:11 ID:nBSRrYU6<dd> てすと<br><br> ↓ dat 名称未設定<><>4/11/16 21:50:08 ID:VtVZWEIG<>てすと<> 名称未設定<>sage<>1/16 17:48:11 ID:nBSRrYU6<>てすと<> のようにしたいのですが、 m#<DT><A.*?>([0-9]+).+?<B>(?:<A HREF="mailto:(.+?)">)?(.*?)(?:</A>)?</B>.{11}(.*?)<DD>(.*)<BR><BR>#mi この正規表現だと、どうしてもsage等のメール欄もマッチしてしまい、 名称未設定<>sage<>のようにdatに残りません。 (?:<A HREF="mailto:(.+?)">)?の部分は、A HREFが出現した時にだけマッチする のだと思うのですが、その後の(.*?)が<font color=green>にマッチしている 部分なのでしょうか。
すみません、解決しました。 m#<DT><A.*?>([0-9]+).+?(?:<A HREF=mailto:(.+?)>)?<B>(.*?)</B>(?:</A>|</FONT>) :(.*?)<DD>(.*)<BR><BR>#mi
質問です。 HTMLのコメントタグを引っ掛けるにはどうしたらよいでしょうか? 単に引っ掛けるだけならできたのですが、例えば <html><body> <div id=" test<!--test ">a</div>--> </body> <html> こんなのを引っ掛けないようにしたいんです。
コメントはタグじゃない・・・(ぼそ)
177 :
174 :05/02/17 11:15:34 ID:???
>175 回答ありがとうございます。そこの正規表現である tag_regex = '<!(?:--(?:(?!--).)*--(?:(?!--)[^>])*)*(?:>|$(?!\n)|--.*$)'; を利用したのですが、 "<!--------------------------->foo" となっていると文字列全部を取得してしまいます。(fooの前まで引っ掛けて欲しい) これがコメントとして間違ってることは理解しています。 しかし、こういう具合に間違ってるWebページは結構多いので、 これもコメントとして認識したいのですが どうにかならんものでしょうか?
それがマッチする正規表現を新たに作ればよかろう 一回で全てしようとするから駄目なんだよ
そもそも
>>175 のやつだと
>>174 のもとれないわけだが
これらに対応するのはキツイんじゃないかな
何回かに分けたとしても間違えてとったやつを弾くことは難しいわけで
スキャナ書いた方が早道のような気もするね。
適当にBNFで定義して終了
>>174 Perlなら、
>>147-148 を利用して、
my $match = $str =~ m/($remark)|$sgml|$html/isg;
>>182 my @match = $str =~ m/($remark)|$sgml|$html/isg;
だった…。
184 :
nobodyさん :05/02/18 12:08:09 ID:4JcRNkuB
wakaru^-^
↑miss...
>>181 XML はともかく、 HTML で BNF 定義しようと思ったら地獄を見るような気もしなくはない。
あんた、地獄を見るわよ
RedirectMatchで半角スペース「%20」を-に変えるにはどうすればよいでしょうか? RedirectMatch permanent (.*)\x20(.*) $1-$2 RedirectMatch permanent (.*)%20(.*) $1-$2 RedirectMatch permanent (.*)'%20'(.*) $1-$2 RedirectMatch permanent (.*)\x20(.*) $1_$2 RedirectMatch permanent "(.*) (.*)" $1-$2 全部だめ orz
>>190 いけました・・・
ありがとうございました
多分ブラウザのキャッシュか、.htacessに書く時点で間違えていたか、
どっちかだったと思います
perl5.8です 1〜685の数字にマッチするように 6[0-8][0-5]|[1-5]\d\d|[1-9]\d|[1-9] としてみたのですが、スマートというか 模範となるような書き方があったら教えてください
>>192 その正規表現が間違ってるのはともかくとして、
全部正規表現でやろうとせず、
文字列としての評価は [1-9]\d* くらいで検査しておいて、
あとは数値的に評価した方が良いと思われ。
194 :
nobodyさん :05/02/23 05:20:38 ID:Vw9LlCLC
ruby-1.8.2で、mixiの友達リストを取得するスクリプトを書いてます ID番号などは、半角数字というのもあって、簡単に取得できたのですが、 名前取得で手こずっています。 <td>名無しさん(17)<br><a href=show_friend.pl?id=774> ^^^^^^^^^^ を取得したいと思っています。 上記にマッチする正規表現例を教えていただけないでしょうか? \<td\>(.*)さん\([0-9]+\) これでは取得できていません。
申し訳ありません。。。取得できました。 rubyの文法を間違えていました。 ごめんなさいごめんなさい。。。 ちなみに上記の正規表現でOKでした。
196 :
nobodyさん :05/02/25 22:30:13 ID:qCTUQzjg
文字列から半角英数字以外は全部取りたいんですが、正規表現で一発で表現できますか?
197 :
196 :05/02/25 23:02:07 ID:qCTUQzjg
↓こんなふうにしてみましたが、ダメでした。 ereg_replace( "/[^a-zA-Z0-9\s]/", "", $t ) 何か勘違いしているでしょうか?
198 :
nobodyさん :05/02/26 01:29:40 ID:EGev6g90
文字列クラスを定義して終わってるから何にもマッチしないと思うけど。
199 :
nobodyさん :05/02/26 01:31:43 ID:EGev6g90
文字クラスだった。
>>197 preg_replace()ならだいじょうび。
>>197 $t = ereg_replace("[^a-zA-Z0-9\s]", "", $t);
こういうこと?
それから、日本語扱うならmb関数にする。
202 :
nobodyさん :05/02/26 17:50:17 ID:LErwwWXI
>>202 i オプションで。 /^123test\@example\.ne\.jp$/i みたいな。
↓こういう文字列を "あいうえお「かきくけこ「さしすせそ「たちつてと」なにぬねの」はひふへほ」まみむめも」やゆよ「らりるれろ「「わをん" ↓こんな感じに "あいうえお<em>かきくけこ<em>さしすせそ<em>たちつてと</em>なにぬねの</em>はひふへほ</em>まみむめも」やゆよ「らりるれろ「「わをん" 変換したいんですけど、どうすればいいんでしょう? イメージ的には /「[^「]*?」/ こういうことをしたいんだけど、[ ] の中はアスキーだけだし。 use encoding とかはナシな方向でひとつ。
205 :
204 :05/03/02 04:49:22 ID:???
いまんとこ ------------------------- my ($s, $t) = (quotemeta '「', quotemeta '」'); $_ = "あいう〜"; s/($s)/\a$1/og; while (s/ \a $s ([^\a]*?) $t /<em>$1<\/em>/ogx) { 1; } ------------------------- とか 「 \a 」 で印つけてるけど、他にもいい方法あるかと思って。
>>204 私がやるとすればPerlメモ(
ttp://www.din.or.jp/~ohzaki/perl.htm )にある
例を利用してあらかじめ
$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
$char = qr{(?:$ascii|$twoBytes|$threeBytes)};
$eucpre = qr{(?<!\x8F)};
$eucpost = qr{
(?=
(?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて
(?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端
)
}x;
を用意しておいて、
1 while s{$eucpre(?:「((?:(?!「)$char)*?)」)$eucpost}{<em>$1</em>}o;
てな感じかな。キモは
[^」]を実現するのに、否定先読み+ASCIIまたはEUC1文字にマッチするパターンを使用
全体が1バイトずれてマッチしないように$eucpre,$eucpostを前後につけた
というあたりです。
PHPを使ってます。 タグの外にあるカタカナと『ー』の前後に半角スペースを入れたいのですが (文字コードはEUC) $t = preg_replace("/(?:^|(?<=>))([^<]*)((?:\xA5[\xA0-\xFF]|\xA1\xBC)+)/i","$1 $2",$t); のようにすると、 例えば『七時のニュースです』という文字列の場合『ス』の前後にしか空白が入ってくれません。 どうにかして解決できないでしょうか……
208 :
204 :05/03/02 17:36:49 ID:???
>>206 わー、ありがとう!
答えだけじゃなく、技術的にも勉強になったよ THX!
>>207 ここはおまえのバカっぷりを晒すとこじゃないぞ。出直してこい。
PHPを使っており、file関数でHTMLを読み込んで 指定部分だけを抜き出したいと思っています。 HTMLには<!-- BEGIN -->〜〜〜〜<!-- END -->というような コメントが入っており、その中身だけを抽出したいと思っております。 まずfile関数で配列にすべてのHTMLを格納しimplideで結合します。 テスト用に以下のものを試しました。 $pattern = "/<!-- BEGIN -->(.*?)<!-- END -->/"; $ary_data[] = "<!-- BEGIN -->\n"; $ary_data[] = "あいうえお\n"; $ary_data[] = "<!-- END -->\n"; $str_data = implode("", $ary_data); preg_match($pattern, $str_data, $matches); echo $matches[0]; 改行コードが入っているとうまく抽出してくれません。 .*?の部分を[.\s]*?に変えてみたのですが変化がありませんでした。 どのように変更を加えればよいのでしょうか?
211 :
207 :05/03/02 22:24:58 ID:???
ごめん、俺が馬鹿だった。出直してくる。解決したけど。
>>210 $pattern = "/<!-- BEGIN -->(.*?)<!-- END -->/s";
パターン修飾子 s をつけることで . が改行にもマッチするようになります。
>>212 あ〜〜〜そんないいものがあったんですね。
どうもありがとうございました
214 :
nobodyさん :05/03/03 14:08:03 ID:zkHMOcKe
----で囲まれた文字列にマッチしたら、そのマッチした文字列を取得したあと その文字列を別の文字列に置換するということをphpでやりたいのですが $data = "aiu----hello----ncka"; $pattern = "/----(.*?)----/"; preg_match($pattern, $data, $out); $data = preg_replace($pattern, "----goodbye----", $data, 1); こうすると$out[1]にはhelloが入り、もとのデータ$dataの ----hello----が----goodbye----に置換されるというようにしているのですが、 同じ部分を検索しているのにもかかわらず preg_matchとpreg_replaceを使っているので、もう少しいっぺんに同じ動作を させることはできるでしょうか?
215 :
nobodyさん :05/03/04 20:58:51 ID:gtJy+aSQ
入力された身長体重が正しいかを判別したいんだけど... ^(?:d+(?:.d*)?|.d+)$ と考えたけど、うまくいきません。 エロイ人、添削キボン
>>215 まずどういうのが正しいのかを示すべき。
/+。:.゚ヽ(*´∀`)ノ゚.:。+゚/i
218 :
nobodyさん :05/03/05 08:15:13 ID:8nW34nzC
>>216 170
175.5
60
60.5
がOKで、
.6
15.15.52
なんてのがボツ
もちろん、数字と.以外がはいるとボツ
>>217 エラーになりますた
>>215 正規表現のスレでいうのもあれなんだが
数字として比較したほうがわかりやすいと思う
if ($height < 130 || $height > 200) print "Error";
220 :
nobodyさん :05/03/05 12:19:51 ID:hbhM7+40
$string = "12.3.45"; $pattern = "/^[0-9]+?\.[0-9]+$|^[0-9]+$/s"; if (preg_match($pattern, $string)) { echo "正常です"; } else { echo "違います"; }
$string = "12.3.45"; $pattern = "/^[\d]+?\.[\d]+$|^[\d]+$/"; if (preg_match($pattern, $string)) { echo "正常です"; } else { echo "違います"; }
222 :
nobodyさん :05/03/05 12:26:53 ID:OYa1FD+r
<?php $string = "12.3.45"; $pattern = "/^\d+?\.\d+$|^\d+$/"; if (preg_match($pattern, $string)) { echo "正常です"; } else { echo "違います"; } ?>
$pattern = "/^\d+\.\d+$|^\d+$/";
/^\d+(\.\d+)?$/
改行で終わっていた場合にも正常とみなされる記述は"間違い"です.
228 :
nobodyさん :05/03/07 05:11:36 ID:DaphPIkI
232 :
nobodyさん :05/03/10 10:04:14 ID:Oal+cA17
ファイル内文字列置き換えツールのSpeeeeedを使っている方 います? 他にどこできいていいものやらわからないので・・・。 Tepaエディターの正規表現でヒットする文字列がヒットしないんですけど、 具体的には ...:..:...ID:........$ という検索文字列を文字なしで置き換え、2chのスレッド内発言の時間とIDを削除しようとしています。 今日初めて正規表現のことを知って、美しくない検索かもしれませんが・・・。 と書きつつも231さんのIDがID:???であることを知った。 初めて見ました。 よろしくお願いします。 補足 BREGEXP.DLLを導入して、Speeeeedから正規表現が扱える状態になっています。
234 :
nobodyさん :05/03/10 10:25:23 ID:Oal+cA17
Speeeeedを使っている人はいないということを おっしゃりたいのでしょうか? 勉強してからこいとおっしゃりたい?
俺には「
>>1 のリンク先を読んでから来い」としか読めないのだがな。
>>232 Speeeeed のホームページのサポート掲示板を「行末」とかで検索してみたら、
改行の扱いがどうもいまいちみたいね。
...:..:...ID:........\r\n
ってなかんじでどうでしょ。
>>236 ありがとうございます。
それでいけました。
>>235 正規表現が使える他のエディタではうまくいくので、
Speeeed固有の問題だと考えたけれど、
>>1 のリンク先には
その回答がなかったので・・・。
スレよごしすいませんでした。
238 :
nobodyさん :05/03/13 23:43:38 ID:d9JNVB9S
240 :
238 :05/03/14 00:36:40 ID:???
241 :
nobodyさん :05/03/18 12:51:02 ID:nYSabF1K
質問です。
メールを処理するCGIをPerlで作っているのですが、ヘッダ部の
Subject:xxxxxx
を抜き出す方法がわかりません。
メールをヘッダ部とbody部に分け
if ($m_header =~/Subject:\s*(.*)/i){
$m_subject = $1;
}
だと、件名が長いときは切り落とされてしまいます。
Subject: =?ISO-2022-JP?B?GyRCPzclMyE8JUohPDMrO08hIzBsSmJAaCRyGyhC?= ←ここではなく
=?ISO-2022-JP?B?GyRCO0UzXSQxJGs0azZIJCskaSEiN1AxRCROGyhC?=
=?ISO-2022-JP?B?GyRCS1w8QSRyJEQkKyRgGyhCIChCeSBORUMgMjAwNS8yLzIxKQ==?= ←ここまでマッチさせたい
ttp://www110.kir.jp/study/jissen/script2130.html の「タイトルの抽出」部分にある/MIME/文字列の$`だと、相手のメーラーに
よってはIn-Reply-ToやReferencesやMessage-Idなども件名に入ってしまい
うまくありません・・・。
242 :
nobodyさん :05/03/18 14:01:29 ID:uLSanIIA
$m_header=~ /[\x0D\x0A]+Subject:\s*([^=\x0D\x0A]+|(?:=.+?=\s+)+)/is;
>>241 $m_header =~/^Subject: *(.+\x0D?\x0A(?: .+\x0D?\x0A)*)/im;
普通はモジュール使うけど。
use Mail::Header;
my $head = Mail::Header->new(\*STDIN);
print $head->get('Subject');
244 :
241 :05/03/18 18:00:07 ID:R05cZtNs
>>242 >>243 ありがとうございましたっ!!
242でも243でもできました。感謝です。
>>243 Mailで始まるモジュール、1つも入ってないのです・・・
・・・
>>245 どこがいけないか指摘しないと指摘にならんよ
>>246 そこまでしなきゃわかんないアマちゃんなのかよ!!!
$m_header = "Subject: =?ISO-2022-JP?B?GyRCJCIbKEI=?=\n =?ISO-2022-JP?B?GyRCJFsbKEI=?=\n";
$m_header = "Content-Type: text/plain\n Subject: foo\n bar\n";
ぼうやだからさ!
249 :
nobodyさん :05/03/19 03:53:17 ID:RErqV7fD
name="*********" すべての文字列の中から上の中の*********だけを取り出すことはできますか? *は任意の文字列で、文字数も自由です。
252 :
nobodyさん :05/03/19 14:37:12 ID:frwLr80o
できた
責任とってよ!
おろせよ
ひとでなし!
ホントにおれの子か?
まけぼのと角田師範の愛の結晶
Perl です。 いろんな形の <br><br/><BR /> などなどを <br /> に統一したい。どうしたらいいですか!? <[Bb][Rr]*(\\)>
259 :
T女の竹田 :2005/03/21(月) 12:19:14 ID:???
s{<br( /)?>}"<br />"sgi でどう? <br clear="left">とかも入れるなら s{<br[^>]*>}"<br />"sgi かな。
260 :
T女の竹田 :2005/03/21(月) 12:21:11 ID:???
あ、上のは s{<br( ?/)?>}'<br />'sgi のほうがいいかな
<[Bb][Rr]*(\\)> ↑ これは一体何をしたかったのだろう・・・。 んじゃ s!<br(?>[^<>]*)>!<br />!igs; ところで、 i g s m x e o とかのオプションって、書く順番とか決めてる? どの順番がわかりやすいんだろうなー。
263 :
T女の竹田 :2005/03/21(月) 14:39:41 ID:???
sは習慣的につけてるなぁ 順番はsgieの順だな、他は使ったことがほとんどない
264 :
nobodyさん :2005/03/26(土) 01:18:00 ID:vkj2cQCr
Perl使ってます。
htmlのaタグに囲まれた文字、それとa閉じタグ以降の文字、を抽出したいのですが
例:<a href="
http://hogehoge.com ">aiueo</a>&nbsp;|
抽出後:aiueo&nbsp;|
のような感じです。
で、正規表現として「s/<a.*?>(.*?)</a>(.*?)/i」と書いたのですが、
aタグに囲まれたのは$1に入りましたが、a閉じタグ以降の文字が$2に入ってないんです。
どう書いたらよいのでしょうか?
>>264 それ、
s{<a.*?>(.*?)<}{a>(.*?)}i
になってるよ。sはいらない。
m!<a.*?>(.*?)</a>(.*?)!i
とでもしたら?
>>264 > で、正規表現として「s/<a.*?>(.*?)</a>(.*?)/i」と書いたのですが、
/をエスケープして「s/<a.*?>(.*?)<\/a>(.*?)//i」と書いてください。
>>264 2番目の括弧最小マッチだから空文字にマッチして終わりだよ。
AA(と思われる文字列)を正規表現で表すのは不可能ですか?
AAってアスキーアート?
>>268 「と思われる」をどの程度と考えるかによるとは思うが、
不可能。
271 :
268 :2005/03/26(土) 16:16:30 ID:???
そうです。 掲示板にAAの大量投稿荒らしが発生してしまって、 正規表現である程度は弾けないか、、と思いまして・・・
行頭に全角空白が連続していたり、;が連続していたりなんて如何でしょう?@条件 このあたりはRock54でも難しかったりしますけれども(苦笑)
何この糞コテ
>>273 未承諾広告※ ◆TWARamEjuA たんはエロい人なんでつよ。
酩酊してることもあるみたいだけど。
取り巻き付きとかカッコ良すぎでこのスレには似合いませんね
/\∀Дωが合計5個以上とか
記号が連続するので判断するとか
勉強中ですがいまいち挙動がわかりません。 ご教授下さい。言語はPHPです。 下記参照 $strのヒアドキュメントから2パターンマッチしてます。 なぜ、"<!-- ▲パターンマッチのサンプル-->"これが マッチしないのかがわからないのです。 ====== source ============= $str = <<<_EOT_ <!-- ▼パターンマッチのサンプル --> <p>パターンマッチ</p> <!-- ▲パターンマッチのサンプル--> _EOT_; preg_match("/^<!--([^<>]+)-->/", $str, $match); print_r($match); ====== source ============= ====== 結果 ============= Array ( [0] => <!-- ▼パターンマッチのサンプル --> [1] => ▼パターンマッチのサンプル ) ============================
>>278 ▼ で一回パターンマッチした時点でおしまい。
パターンマッチを複数回繰り返したいなら preg_match_all とかを使う。
>>278 それと1行だけしか判定しないから複数行を調べるときはmオプションをつける
質問です。 環境はVBScriptで、VBScript.Regexpを使用しています。 元の文字列は A 1 B 2 3 C 4 D 5 又は B 1 D 2 3 C 4 A 5 この様な形です、そのときにBの列の値(上の例だと2\n 3、下の例だと1)を取得したいのですが、うまく取れません。 現在の正規表現は B *((.*\n)*) *(A|C|D) この形です、現在とれる値は上の例ですと(2\n 3\nC 4)下の例ですと(1\nD 2\n 3\nC 4) この様になっています、どのようにすればよいでしょうか?
>>279 ,280さんどうもです。
自分でsourceを弄くっているうちにmオプション取って書き込んでしまいました。
mオプション(単一行化)をつけ"
<!-- ターンマッチのサンプル-->"になぜマッチしないのかがわかりません。
<!-- から始まってるのに・・・
>>282 だからpreg_match_ALLだって
284 :
nobodyさん :2005/03/30(水) 16:28:08 ID:FkBnaI5T
場違いかもしれませんが失礼します。 20020301というような年月日名のファイルをプログラムで検索させる時 20020330以降というような判断条件を正規表現で表現できるでしょうか。 (もし20020350というファイルがあった場合条件合致としない) プログラムですれば出来るのですが、条件は自由に編集できるようテキスト で保存したいと考えています。 ちなみに私の正規表現知識は”\.^$[]*+?|()”くらいしかないです。 正規表現で出来るかが知りたいので使わないというのは無しでお願いします。
正規表現”だけ”なの? ”だけ”だとできないんじゃね?
理論的には不可能ではないんだろうけど、 20020350 みたいな validation check までするとなると、 正規表現だけでやるのは無理と思った方が賢明と思われ。
>>281 RegExp::Multiline をセットして、こうかな。
^B *(.+(\n .+)*)\n
288 :
nobodyさん :2005/03/30(水) 19:26:51 ID:FkBnaI5T
釣りかと思ってた
おれは純粋なアホかと思ったw
291 :
nobodyさん :2005/03/30(水) 23:14:41 ID:oXQqC/Dj
正規表現を使って、 「任意の範囲におさまる数」を検出することは出来るでしょうか? たとえば、123〜4567の間の整数ならヒットする、という風にしたいのです。
できる
my ($number, $ok) = (1234, undef); $number =~ s/^(\d+)$/$ok = ($1 >= 123 and $1 <= 4567) ? 1 : 0/e; printf qq|%s\n|, $ok ? 'OK': 'NG';
$str = "2344rsfsdfewr324wsefare65j34ja3644wk7we45ke5rjy4e575564"; @result = grep { 123 <= $_ and $_ <= 4567 } $str =~ m/(\d+)/g; $, = ', '; print @result;
>>294 無理に正規表現にしなくてもじゃなくていいじゃんw
落ち着け
>>293 ($1 >= 123 and $1 <= 4567)
これ正規表現なのか
PHP で mb_ereg_replace を使おうと思ってるんですけど、 1: を white space 2:<br> を 改行 3:あと strip_tags() したいです。教えて下さい。
>>298 $txt = mb_ereg_replace(" ", "white space", $txt);
$txt = mb_ereg_replace("<br>", "改行", $txt);
$txt = mb_ereg_replace("あと", "strip_tags()", $txt);
300 :
298 :2005/03/31(木) 12:34:34 ID:???
301 :
299 :2005/03/31(木) 12:36:34 ID:???
>>298 何がわからないのかがわからないので関数の使い方を書いておいた
>>298 $orig = mb_ereg_replace("<[Bb][Rr][^>]*>", "\n", $dest);
$orig = mb_ereg_replace("&[Nn][Bb][Ss][Pp];", "", $dest);
$orig = mb_ereg_replace("<[^>]*>", "", $dest);
>>303 それならmb_eregi_replaceの方が
PHPでマルチバイトの正規表現で質問なのですが 『連続する文字列"_正規表現道場_"を除く、全角文字を含むすべての文字列』はどのように表現すればいいですか?
縦組の印刷物からwebページにしたのはよいのですが数字がことごとく漢数字です。そのくせなんとか一郎さんとかもいて単純に置換する訳に逝きません。 質問1 正規表現を使って、エディタの検索置換を利用してこれを一発で直すのは不可能でしょうか? 質問2 perlとか使えば可能でしょうか?
答3 別に読めないわけでもないしほっとく。
>>306 そんな質問で答えられるかよ!
ソース(元の文書)のサンプルくらいないとどうにもならんよ。
「一二三五十六三郎一郎」 どれが名前かわかるか?
答え→全て名前w
一ニ三(ひふみ)という名前を知っている
一二三五十六(ひふみいそろく で変換できるね)
>>306 オマイが悩むよりSOHOのおばちゃんの方が安くて便利そうだな。
いろんな国の人が参加する ML を web で公開しようと思ってるんだけど、 電話番号だけは抜きたいと思っています。 基本的にアメリカ人が多いので、XXX.XXX.XXXX な文字並びだけど、 日本みたいに ー (ハイフン)で区切る、みたいな約束事ないし、すごい困ってます。 どうしたらいいでしょう?なにかヒントを下さい。
314 :
313 :2005/04/09(土) 17:40:26 ID:???
書き忘れました。php を使ってます。
よーわからんけど /[\d\.\-]{4,15}/
316 :
nobodyさん :2005/04/13(水) 01:12:27 ID:5d8FOn3z
phpで掲示板を作っているのですが、 HTMLにおいて下のようなものがあるとします。 <html><head>...略... <div> <!--A--> <p>Aです</p> <!--/A--> <!--B--> <p>Bです</p> <!--/B--> </div> ...略...</html> これの\n、\r、\tを取り除いた後、 preg_match_all("/<!--([A-Z]*?)-->.*?<!--\/\\1-->/", $pattern, $file); で、マッチさせると、 <!--A-->がひとつだけのときには成功するのですが、 <!--B-->が加わるとブラウザのページが開かなくなります。 原因をご存知の方はお教えください。
javaソースを検索していますが、 calendarクラスで最初にコールされているメソッドがget???の物を調べたく、 perlの正規表現で、 (\w+)\s*=\s*Calendar\.getInstance.*?(!?\1)\.get を指定しましたがうまくいきません。 下の個所ではヒットしないことを望んでいますが、1〜3行目でヒットします。 1 Calendar cal = Calendar.getInstance(); 2 cal.setLenient(false); 3 cal.getTime(); .*?(!?\1)\.get は calendarインスタンスが最初に呼ばれている個所で、メソッドがgetで始まるを期待しています。
318 :
質問 :2005/04/15(金) 19:01:05 ID:jvrJ4EBi
<市部:さいたま> <郡部:吉見> <市部:秩父> <市部:川越> ↓上のデータを <市部:さいたま市> <郡部:吉見> <市部:秩父市> <市部:川越市> のように先頭から「<市部:●●>」とマッチングするものを、 「<市部:●●市>」に置き換えるにはどうしたらよいでしょうか (ただし、「●●」は流動的なものとする) $data =~ s/<[市部:]*>/<市部:$_市>/; 上のようにやったところ、$_に何も値が入りません。
/<市部:(.*?)>/<市部:$1市>/
ああ、:が半角になってもうた。
321 :
質問 :2005/04/15(金) 19:18:57 ID:jvrJ4EBi
え っ る ハ ぇ し の ァ ハ け と ぉ ァ うはっwww夢がひろがりんぐwwwwww
うはwwwデスクトップ、エロゲばっかwwwww
ワロタW
325 :
nobodyさん :2005/04/20(水) 16:00:48 ID:ns2jNcNy
なんとなくわかってるなら なんとなく抜き出せるだろうから なんとなく聞く必要がないんじゃないかと思う
なんとなくレベルの知識で書いた、いまいちわからない正規表現とやらをまず出してみなよ。
URLの正規表現なんてすぐ見つかるだろうに。
ピンキリだけどね
330 :
nobodyさん :2005/04/20(水) 20:05:32 ID:y0ltMBju
$hoge = ’ <select name="a"> <option value="A" selected>■</option> <option value="B">★</option> <option value="C">▲</option> </select> <select name="b"> <option value="A">■</option> <option value="B">★</option> <option value="C" selected>▲</option> </select> ’; となっている場合、 『selected』が付いているoptionにマッチさせ、 そのvalue値【A】を$hoge1へ代入するしたいのですが、 正規表現はどのようになるのでしょうか? $hoge =~ /value="?([^"]+)"? selected/g $hoge1 = $1; $hoge2 = $2; ↑これでは、ダメでした。 御教授 お願い致しますm( __ __ )m
そういうhtmlファイルを一行ずつ読むコードなら その正規表現でもAとCを取り出せるんだけどね。
>>330 @array = $str =~ /<option\s+(?:\S+\s+)*?(?:value\s*=\s*(?:"([^"]*)"|'([^']*)'|(\S*)).*?selected|selected\s+(?:\S+\s+)*?value\s*=\s*(?:"([^"]*)"|'([^']*)'|(\S*)))\s*(?:\S+\s+)*?>/g;
$hoge1 = join"",splice @array,0,6;
$hoge2 = join"",splice @array,0,6;
ごめん、
>>332 はやりすぎた。
@array = $str =~ /<option value="([^"]+)" selected>/g;
$hoge1 = shift @array;
$hoge2 = shift @array;
>>325 @array = $html =~ /<a\s+.*?href\s*=\s*(?:"([^"]*)"|'([^']*)'|(\S*)).*?>/gi;
push @url, join"", splice @array,0,3 while @array;
335 :
nobodyさん :2005/04/21(木) 09:53:22 ID:L6TjsDSV
PHP4.3.11の環境で、PHPプログラムで読み込むhtmlファイルに 以下のように自分で決めたブロック要素的なコメントタグを挟んでいます。 --------------------------- <!--mytag--> aaa <!--mytag--> bbb <!--/mytag--> ccc <!--/mytag--> ddd <!--mytag--> eee <!--/mytag--> ---------------------------- この中で、内側にそれ以上自分で決めた同一コメントタグが 入っていない部分、つまり、 <!--mytag--> bbb <!--/mytag--> と、 <!--mytag--> eee <!--/mytag--> の部分のみ取り出したいのですが、どのような式を書けば良いでしょうか。
336 :
335 :2005/04/21(木) 11:55:55 ID:L6TjsDSV
自己解決。 $s = "<¥!¥-¥-mytag¥-¥->"; $e = "<¥!¥-¥-¥/mytag¥-¥->"; $rgexp = "/$s(?:(?!($s|$e)).)+$e/s"; で判別できました。
質問です。 掲示板に書き込まれた本文の行末に改行タグがある場合、 それを除去するという処理を加えたいと思っています。 $textが"test<BR><BR><BR><BR><BR><BR><BR><BR><BR>"などのように、 文末に<BR>がある限り、それを取り除く処理にしたいと思います。 この場合ですと、"test"という文字列だけにしたいと思っています。 $textが"test<BR><BR><BR><BR>test2<BR><BR><BR><BR><BR>"であれば、 "test<BR><BR><BR><BR>test2"にしたいと思っています。 while ($text =~ /<BR>$/) { $text =~ s/<BR>$//g; } この記述で動かないのですが、どこが原因なのでしょうか。
>>337 $textの最後に本当の改行コード(\nとか\r\n)がついてるんじゃないの。
>>337 $text =~ s/(?:<BR>)+$//;
340 :
330 :2005/04/22(金) 00:10:20 ID:???
>>331 様
アドバイスありがとうございます。
>>333 様
御教授ありがとうございます。
早速試してみましたが、うまく代入されませんでした。。。
$_ = $hoge;
my @hoge = /value="(.+)" selected/g;
$hoge1 = $hoge[0];
・
・
・
・
これで、自己解決いたしました。
やぶだけど。
>>333 がダメってのは、「$str」 を 「$hoge」 にしてないだけだと思うがw
自分的には↓で済む気がする。
my ($hoge1, $hoge2) = $hoge =~ /<option\s*?value="([^">]*?)"\s*?selected>/g;
あと $hoge は、ヒアドキュメントにしる。
ごめん教えて。 「先頭から最後まで<br>と\s以外の文字が1つもない」 ・・・
[^\s|(<BR>)] iオプション付けてね
|゚Д゚)・・・
$txtから"きゅうり","すいか"2つの単語が含まれていた場合に マッチさせたいんですけど、うまく動いてくれません。 どうすればいいでしょうか。 $txt = "トマトきゅうりピーマンなすすいか"; if(mb_eregi("[きゅうりすいか],$txt)){echo "合致";}
347 :
nobodyさん :2005/05/10(火) 20:45:59 ID:P1c+fxiD
>>346 ダブルクォートが閉じてないのは打ち間違いだろうけど、
文字クラスについて勘違いしてるようだ。
" きゅうり*すいか*" こうですか?
うむ、勉強しなおして来い。
mb_eregi("/(きゅうり)+(すいか)+/",$test) 師匠これでもだめです。 ヒントください
師匠ありがとうございました。 mb_eregi("(?=.*きゅうり)(?=.*すいか)",$txt) これでできました。
354 :
nobodyさん :2005/05/11(水) 14:06:16 ID:8aMwQX6h
wordでの話しなのですが、機能というより、正規表現のアルゴリズム? についてなのでここでお願いしますm(_ _)m CSV形式のファイルをwordに取り込んだときに、CSV特有の文字列にはダブルクォート、その中のダブルクォートにも ダブルクォートの部分がそのまま残ってしまって困ってるので、wordの置換機能で削除しようと思ってます。 単純にダブルクォートだけなら 検索:"(*)" 置換:\1 で、できますがこれだと "19""1238","a9a0","0198" などでしくじってしまいます。 どういう式にすればいいでしょうか? Perlの知識はありますので、回答はwordでの式でなくてもPerlでの式でも大丈夫です。 宜しくお願いしますm(_ _)m
355 :
354 :2005/05/11(水) 14:14:27 ID:8aMwQX6h
Perlではいつもtext::CSV_XSでやってるからファイルを見れば分かると思ったのですが、 わかりませんでした・・・・orz 置換演算子でヒットしなかったのはなんでだろ・・・・
>>354 ワードってPerl形式の正規表現使えたっけ?
それにPerlの知識があるなら、CSVをPerlでいじってからワードに取り込めばいいだけじゃ?
ついでにいえば、Excelで取り込めば、適切なデータになるじゃん。
それをワードに貼り付けるなり埋め込むなりすればいいんじゃ?
なんというか、道具があるのに変に知識だけ持ってるから
逆に面倒にしてるだけだし・・・
357 :
354 :2005/05/11(水) 20:09:41 ID:8aMwQX6h
>>356 wordの置換はperlとはちょっと違いますけど、考え方は同じようなものなので。
データはワードで使いたいんです。
Excelで取り込むと適切なデータになりますが、それをwordにコピペするとちょっと違う
ことになってしまうんです。
wordで普通に「挿入」→「表」で作る表とは違う、オブジェクトとしての表になってしまって
後からいじったりできないんです。
Perlでいじってからというのは確かに、Text::CSV_XS使ってやればできますが、
毎度一旦Perlを通すのもあれですし、仕事場ですので毎度同じPCを使えるわけでは
ないのです。wordなんかの基本ソフトはどのPCにでも入ってますが。
できればwordだけでやりたいので、wordの置換で、と思ったのですが。
CSVのクォート削除正規表現って簡単そうで、結構難しいんですかね?
私が未熟だからだけかと思ったら、このスレの方でもパッはでてこないんですね。
でも、もしもわかるかたいましたらお願いします。1日1回は見に来ますので。
>>357 >wordで普通に「挿入」→「表」で作る表とは違う、オブジェクトとしての表になってしまって
>後からいじったりできないんです。
悪いことは言わない、MS WORDの入門書なり勉強やり直した方が良いよ。
Perl弄ってるとか置換作業とか変な知識とか作業要らない。
お前さんが言ってる事は、普通に出来る。
聞いてると、ただWORDを使いこなせない工場とかのおじちゃんおばちゃんレベル。
Google のキャッシュ表示にあるような ハイライト表示を実現したいと思っています。 HTML ソース内のある単語を置換するときに タグ内にその単語が含まれる場合は無視する という表現はどのように書けばよいでしょうか。 言語は Perl です。
360 :
nobodyさん :2005/05/11(水) 21:25:19 ID:a0NETEmd
>>354 s/"((?:[^"]|"")*)"/$1/g
s/""/"/g
の2回にわけるのが楽だと思われる。
なぁ、今、適当に作ったCSVファイルをエクセルで読み込んで、 でもって、そのセルの部分をドラッグドラッグして全部選択して、Ctrl+Cでコピーして ワードでCtrl+Vで貼り付けしたら、普通にワードで表作った形式になったんだけど・・・ やっぱり、MS Officeの知識が無いって事でFA?
362 :
359 :2005/05/11(水) 21:32:07 ID:???
自己完ですが $output =~ s#(?<=>)([^<]+)?\b($regexp)\b#$1<B style="color:black;background-color:\#ffff66">$2</b>#gis; でできました。
363 :
nobodyさん :2005/05/11(水) 21:39:20 ID:a0NETEmd
>>359 正規表現だけでなんとかしようと考えないほうがいいと思うよ。
オレならこんな感じにするかねぇ。
$s = <<HTML;
<html>
<a href="foo.html">foo</a>
</html>
HTML
$s = ">$s<";
$s =~ s/>([^<]*)</$_ = $1; s|foo|baa|g; ">$_<"/ge;
$s = substr($s, 1, -1);
print $s;
364 :
354 :2005/05/12(木) 17:56:56 ID:mNlaSBNN
>>358 普通にできるというのは、エクセルからのコピペや、ワードでの置換作業なしに
既存のword文書にCSVをworr形式の表化して取り込めるということでしょうか?
ヘルプでは見つけられませんでしたが、もしかしたら私のword2000ではできないのかな。
何年版のwordでしょうか?
>>361 あれ、できましたね;
XLSの取り込みと勘違いしたのかもしれません。
365 :
354 :2005/05/12(木) 17:58:39 ID:mNlaSBNN
>>360 ありがとうございます!
一旦外枠だけはずしてやるんですね^^
さすがですm(_ _)m
>>364 俺もやってみた。
拡張子CSVはExcelと関連付けられているので、CSVファイルをダブルクリックして開く。
CSVは正常な形に各セルに表示されているのを確認。
先に、Excelで開いたCSVのデータを格子状に罫線を引き、
ドラッグして貼り付けたい範囲を選択してCtrl+Cでクリップボードにコピー。
その後、Wordを新規に開き、そこへ、Ctrl+Vで貼り付けてみた。
普通にWordで表を作った見たいな形式に張り付いた。
使用したのはMS Office2000。
367 :
820 :2005/05/13(金) 16:57:34 ID:JEsyMCCs
Greplaceというソフトを使って、txtファイルの置換処理をしているところなのですが 「httpで始まって--で終わる文字列」を正規表現で表現すると http*-- でいいだろうと思って検索かけたところひっかかりません。 しょうがないので、 http.-- に表現を変えてみたのですが、これもヒットせず。 どなたか、こうやって書けばいいんだよと教えていただけると助かります。
http.*-- だろうなぁ。
369 :
367 :2005/05/13(金) 17:54:22 ID:JEsyMCCs
>>368 回答ありがとうございます。うまくいきました。
書き忘れていました 正規表現を使わず$stringに絵文字に入れを$string全体をbin2hexするとうまくできました
mbregex を使って preg_replace_callback と同じようなことをするには どうすればよいでしょうか?PHPです。
374 :
nobodyさん :2005/05/17(火) 13:35:15 ID:9ytTXCmS
1-9,A-Z,a-zのうちの1文字が連続する場合に一致するパターンはどうかけばいいのでしょう? つまりaaaaaaとか55555555とか ZZZZZとか。入力値に対してチェックを かけたいのでどの文字かは入力されるまで分かりません。 PHPでかくと ereg('^([a-zA-Z0-9]*)$', $str) みたいなスカっとおさまる書き方はないのでしょうか? 配列に文字を入れてループで回してチェックするしかないのでしょうか?
>>374 PCRE が使えるなら preg_match('/^([a-zA-Z0-9])\1+$/', $str) でしょうか。
どうも ereg() ではパターン内での後方参照が使えないっぽいんですが、
そういうものなのでしょうかね?
man 7 re_format 見る限りは POSIX 1003.2 の拡張正規表現でも使えそうなんですが。
376 :
nobodyさん :2005/05/17(火) 15:18:00 ID:9ytTXCmS
>375 ためしてみたところうまく機能しました! 有り難うございます! やっぱereg()では後方参照つかえないんですかねぇ
377 :
370 :2005/05/17(火) 15:25:00 ID:???
すみません、書き直します。
$test = 'あん'; //機種依存のsjis文字入り(同じ文字はありません)
$test =~ s/\G((?:[\x80-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF])*)([\xF8\xF9][\x40-\x7E\x80-\xFC
])/$1/eog;
これはPerlスクリプトなんですが、これをPHPに移行したいと思います。
eogを除いてpreg_replaceすると
>>370 のように何故か5c30になってしまいます。
$test1 = mb_ereg_replace("([\xF8\xF9][\x40-\x7E\x80-\xFC])","\\1" , $test);
これはWarning mbregex compile err: mismatch multibyte code length in char-class range in となってしまいます
どこがおかしいのですか??
>>377 多分、ダブルクオートの中でバックスラッシュを使っているので、
正規表現エンジンに渡る前にバックスラッシュが展開されているのではないかと。
"\\xF8" みたいにするか '\xF8' みたいにシングルクオートにすると良いかと。
>>378 ありがとうございます
シングルクオートに変更したところ、そのエラーは出なくなりましたが、次は
mbregex compile err: too short multibyte code string in
と出るようになってしまいました
何が短いのですか?
>>377 正規表現スレなのでスレ違いなのですが自分なら
<?php
$emoji = pack("n*", 0xF89F, 0xF8A0, 0xF8A1);
$test = "絵文字test1".$emoji."test2";
$count = mb_strlen($test, "sjis");
for ($i = 0; $i < $count; $i++) {
$char = mb_substr($test, $i, 1, "sjis");
$char_hex[1] = 0;
if (strlen($char) == 2) $char_hex = unpack("n", $char);
if ($char_hex[1] > 0xF89E and $char_hex[1] < 0xF9FD) echo " <b>".bin2hex($char)."</b> ";
else echo $char;
}
?>
こうする。
381 :
nobodyさん :2005/05/18(水) 13:05:20 ID:JNoGnyuI
オマンコ!
> Perlメモ
>
http://www.din.or.jp/~ohzaki/perl.htm > > HTMLタグの正規表現
> > $comment_tag_regex =
> > '<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!\n)|--.*$)';
ってあるんだけど、これ通すと
my $str = '<!--- abcde --->'; とか
my $str = '<!-- \n var i=0; i--; document.write(i); \n // -->'; とか
全然うまくとれないんだけど、どう改造すればいい?
(?:[^>-]*(?:-[^>-]+)*?)??
↓
(?:[^>-]*(?:-[^>-]*)*)??
こうすると ↑↑ のはとってくれるけど、今度は
my $str = '<!-- comment -- cdata --> comment -->';
これが最後までとってくれなくなって困る orz
383 :
382 :2005/05/18(水) 17:30:24 ID:???
ごめん、↑じゃ言ってること矛盾しててアホだったw × my $str = '<!-- comment -- cdata --> comment -->'; ○ my $str = '<!-- comment -- cdata -- > quote_comment -->'; こんなで。
384 :
382 :2005/05/18(水) 17:57:38 ID:???
orz それだったら /<!--.*?-->/ で事足りるのかw スレ汚しスマヌ
「AAAを含み かつ BBBを含まない」 という正規表現の書き方を教えて下さい。 Perlで試したところ (?=.*AAA)(?!.*BBB) でいける感じなのですが、 開発に使用しているのはUNIXのC言語です。 (?=や(?! を使わないで、これと同じことを記述できませんでしょうか。
/AAA/ and !/BBB/
>>385 「UNIXのC言語」といってもいろんな正規表現ライブラリがあるわけですが・・・
# ちょうどプログラム板の正規表現スレでそんな話題が。
POSIX regex (re_format(7)) だと簡単には書けそうにないので
>>386 みたく二回正規表現マッチさせるか、
(?= や (?! をサポートした正規表現ライブラリを使うのが良いのでは?
388 :
nobodyさん :2005/06/03(金) 17:12:04 ID:kgnGijhB
質問がここでいいのか不明なんですが、 K2Editorというエディターを使用して、ある文章の中にある 「$英数字」という部分を検索したいのですが、 どのように正規表現を記述していいのか分かりません。 $英数字の前後には半角スペースが入っており、それに続いてまた記述があるので、 半角スペース前後まで検索したいと思っています。 例えば、 test $kensaku test という個所があるとすると、$kensakuのみ検索対象にしたいのです。 K2Editorのヘルプを見る限り、$を使用するためのエスケープが\eと書いていました。 とすると、\e$[a-zA-Z_]+ と思ったのですがうまくいきませんでした。 ご教授下さい。
390 :
388 :2005/06/03(金) 18:23:28 ID:???
>>389 うまくい検索出来ました。
ありがとうございます。
うまくいっちゃってから言うのもアレなんだけど $[a-zA-Z]+ ではダメだったの?
>>391 それはダメなケースけっこう多いと思うw
394 :
nobodyさん :2005/06/05(日) 13:57:15 ID:OswuRoJX
YahooIDと同じ規則の表現の仕方教えていただけますか? ・使えるのは半角英数字アンダーバーのみ ・最初の文字は英字のみ 宜しくお願いします
^[a-zA-Z]\w+ ってのはだめ?
396 :
nobodyさん :2005/06/05(日) 18:35:41 ID:??? BE:101650436-##
^[a-zA-Z]\w*$ 文字数制限はない? 1文字以上ならOKの例で書いた
>>395 >>396 両方無理でした
普通にアンダーバー最初に書いても通っちゃいました
もしかして
if($FORM{'id'} =~ /^[a-zA-Z]\w+/);
じゃなくて
unless($FORM{'id'} =~ /^[a-zA-Z]\w+/);
みたいにしないとダメ?
>>396 ので良さそうなんだが。ダメだった再現コードを見せてみい。
漏れも粋な性器表現をしたいな
私の性器表現はコンパクトです。
私の性器表現は一言で言えばアワビです。
私の正規表現はクラス化して隠蔽しております。 すいません、もうしません…
俺の正規表現は Perl で拡張されてるよ
正規表現は漏れの場合、珍出る裸。
405 :
nobodyさん :2005/06/11(土) 18:52:57 ID:yQRzdV10
PerlでURL文字列よりホスト名、ポート、パスを取得するような以下の
スクリプトを使っていますが
$url =~ m!(http:)?(//)?([^:/]*)?(:([0-9]+)?)?(/.*)?!;
if ($3) {$host = $3;}
if ($5) {$port = $5;}
if ($6) {$path = $6;}
$path =~ s/#(.)*$//;
http://User:Password@ …というBasic認証のURLでユーザー名とパスワードを
抽出するためにはどう改造したらよいですか?
>>405 なんだか元のがすさまじい正規表現な悪寒。
407 :
405 :2005/06/11(土) 21:12:07 ID:yQRzdV10
>>406 昔、どこかのサイトに掲載されてたのをコピペで使ってます。
改造でなく、書き直しして頂いても、ありがたいです。
もしかして正規表現全然わからない?
丸投げスレいけ
正規表現の利用例を大量に載せてるサイトってない?
412 :
nobodyさん :2005/06/18(土) 01:50:56 ID:ioO/WA9K
基本的な質問ですみません。 perlで書かれたソースをphpに移行しようと試みています。 以下のperlのソースをphpで書くとどのようになりますでしょうか。 $data =~ s/"/"/g; 一応、 preg_replace("s/"/"/g", $data); かなと思ったのですが、マニュアルを読んでみると、 phpの正規表現には修飾子「g」は無い、とあります。 他の関数を使う、関数をいくつか組み合わせるなど、 違う表現の仕方が必要になってくるのでしょうか。 お力添え宜しくお願いします。
>>412 preg_replaceはグローバルマッチだお!
preg_replace('/"/','"e;',$data);
このままだと$dataの中身が代わらないと言われそうなので、一応。 $data = preg_replace('/"/','"',$data);
415 :
nobodyさん :2005/06/18(土) 08:51:00 ID:7Fs175F4
perlの\Gはpregではどう書くんですか?
416 :
nobodyさん :2005/06/18(土) 08:57:03 ID:ioO/WA9K
<preg_replaceはグローバルマッチだお! <$data = preg_replace('/"/','"',$data); ご返答ありがとうございます。 グローバルマッチでしたか、申し訳ありません、勉強不足でした。 マニュアルを確認してみたところ、確かにそのような記述がありますね。 「limitが 省略されるか -1 の場合、マッチするものは全て置換されます。 」 >mixed preg_replace ( mixed pattern, mixed replacement, >mixed subject [, int limit]) >subjectに関して patternを用いて検索を行い、 replacementに置換します。 >limitを指定した場合、limit 回のマッチまで置換が行なわれます。 >limitが 省略されるか -1 の場合、マッチするものは全て置換されます。 ありがとうございました!
419 :
nobodyさん :2005/06/22(水) 15:46:50 ID:e2RB9R1A
PHP環境で入力された文字列に半角記号が含まれている場合、 エラーを表示させるために[:punct:]を使ったところ 「与」などの一部の文字が想定外のマッチをしてしまうのですが どうやって回避すれば良いのでしょうか… こんな感じで書いています。 if (preg_match("/[[:punct:]]/", $_GET['word'])) { echo "記号が含まれています。"; exit; }
>>419 mbregex をインストールすればあるいは。
422 :
419 :2005/06/22(水) 16:32:12 ID:e2RB9R1A
>>420 既に運用を始めてしまっているので、文字コードを変えるのは厳しいですね…
>>421 間借りレンタルサーバーなのでmbregexのインストールは無理っぽいです…
回答ありがとうございます。
もう少し模索してみます。
>>422 そっか。じゃあこんなんでどうだろ?
$sjis = '(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]|[\xA1-\xDF])';
if (preg_match("/^${sjis}*[[:punct:]]/", $str)) { ... }
424 :
419 :2005/06/22(水) 18:18:33 ID:???
>>423 おお!良い感じで動作してます。
ありがとうございます!
>>423 スンマソン。その$sjisに入ってるパターンにはどういう効力があるのですか。
>>422 mb_convert_encodingじゃだめかね?
>>426 インスコできないという話では?
>>425 Shift_JIS の「与」には "^" が混じっているのでそれがそもそもの問題。
Shift_JIS の文字の一部として "^" が出現した場合には [:punct:] にマッチさせず、
単独に出現した場合のみ [:punct:] にマッチするようにすると良い。
$sjis は ASCII 以外の Shift_JIS にマッチする正規表現で、
先に「与」を $sjis に食べさせて (マッチさせて) おけば、
単独に出現した "^" は [:punct:] に正しくマッチする。
・・・俺、説明下手だな orz
jcode.phpでEUCに変換する
429 :
425 :2005/06/23(木) 16:31:57 ID:???
>>427 なるほどっ!説明下手なんかじゃないですよ。よく分かりました。
ありがとうございます。
$sjis に [0-9A-Za-z] とかスペースとかも入れなくて平気なん? 「あいうえおabcde^!?」 とか
>>430 設問が「文字列に半角記号が含まれている場合、エラーを表示させるために」
だったので敢えて入れなかったんですが、
そういう動作を意図しているんなら入れるべきでしょうね。
[0-9A-Za-z] は"記号"じゃないだろ。
$_ = '(abc (def) ghi ( jkl (mno (p) q ) r) s) t (uv(wxy)z)'; こういうカッコがネストされた文字列があるとき、 対応したカッコ (abc 〜 s) までを取り出したいんだけど、何かいい方法はある? ちなみに、Perl で カッコのネストの深さは 任意 、ってことで。 対応したカッコにあらかじめ番号振っておくくらいしか思い浮かばない・・・orz
>>434 レスありがとう
でも、それ、 2重までなのか、結果が、
(def)
(mno (p) q )
(uv(wxy)z)
って出ちゃうんだよね・・・。 orz
>>435 最新の perl を使っていないかコードを写し間違えてるに 500 ペリカ。
・・・・ ああ、そうか、 $openclose = qr/\([^()]*(?:(??{$openclose})[^()]*)*\)/; の $openclose をグローバルにしたらうまくいったよ! ってグローバルじゃなきゃだめなのか・・・。 $_ でやったら perl 死ぬなあ。 ふむ。 とりあえずありがトンー。
>>437 #!/usr/local/bin/perl -w
use strict;
my $str = '(abc (def) ghi ( jkl (mno (p) q ) r) s) t (uv(wxy)z)';
my $openclose;
$openclose = qr/\([^()]*(?:(??{$openclose})[^()]*)*\)/;
while ($str =~ /($openclose)/g) {
print $1, "\n";
}
__END__
OH! YES! THANX!!
440 :
nobodyさん :2005/06/26(日) 01:22:38 ID:XF0TC+BI
正規表現(grep)でIPアドレスを抽出したいのですが、 ([1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\.([1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\.([1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\.([1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])) で合ってますか??
>>440 '.' で 4つにバラして各要素を数値比較した方が見通し良さそうだけどな。
442 :
nobodyさん :2005/06/26(日) 02:08:19 ID:XF0TC+BI
(([1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\.){3}([1-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))
>>441 こういうことですか?
よくわからないです、、
無理して全部正規表現じゃなくてもといいんじゃね?
444 :
440 :2005/06/26(日) 02:58:14 ID:???
いや、正規表現使えるようになりたいんです。 とりあえず、初歩の初歩だけは読んで理解したつもりなんですが、、 これでは全部抜けませんか?
>>440-444 grep と言っても色々あるわけでな…。
http://www.kt.rim.or.jp/~kbk/regex/regex.html ERE なら
grep -E '((1[0-9]?[0-9]?|2(5[0-5]?|[0-4]?[0-9]?)|[3-9][0-9]?|0)\.){3}(1[0-9]?[0-9]?|2(5[0-5]?|[0-4]?[0-9]?)|[3-9][0-9]?|0)' ip_address.list
但しこれは "516.171.8.192" という文字列があった場合、"16.171.8.192"
にマッチする。GNU grep なら \b が使えるので、前後に \b をつければ
これを回避できる。
\n\n\s\s\s\s\n\n\n\n\n\n\n\n\nと、 \n\n\s\s\s\s\n\n\n\n\n\n\nという行があるとして、 検索した時に両方ともマッチする表現ってないかな?
.*
448 :
446 :2005/06/26(日) 06:22:39 ID:???
.*じゃだめっぽいなぁ。俺のやり方が悪いだけかもしらんけど。 <td rowspan=3 align=center>\n\n\s\s\s\s\n\n\n\n\n\n\n\n\n<a href=(.+?)> と <td rowspan=3 align=center>\n\n\s\s\s\s\n\n\n\n\n\n\n<a href=(.+?)> なんだがPHPでRSSを出力してる最中に同じページで条件が違って参ってるんだ。
449 :
446 :2005/06/26(日) 06:53:48 ID:???
真性ですね
\nという行っていういみがよくわからんのですが
url文字列へのリンク方法を教えて下さい。 htmlタグ内のurlにもマッチしてしまうので、困ってます。 環境は PHP 4.3系 です。 コードは $str = preg_replace('/(?:href=["\']){0}((?:https?|ftp):\/\/[-_.!~*\'\(\)a-zA-Z0-9;\/\?:\@&=+\$,%#]+)/', '<a href="\1">\1</a>', $str); や $str = preg_replace('/(?:^href=["\'])((?:https?|ftp):\/\/[-_.!~*\'\(\)a-zA-Z0-9;\/\?:\@&=+\$,%#]+)/', '<a href="\1">\1</a>', $str); $str = preg_replace('/([^"]|^)((?:https?|ftp):\/\/[-_.!~*\'\(\)a-zA-Z0-9;\/\?:\@&=+\$,%#]+)/', '\1<a href="\2">\2</a>', $str); $str = preg_replace('/([^=^"]|^)((?:https?|ftp):\/\/[-_.!~*\'\(\)a-zA-Z0-9;\/\?:\@&=+\$,%#]+)/', '\1<a href="\2">\2</a>', $str); と、色々試して見てますが、 やはりどれもタグ内のURLにもマッチしてしまいます。 良く使われるパターンだろうけども、検索結果や他の人のコードを見ても上記のようなコードしか得られません。 どなたか分かる方いますか?
453 :
nobodyさん :2005/06/26(日) 17:14:29 ID:Mzx+46/z
s/(^-^)/~~(-_-).../;
454 :
nobodyさん :2005/06/26(日) 18:55:27 ID:Di+cudPS
.┌━┐ ┌━┐ ┃┌╋──╋┐┃ └╋┘ └╋┘ ┃ ・ ・ ┃ ┌━━┐ ●━╋┐ ┌╂━━━━╂┐ ┃ └━┷┴━━╂┘ └╋━
携帯AAスレ
>>452 タグのついてないタイミングがあればそこでオートリンクすればいい。
もしくは誤認識をしない区間を一度切り出すとか。
<a href="http略"><b>http略</b></a>
452が考えてる方法だと↑こっちに反応してしまうよ。
458 :
nobodyさん :2005/06/28(火) 18:33:30 ID:7mbB9yts
初歩的な質問すみません。 cygwinのperl5.8です。 fuga hogehoge のような複数行にわたる文字列にマッチさせたいのですが if (m! fuga\r\n hogehoge\r\n !mx) ではマッチしません。どう記述すればよいのでしょうか?
460 :
nobodyさん :2005/06/28(火) 19:48:30 ID:7mbB9yts
>>459 返答ありがとうございます。
単一行の hogehoge\n にはマッチせず、 hogehoge\r\n にマッチしますので
改行コードに問題はなさそうです。
正規表現の問題ではなく環境依存の問題ということでしょうか。
もう少し調べてみます。
m/fuga\s+hogehoge\s+/s
462 :
nobodyさん :2005/06/28(火) 20:16:47 ID:nrjgh71k
s/(^-^) (^-^)/(T-T) (-_-+)/g;
463 :
458 :2005/06/28(火) 20:30:28 ID:7mbB9yts
>>461 m/hogehoge\s+/s
これにはマッチするのですが、
m/fuga\s+hogehoge\s+/s
これにはマッチしません。。。
>>463 基本的な質問で恐縮なのだが、
$_ には確かに "fuga\r\nhogehoge\r\n" という文字列は入っている?
465 :
458 :2005/06/28(火) 20:52:33 ID:7mbB9yts
>>464 while ( <> ){
if(m/fuga\s+hogehoge\s+/s){print "OK\n";}
}
こんなので標準入力から読み込ませているのですが、それを確認する方法がわかりません。
複数行読まれていないとしたら、どうしたらよいのでしょうか。
もうスレ違いな領域に入っているようですが。。。
466 :
nobodyさん :2005/06/28(火) 20:58:57 ID:??? BE:1634235-#
('・c_・` )
467 :
458 :2005/06/28(火) 21:05:12 ID:???
わかりました。 undef $/; でうまくいきました。 お蔭様で、昨日から悩んでいたのが解決できました。 本当にありがとうございます。お騒がせして申し訳ありません。
s/(^o^) (^o^)/(>_<) (>_<)/g;
腐女子死ね
470 :
nobodyさん :2005/06/30(木) 22:01:58 ID:uEEJE9h2
すいません Perlなんですが、 3文字以内の行(を改行のみに置換) ってどう書いたらいいでしょうか?
471 :
nobodyさん :2005/06/30(木) 22:15:26 ID:FhJSSQPy
常識的にいやぁ、こだろな。 s/^.{0,3}$//;
473 :
nobodyさん :2005/07/01(金) 01:34:23 ID:2L+Akkii
Perl使ってます。以下のようなHTMLコードから、番号と指名のハッシュを 取得するにはどうすればよいでしょうか? ----- <table> <tr><th>番号</th><th>氏名</th></tr> <tr><td>01</a></td><td>山田太郎</td></tr> <tr><td>02</a></td><td>山田次郎</td></tr> </table>
行単位のループすれば$1がキー、$2が値になる。 $_ =~ m!^<tr><td>([^<]*)</a></td><td>([^<]*)</td></tr>!;
どうでもいいけど、その 無意味な </a> は何なんだろうね。
番号大きくなるとが数字だけじゃなくていずれ<a href="mailto:hage">とか文字列に代わるのかな?
正規表現で、fooを含みbarを含まない行をヒットさせる方法はないでしょいか? いまのところ、文字列fooを含まない行は ^(((([^f]*)*(f+[^o][^f]*)*)*)*(f+o[^o][^f]*)*)*$ でヒットすることがわかりました。 この先がどうしてもわからないのです。 お知恵をお貸し下さい。
478 :
nobodyさん :2005/07/02(土) 12:29:04 ID:BTmtp6GJ
/^(((((^-^))(+_+)[*o*]f^_^;)(^o^)f^_^;))$/
分割処理するかPCREを使うのが手っ取り早い
「ほげほげを含まない文字列にマッチさせたい」というのを見るたびに 「ほげほげを含む文字列にマッチ」させて否定をとりゃいいじゃんと 思うのだが、そうしないのは何か理由があるのだろうか。
他のソフト探せば? ここ "Web"Prog だしなあ。
そのソフトでは"否定"がとれないってことだろ? 意味明快。
>>487 そのソフトってどのソフトのこと言ってんの?
やっぱここは、正規表現最強のPerlをお勧めしておく。
>>487 「否定が取れないソフト」の場合は確かに仕方ないけど、
そうでないケースもこのスレの質問では結構多いと思う。
それに、
>>484 の言うとおり、 "Web"Prog でそんなソフトはあまり無いと思われ。
ある正規表現が与えられたときにその正規表現に マッチしない文字列にのみマッチする正規表現は 一般には作れますか? 有限オートマトンだから 作れそうな気はするのですが。
493 :
nobodyさん :2005/07/04(月) 16:44:56 ID:LXfnoi1Z
誘導されてきました。PHPでの質問です。 変数$html にとあるHTMLファイルを読み込みまして、そのHTMLに記述されている <!-- コメント1 --> から <!-- /コメント2 --> までの範囲にある文字列(タグ含む)を 変数$hensu に代入したいのです。 preg_match を使えとのことだったんですが、具体的にどうやればよいのか分かりません。 どうかご教授頂けますでしょうか。お願い致します。
>>494 あっ。。。時間差で答えが出ていました。お騒がせしました。
496 :
nobodyさん :2005/07/06(水) 21:23:47 ID:uSLwEBZ9
123..45.78.9 見たいな数値と.の組み合わせの文字列を 123.45789のように 最初に出現する.を除き除去するにはどうすればよいでしょうか?
497 :
496 :2005/07/06(水) 21:26:13 ID:uSLwEBZ9
書き忘れました javascriptで行うつもりです。
とりあえず手抜き版 var a='123..45.78.9'.replace(/\./,'<<escape>>').replace(/\./g,'').replace(/<<escape>>/,'.');
javascriptを使っての質問なのですが、 13756〜36865みたいな中途半端な数字の範囲は どう表現すればよいのでしょうか?
>>499 本気で正規表現が適してると思うなら考え直せ。
501 :
499 :2005/07/09(土) 00:10:04 ID:???
>>500 正規表現でできると講師に聞いたのでやってみようといろいろ試したのですが全くわからなくて
ここで聞いてみたのですが・・
正規表現以外でできるものがあるのですか?
502 :
JAPU :2005/07/09(土) 02:15:39 ID:???
>>500 氏の行間補完計画
上記の条件を受理する正規表現は存在するので,理論上は可能。
たとえば,123 - 456 の整数なら (JS知らないのでPerlの表現になるけど)
^(?:12[3-9]|1[4-9]\d|[23]\d\d|4[0-4]\d|45[0-6])$
または
^(?:123|124|125| 途中略 |454|455|456)$
となる。13756 - 36865 でも同様に書ける。
でも,数字に変換して,その範囲かどうかチェックしたほうが速くない?
503 :
nobodyさん :2005/07/09(土) 08:57:03 ID:b0QlFvY6
ほのぼの(^-^)
504 :
nobodyさん :2005/07/09(土) 18:16:14 ID:XiYWtJZE
正規表現をマスターするには、どうすればいいですか?
505 :
JAPU :2005/07/09(土) 19:55:25 ID:???
Mastering Regular Expression という本があるよ。 (日本語版「詳説正規表現」)
4年ぶりくらいにJAPUタン見た。
>>506 最近、昔懐かしいコテをいろいろ名乗っている人がいるので
このJAPUたんも多分偽者ジャマイカ?
ほかにはT女の竹田とかも見た。
teranatukashisu
じゃあ俺は弐編を…
510 :
JAPU :2005/07/12(火) 21:37:17 ID:???
把握した
512 :
507 :2005/07/13(水) 09:46:20 ID:???
513 :
506 :2005/07/14(木) 01:35:07 ID:???
それではJAPUタンと一緒に皆で、 チャンコダイニング若で鍋でも囲もうじゃないか。
514 :
nobodyさん :2005/07/17(日) 16:02:42 ID:6p9wxgWq
$regex = '/\x1b\$([E-G])([\x21-\x7a])+\x0f/e'; この正規表現を理解したいです。 \$([E-G]) \x0f/e この2点の意味がわかりません。 /はどのような意味を持つのでしょう? よろしくお願いします。
515 :
514 :2005/07/17(日) 23:47:07 ID:???
他で聞いてみます。
>>515 まあそーゆーな
16進で1b,$そのもの,EからGのどれか,16進21から7aのどれかの中から一文字以上繰り返し,16進0f
で/は閉じ
eはフラグだから正規表現とは関係なし
517 :
516 :2005/07/17(日) 23:53:33 ID:???
/は閉じと書いたが万が一嘘かもしれん その場合は/は/そのもの 最後のところは16進0f, /, eというシーケンス ていうか何の言語での話か わからないとわからないよ
PHPのPerl互換正規表現の話じゃないかと思われ。
519 :
514 :2005/07/18(月) 00:57:29 ID:???
レスどうもです。 /−/e は正規表現の置換ですね。 $ = 0x24 E-G = 0x45-0x47 のことだとわかって納得しました。 本に書いてあるコードなんですが、直前まで16進数で解説してたのでわかりませんでした。 ありがとうございました。
520 :
nobodyさん :2005/07/18(月) 01:04:26 ID:jRcBcWiX
>>514 よかったら書名教えて
あと「正規表現の置換」て意味わからないから
性器表現のチカン >< s/♂/♀/g
それじゃ性転換!
521 :nobodyさん sage :2005/07/18(月) 01:40:16 ID:??? 性器表現のチカン >< s/♂/♀/g 522 :nobodyさん sage :2005/07/18(月) 03:34:06 ID:??? それじゃ性転換!
524 :
nobodyさん :2005/07/18(月) 16:54:26 ID:fWK6qRMT
ワロスww
オモロスww
526 :
PHPで。 :2005/07/21(木) 10:09:56 ID:jGRVDiGI
index?a=&b=&c=0&d=1&e= こういったURLがあり、置換で必要のない変数を削除したい。 例えば、 「&a=」「&c=0」「&e=」を削除して、「index?b=&d=1」のようにしたいのです。 ちなみに、これらの変数には数字(1桁)がくる場合と空白の場合があります。 正規表現が初めてなので、とりあえずやってみたのは一個一個削除することです。 $url = ereg_replace('\&a=[0-9]?','',$url); $url = ereg_replace('\&c=[0-9]?','',$url); $url = ereg_replace('\&e=[0-9]?','',$url); 一応これで成功はしたのですが、何せ初めてなのであっているかどうか分かりません。 それと、もし1回の変換で可能であればその方法も教えて下さい。
>>526 PHPは知らんのだけど、その例だと "a=" は消えないだろ。前に & ついてないし。
> もし1回の変換で可能であればその方法も教えて下さい。
もうちょっと条件を一般化してくれないと、できるかどうかは誰にも分からない。
>>527 フォームのGETで出されたURLから必要の無い変数を削除したいのです。
フォームは自分でいじれないので、URLを直接置換するしか方法が無くて。
先の例ですが、GETで渡されたURLで、最初にくる変数には確かに「&」がつかず「?」の次から始まりますね。
それで今ちょうど躓いてしまったところです。(例と実際のソースが異なるためミスってしまいました)
条件1
・英字の先頭には「&」もしくは「?」がくる。「?」は削除せず、「&」は削除
・「& or 無し」+「英字1文字」+「=」+「数字1文字 or 空白」を削除
例: &c=
これともう一つ別件で
条件2
・英字の先頭には「&」もしくは「?」がくる。「?」は削除せず、「&」は削除
・「& or 無し」+「英字1文字」+「=」+「英数字の組み合わせ6文字」を削除
例: ?c=ff00cc
わかりにくいかも知れませんが、精一杯説明したつもりです。
どうかヨロシクお願いします。
&?([a-zA-Z]=[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9])|([a-zA-Z]?) phpは知らんので繰り返し指定子とか使えるなら使えばよい
訂正 &?[a-zA-Z]=([a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9])|([a-zA-Z]?)
>>530 あー、なるほど!1文字ずつ指定していけばいいのか。
まとめてやろうとしたからダメだったっぽいです。
今後は繰り返し何タラとかも覚えていきます。ありがとうでした。
パズルとしては面白いかもしれんが、無理に正規表現の 置換でやろうとせずに一度ばらしてから組み立てた方が 見通しがいいと思うけどな。
533 :
nobodyさん :2005/07/22(金) 11:54:34 ID:kQk294zK
URLエンコードされた文字を正規表現で表すとどんなん?
>>533 /\+|%[0-9A-Fa-f]{2}/
試してないけど。 RewriteRule ^/(%[0-9A-Fa-f]{2}|\+|[0-9A-Za-z_.-])+/$ /search?q=$1
>>538 それも試しましたがダメでした。むー、原因が分からん。
でも試行錯誤しているうちに正規表現が楽しくなってきた。
>>537 それって、本当にマッチしてない?
正規表現の問題じゃなくて mod_rewrite 側で問題があるような希ガス。
だな。 まずは rewrite_log を出して確認してみるとか、 もっと緩いルール、例えば ^/(.+)/ /q=$1 あたりから始めてみるとか。
543 :
nobodyさん :2005/07/22(金) 19:59:19 ID:Hy++Zfid
>>540 ギンギラギンにさりげなく さりげなく生きるだけさ〜♪
えーとURLエンコードで悩んでいるモノです。
自宅のApacheでログをみたところ、何やら文字化けを起こしているようです。
http://localhostp/%A5%CA%A5%A4%A5%AD/ ↓
File does not exist: c:/public_html/・ハ・、・ュ/
%A5%CA%A5%A4%A5%AD が ・ハ・、・ュ と文字化けしてしまうようです。
原因分かりますか?
>>544 スレ違い。文字コードについて勉強しろ。
>>545 ごめん、ログファイルの文字コードが違っていただけで
エラーとは無関係でしたOrz
547 :
nobodyさん :2005/07/23(土) 17:44:37 ID:2bOgW3d1
aからz 0から9 それとアンダーバー使いたいときに ([0-9A-Za-z_]+) って書いたらうごくんだけど、これって正しい書き方?
549 :
547 :2005/07/23(土) 23:22:51 ID:???
あちこち捜したんですが、うちの詳説正規表現がなくなって、 どこに行ったかわかりません。スレ違いかも知れませんが、 ポインタだけでもお示しいただければ幸いです。
ふとんの間に挟まってる
>>551 真っ先に布団を捜したんですがありませんでした。
あれを家から持ち出すはずがないので、空き巣にでも
入られたんじゃないかと心配になってきました。
通な空巣だよな。
こないだケツ拭くのに使ったじゃんお前
555 :
nobodyさん :2005/07/24(日) 15:49:03 ID:vU2XL6go
>>550 おまいの心の中にしまってあるんだよ・・・
>>550 らくだ盆と一緒に枕カバーの中に入れたのを忘れたか?
最近妙に枕硬いな・・・って思わんか?
>>557 人質にするならふくろう本の方だと思われ(w
559 :
550 :2005/07/25(月) 00:40:13 ID:???
お騒がせしてすみません。ありました。トイレの棚の上に
置いてありました。トイレットペーパーなんかを置く棚です。
下痢の時とかトイレに本を持ち込むんでした。
>>554 あれは確か、Perlで作るCGI入ry
スレ汚し申し訳ありませんでした。「単語境界とは何か」
ということについて、これからじっくり考えてみます。
561 :
560 :2005/07/25(月) 09:12:21 ID:???
ごめ。 間違えた。
562 :
nobodyさん :2005/07/27(水) 03:13:00 ID:rvBHMPTm
phpのpregです。文字列を空白で分割して、空でない要素のみ 配列に格納します。 $array = preg_split("/\s/", $string, -1, PREG_SPLIT_NO_EMPTY); この時、空白だけではなく 「英数字か記号1字で、前後が英数字でない文字」 も区切り文字として正規表現に加えたいんですが、どういう風に 書けばいいでしょう? お願いします。
/(?<=[^A-Za-z0-9])[\x00-\x7f](?=[^A-Za-z0-9])/ とか? 「英数字か記号1字で、前後が英数字でない文字」 だと記号は全部消える気がするんだけどいいのかしら。 "記号"は"文字"の中に含まれない、ってことかな?
564 :
562 :2005/07/27(水) 15:16:57 ID:???
>>563 すいません、説明がダメダメでした。英数字でも記号でも、
1字のみの場合は空白と同じ扱いにしたいということです。
$string = "This is a pen."; なら
Array ( [0] => This [1] => is [2] => pen. )
$string = "A to Z"; なら
Array ( [0] => to )
$string = "15 - 9"; なら
Array ( [0] => 15 )
$string = "YOMIURI ON-LINE"; なら
Array ( [0] => YOMIURI [1] => ON-LINE )
という具合です。なんだかよくわからなくなってきました。
えー。 /(?:^|\s+).(?:\s+|$)|\s+/ ↑こういうのとは違う? "A to Z" は [0] => to にならないよ。
566 :
562 :2005/07/27(水) 17:14:16 ID:???
>>565 ありがとうございます。えーと、先に挙げた例でうまくいかないのは
"A to Z"ではなく"15 - 9"が
Array ( [0] => 15 [1] => 9 )
となるわけですが、これって /(?:^|\s+).(?:\s+|$)|\s+/ の前の方の
表現で" - "がマッチして、残りの9はマッチしなくなるんですね?
"1 2 3 4 5"でやってみると
Array ( [0] => 2 [1] => 4 )
となります。こういう時ってどこで勉強したらいいんでしょうか?
なんかもう頭が泥沼です。
あ、そうか、正直すまんかった。 /(?:^|\s+|(?<=\s)).(?:\s+|$)|\s+/ でどうよ?
いや、こうか。 /(?:(?:^|\s+|(?<=\s)).(?:\s+|$)|\s+)+/ 何度もスマン。
569 :
562 :2005/07/27(水) 18:20:12 ID:???
>>568 いえいえ、何度もありがとうございます。期待した通りの
結果が得られたのですが、表現がそこまで行くと私には
魔法の呪文としか理解できなくて、もしよろしければ少し
解説いただけませんでしょうか?
(?:...) が、グループ化、ということはわかったのですが、
(?<=\s)) というのは何でしょう? たびたび恐縮ですが
正解を教えてもらうだけでなく、表現の中身も理解して、
自分で解を導けるようになりたいです。お願いします。
571 :
562 :2005/07/27(水) 22:39:51 ID:???
>>570 ありがとうございます。ちゃんと勉強しないとダメですね。
知らないことばかりです。何度もお世話になりました。
,区切りデータで、データ内に,があった場合は\,のようにしています さらに\,は\\,のようにしています perlでこれを分割したいのですが、 ,に一致して(\\)+,に一致しないものはどう書けばよいのでしょう よろしくお願いします
/(?<!\\),/
早い対応、ありがとうございます
575 :
nobodyさん :2005/07/28(木) 12:08:05 ID:MIm3P7gz
GETで吐き出されたURLを置換したいのです。 ?A=1111&B=2222&C=33&D=444 から「=」と「&」と「?」を抜き取りたい。 (A1111B2222C33D444 みたいな感じ) それだけなら何とか今の知識で大丈夫なのですが、 このAやらBやらが毎回この順番でなるわけではなく、 しかも出現したりしなかったりするわけです。 ?B=2223&A=1111&D=444 とか ?C=33&A=1111 のようになることもあります。 うまいこと置換する方法を教えて下さい。
へ? /[=&?]/g でいいんじゃないの? perl なら tr/=&?//d;
出現順も置き換えるのはここでは取り扱えないんでないかの
mod_rewriteを使ってのURL書き換えだったんだけどけど、
色々悩んでいるうちに解決しちゃいました。
>>576-577 さんありがd
一応はっとく ^(?:(A)=(\d+)|(B)=(\d+)|(C)=(\d+)|(D)=(\d+)|[^?&]+|[?&])+$⇒$1$2$3$4$5$6$7$8 ?A=123&C=456&B=0&A=2222&F=0000&DUMMY⇒A2222B0C456
1個のcgi内でPOSTを2回したらなぜか改行コードの後に改行コードが1個追加されてました 1回目送られてきたデータをURLデコード後、ハッシュにばらして同じ名前、値でもう1回送ることです 改行コードはまず<br>に変換します その後、<br><br>を<br>に置換したいのすがどのように書けばいいでしょうか? もしくは根本的な解決方法はあるでしょうか?
582 :
581 :2005/07/28(木) 17:03:13 ID:???
自己解決 各<br>の前に0x0dが含まれてた('A`)
色々調べてて\の意味がいまひとつ分からないんだが、 例えば /\"/ と/"/ の違いって一体何ですか?
Perl の話と仮定してよろしい? \ には大きく分けて二通りの意味があって、 1. (主に) 正規表現のメタ文字として使われる文字を、メタ文字でない通常の文字として解釈させる 2. 正規表現のメタ文字でない文字 (英数文字など) に特殊な意味を持たせる その例だと 1. になって、単なる " として解釈されるようになる。 ただ " はもともとメタ文字としての意味はないので、要するに、両者に違いは無い。
perlの話です、すみません "を"に変換する正規表現がサイトによって異なっていたので気になってました ありがとうございます
>>585 記号を見ると脊髄反射で\をつけるんだと思う
テキストエディタが "〜" の中の色を変えてくれるんだけど、 s/"// だと後の色変わっちゃって読みにくいので、s/\"// にしちゃう。
そんなエディタは投げ捨てるんだ!!
589 :
nobodyさん :2005/08/02(火) 23:32:23 ID:Yo8mbngH
PHP4で、特定の文字列が、IPアドレスであるか、 そうでないかの判定を行いたいと思ってます。 $str = "192.168.0.1"; if ( ereg("(\\d+)\.(\\d+)\.(\\d+)\.(\\d+)", $str) ) { echo "入力された文字は、IPアドレスです"; } else { echo "入力された文字は、IPアドレスではありません"; } ↑のようなコードで実行したのですが、どうしても、 IPアドレスであると判断してくれません。 どのようにすれば、IPだと判定してくれるのでしょうか<(_ _)>
>>590 ありがとうございます。Googleで、調べまくっても判らないんです。
なにとぞお願いします・・・<(_ _)>
つ「preg_match」
593 :
589 :2005/08/03(水) 06:12:36 ID:???
>>592 if ( preg_match("(\\d+)\.(\\d+)\.(\\d+)\.(\\d+)", $str) ) {
で良いんですか?しかし、IPと判定されません。
正規表現の部分が間違ってるんでしょうか?
まず ereg の場合、 POSIX regex に \d は無いので、[0-9] か [[:digit:]] を使う。 あと、ダブルクオート文字列内のバックスラッシュのエスケープには注意。 \. とか。 preg_match の場合は正規表現の記述が独特だね。 ereg("([0-9]+)\\.([0-9]+)\\.([0-9]+)\\.([0-9]+)", $str) ereg("([[:digit:]]+)\\.([[:digit:]]+)\\.([[:digit:]]+)\\.([[:digit:]]+)", $str) preg_match("/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)/", $str)
一所懸命頑張ってるところアレなんだが、任意の文字列について
IPアドレスかどうか判定するってのに正規表現は適任じゃないだろ。
>>594 の例だと123456.123456.987654.987654なんかでもマッチしちゃうけど、
これはIPアドレスではないよな?
「.」でsplitした結果の配列の要素数は4か?各要素は全て数字で、0〜255の範囲内か?
とか、そういうことじゃん?
いや、規格とか詳しくないので、それで十分なのかどうか断言できないけど、
少なくともpreg_matchひとつで判定できるような代物じゃないと思うわけよ。
596 :
nobodyさん :2005/08/03(水) 18:18:24 ID:M5PNKcG2
preg_match("/^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/", $str)
>>596 無理矢理だな。。。
普通に大小比較して0〜255内かとやった方が良い気が…。
>>596 あー それどっかの技師がjavaでそうやってたな…
599 :
nobodyさん :2005/08/03(水) 21:25:53 ID:M5PNKcG2
>>597 無理矢理だろうが何だろうが、preg_matchひとつで判定できるような代物ですが何か?
つ is_ipaddress()
リネーム用の正規表現を作って欲しいのですが、 フラッシュ[1].jepg フラッシュ[10].jepg フラッシュ[100].jepg フラッシュ[2].jepg ↓ フラッシュ[0001].jepg フラッシュ[0010].jepg フラッシュ[0100].jepg フラッシュ[0002].jepg こう言う正規表現を誰かお願いします。
/usr/local/aiueoというディレクトリがあった場合、"/usr/local/aiueo"じゃないディレクトリにマッチするという 正規表現を教えて下さい。(/usr/local/abcde にはマッチするが、/usr/local/aiueoはマッチしない) apacheの設定で必要なんですが今一分からない、、、orz
事故解決 /usr/local/(?!aiueo) でいいのか・・・間違ってたら教えて下さい
>>602 宿題じゃないです。
学校にも通ってません。
ソフトを教えてもらうスレでソフトは手に入れたのですが、
正規表現を使わないといけないみたいなんです。
断じて宿題ではありません。
>>601 nameryというソフトを使うといいよ。
* 文字列をマッチするところまでは正規表現の責務だけど、 その先のマッチした文字列を書き換えるところは正規表現の責務じゃない。 * そして、書き換えるところの仕様はソフトによってまちまちなので、 ソフト名を示さないと答えようがない。 * さらに、正規表現もソフトによって異なる点が少なくないので、 ソフト名を示さないと答えようがないケースも多い。
すいません、きっと物凄く初歩的な質問なんだと思いますが、 これがマッチしないのはどうしてなんでしょう?お助け下さい。 $ua = "Opera 8.01 [ja]"; preg_match("/Opera 8\.01 \[ja\]/i", $ua)
611 :
610 :2005/08/13(土) 10:36:32 ID:???
自己解凍しました。OperaのUAは"Opera 8.01__[ja]"と スペースをふたつ吐いてました。 ↑
613 :
612 :2005/08/28(日) 20:23:16 ID:???
すみません、ageるのを忘れていました
preg_match_all( "/(<a href=\".\/)(.*)(<\/a>)/i", $str, $val); これじゃだめなの?
615 :
612 :2005/08/28(日) 21:12:17 ID:???
>>614 説明不足で申し訳ありません
a要素は勿論、HTMLタグ自体含まれないテキストファイルから抽出したいのです
/s?age\.を/s\?age\.こうしたら?
+が不要。取りなよ。
618 :
617 :2005/08/28(日) 21:47:13 ID:???
量指定子は {10} があるでしょ。+は要らない。 ほんとに10桁なら、それでOK。
>>616-618 ありがとうございます
sageではじまるURLの件を除いて、期待通りの動作が確認できました
未熟なので好ましくないコーディングをしている部分がありますが
日々精進していきたいと思います
sageではじまるURLの件ですが、sageではじまる場合、hostの部分も微妙に1文字 異なるというのが原因でした 皆様本当にお騒がせしました・・・
621 :
nobodyさん :2005/08/31(水) 08:41:15 ID:Ym1OpgcO
VBScriptのRegExpなんですが、メールアドレスを表す正規表現が [\w\.-]+(\+[\w-]*)?@([\w-]+\.)+[\w-]+ と手元の本に書いてありました。 でもこれの意味がよく分かりません。 どなたか解読していただけないでしょうか? あと上のメールアドレスの正規表現に !#$%&`+-'^{} の文字も使えるようにするにはどうすればいいんでしょうか? よろしくお願いします。。。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」 ―――――――――――――‐┬┘ .| ____.____ | | | | | | | ∧_∧ | | | |( ´∀`)つ ミ | | |/ ⊃ ノ | | 手元のクソ本  ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ |
すみません、質問させて下さい。
javascriptで 通常のdatを かちゅ〜しゃdatに変換するコンバータを作っています。
http://www.geocities.jp/mirrorhenkan/katu/ ある程度出来たのですが、2点ほどつまづいています
「&gt;1-2」などがマッチした場合は
「<a href="h
ttp://hoge.com?bbs=hoge&st=1&to=2 ">&gt;1-2</a>」
と置換したいので
<script>
test = "これ&gt;1-2です そして&gt;10-20です あと&gt;200-300も";
test = test.replace(/(&gt;)(\d+)(-)(\d+)/g,"<a href=\"
http:\/\/hoge.com?bbs=hoge&st=$2&to=$4\ ">$1$2$3$4</a>");
document.write(test);
</script>
という正規表現をjavascriptで組んでみたら
ちゃんと動作するのですが、
http://www.geocities.jp/mirrorhenkan/katu/ で同じようにやると、
数字が一桁づつの時は動作するのですが
「&gt;99-100」とか「&gt;100-200」等の時には
それぞれ
「〜st=9&to=9">&gt;9</a>9-100」
「〜st=10&to=10">&gt;10</a>0-200」
のようになってしまいます。
もし宜しければ正規表現のおかしい箇所を御指導頂けないでしょうか。
上記ページの該当部分はこちら↓です
line[3] = line[3].replace(/([^>\;]|^)(&gt;|&gt;&gt;|>|>>|≫)(\d+)(-)(\d+)([^<]|$)/g,"$1"+sp1+"$3"+sp2+"$5"+sp3+"$2$3$4$5<\/a>$6");
$3と$5に数字が格納され、URL部分は「sp1+"$3"+sp2+"$5"+sp3」になります。
蛇足です クライアントサイドのスクリプト(javascript)を使ってはいますが 正規表現の問題だろうと思い こちらに投稿しました。 あと 最初、間違えて(と書いたら失礼ですが)プログラム板の正規表現スレに 質問したのですが、反応がないので改めてこちらでお願いさせて頂きたく思います。 お詫びという訳でもありませんが、正規表現スレの過去ログです(IEと専用ブラウザ限定ですが)
「xxx1x (17)」とあって17だけ取得するにはどうしたらいいのですか? /[^\d]/で行けると思ったのですが117となってしまいました。 宜しくお願いします。
正規表現だけ覚えても役に立たない? 何だか楽しそうだから勉強してみたいんだが。
>>626 \((\d+)\)
Perlだと s/[^\d]//g; なんて置換しない限り117にはならない。
>>627 正規表現環境が用意されているエディタやファイラでも大体そのまま使えるよ。
>>623 その「該当部分」がおかしいわけではなくて、一連の replace() うちで、
一番最初のに先にマッチしてしまっているのがまずいんじゃないかな。
ちょっとまだ考え切れてないけど、 replace() を並べる順番を逆にして、
一番複雑なパターンからマッチを試行していくようにするとか、
あるいは、頑張って正規表現を一つにまとめて一度で replace するようにするとか。
>>627 何だか楽しそうだから始めるっていうのは動機として全然アリなんじゃないかと。
630 :
623 :2005/09/06(火) 20:37:04 ID:???
replaceを並べる順番を逆にしてみたら、望む結果が得られるようになりました。
何でそうなったのか、後でじっくり考えてみようと思います。
>>629 さん、ありがとうございます。
もう一つ質問してもいいでしょうか。
「&gt;1」や「&gt;50」等のように
レス番に全角数字を使っている場合、
URL該当部分だけ半角数字にする正規表現は何か考えられるでしょうか。
例えば
<script>
test = "これ&gt;1-2です";
test = test.replace(/(&gt;)(\d+)(-)(\d+)/g,"<a href=\"
http:\/\/hoge.com?bbs=hoge&st=$2&to=$4\ ">$1$2$3$4</a>");
document.write(test);
</script>
の場合、
「これ<a href="
http://hoge.com?bbs=hoge&st=1&to=2 ">&gt;1-2</a>です」
と表示されますが、
URL表示部分の数字を半角にしたいのです。
javascript寄りの質問になってしまっていたら、申し訳ありません。
もし宜しかったらお願い致します。
>>630 \dが全角数字にもマッチするってどのブラウザ?
WinIE6では再現できなかった。[0-9]ならできたけど。
とりあえず全角数字部分をescapeして
"0"→"%uFF10"→"0"
"9"→"%uFF19"→"9"
みたいに末尾1字取れば一応半角に戻る
"630".replace(/0/g,'0').replace(/1/g,'1').replace(/2/g,'2').replace(/3/g,'3').......
でもいいけど。他にもっといい方法あるかも。
url = "
http://hoge.com?bbs=hoge&st=1&to=2 ";
url = url.replace(/([0-9])/g, function(){return escape(arguments[1]).substr(5)}));
// 参考:JavaScript質問スレ40-237
632 :
nobodyさん :2005/09/07(水) 00:29:44 ID:CuTS4a6v
質問です。Perlで、 (foo)(bar)(hoge) のような文字列のときに、それぞれの括弧とその中身にマッチさせるにはどうすればいいでしょうか。 どうしても一番外側の括弧一つだけしかマッチできません。
>>633 こ、こんな簡単にできるとは……恥ずかしい……
ありがとうございます。
636 :
nobodyさん :2005/09/07(水) 05:59:43 ID:L++YBOi9
637 :
623 :2005/09/07(水) 19:44:49 ID:???
>>631 すみません、ごちゃごちゃしてて書き換え忘れてました。[0-9]です。
escapeを教えて頂いてありがとうございます。
ただ、URL部分だけを半角数字にするにはどういう方法があるのだろう・・。
例えば
<script>
url = "1番目のレスは<a href=\"
http://hoge.com?bbs=hoge&key=0123456789&st=551&to=552\ ">&gt;551-552</a>です";
url = url.replace(/([0-9])/g, function(){return escape(arguments[1]).substr(5)});
document.write(url);
</script>
とやると、URL以外の数字も半角になってしまいます・・。
638 :
623 :2005/09/07(水) 19:51:37 ID:???
それと、レスアンカーを連続させたものを変換させると
アンカーが飛び飛びについてしまいます
<script>
line = "&gt;2 &gt;3 &gt;4 &gt;5 &gt;6 &gt;7-8 &gt;90-100 >100-200";
sp1 = "<a href=\"
http:\/\/server.2ch.net/test/+read.cgi?bbs=board&key=123456789&st= ";
sp2 = "&to=";
sp3 = "&nofirst=true\" target=\"_blank\">";
//半角レス番
line = line.replace(/([^\;]|^)(&gt;|&gt;&gt;|>|>>|≫)(\d+)(-)(\d+)([^<]|$)/g,"$1"+sp1+"$3"+sp2+"$5"+sp3+"$2$3$4$5<\/a>$6");
line = line.replace(/([^\;]|^)(&gt;|&gt;&gt;|>|>>|≫)(\d+)([^<-]|$)/g,"$1"+sp1+"$3"+sp2+"$3"+sp3+"$2$3<\/a>$4");
//全角レス番
line = line.replace(/([^>\;]|^)(&gt;|&gt;&gt;|>|>>|≫)([0-9]+)(-|\−|\ー)([0-9]+)([^<]|$)/g,"$1"+sp1+"$3"+sp2+"$5"+sp3+"$2$3$4$5<\/a>$6");
line = line.replace(/([^>\;]|^)(&gt;|&gt;&gt;|>|>>|≫)([0-9]+)([^<-]|$)/g,"$1"+sp1+"$3"+sp2+"$3"+sp3+"$2$3<\/a>$4");
document.write(line);
</script>
実行させると
レスアンカーが一つ飛びについてない状態です
何故だ・・・
>>638 半角レス番と全角レス番分けないで一回で置換しないと。
<script>
line = ">2 >3 >4 >5 >6 >7-8 >90-100 >100-200";
sp1 = "<a href=\"
http:\/\/server.2ch.net/test/+read.cgi?bbs=board&key=123456789&st= ";
sp2 = "&to=";
sp3 = "&nofirst=true\" target=\"_blank\">";
line = line.replace(/(>|>>|>|>>|≫)([0-90-9]+)(-([0-90-9]+))?/g, ""+sp1+"$2"+sp2+"$4"+sp3+"$1$2$3<\/a>");
document.write(line);
</script>
これでいいのかな?
まだハイパーリンクに仕込む番号は半角化しないとならないな。
アンカー開始記号は (>|>>|>|>>|≫) じゃなくて (>>|>|>>|>|≫) みたいにして長い方のパターンを先にしなきゃダメじゃない?
>>641 順番は関係ない。
どうせ非決定性オートマトンになった時、同じ状態からヒモが伸びるだけ。
あ、なんか変な勘違いしてた。スレ汚しスマソ。
645 :
623 :2005/09/08(木) 20:11:30 ID:???
>>639-640 半角全角の数字をまとめて出来るとは知りませんでした・・
ただ
「&gt;1」のようにレス番が単独のものと
「&gt;1-2」のようにレス番がまたがるものがあるので
それを一度に置換させる方法があるでしょうか。。
「&gt;1」の場合 →「〜&st=1&to=1〜」
「&gt;1-2」の場合→「〜&st=1&to=2〜」
と、「to=××」の部分に入れる部分が異なるので
今のところは二つに分けているのですが・・・。
全角数字と半角数字をまとめてみました↓が、やはりアンカー飛び飛びだ・・・
<script>
line = "&gt;2 &gt;3 &gt;4 &gt;5 &gt;6 &gt;7-8 &gt;90-100 >100-200";
sp1 = "<a href=\"
http:\/\/server.2ch.net/test/+read.cgi?bbs=board&key=123456789&st= ";
sp2 = "&to=";
sp3 = "&nofirst=true\" target=\"_blank\">";
line = line.replace(/([^\;]|^)(&gt;|&gt;&gt;|>|>>|≫)([0-90-9]+)(-|−|ー)([0-90-9]+)([^<]|$)/g,"$1"+sp1+"$3"+sp2+"$5"+sp3+"$2$3$4$5<\/a>$6");
line = line.replace(/([^\;]|^)(&gt;|&gt;&gt;|>|>>|≫)([0-90-9]+)([^<-]|$)/g,"$1"+sp1+"$3"+sp2+"$3"+sp3+"$2$3<\/a>$4");
document.write(line);
</script>
>>640 さんのように、正規表現を一つにまとめないと駄目みたいですね。。
だから([0-90-9]+)(-([0-90-9]+))?の?は、 後半があれば必ず長い方に一致させるから 心配しなくていい。 前後の([^\;]|^)や([^<-]|$)が、lineに格納されたスペースを食っちゃってる ようだけど。
647 :
646 :2005/09/08(木) 20:32:18 ID:???
あ、そうかto=にも同じ番号入れるんですね。 間違えた。
>>646 も指摘しているけど、前後のパターンは要らないと思う。何でそれ付けてるの?
document.write("<xmp>"); document.write(line); としてみたらやっと気付いたけど、今のままでも 2回目の置換では<a href="...">2</a>とかタグの終了の> 置換してるのが原因だな・・・
<script>
line = ">2 >3 >4 >5 >6 >7-8 >90-100 >100-200";
sp1 = "<a href=\"
http:\/\/server.2ch.net/test/+read.cgi?bbs=board&key=123456789&st= ";
sp2 = "&to=";
sp3 = "&nofirst=true\" target=\"_blank\">";
line = line.replace(/(>|>>|>|>>|≫)([0-90-9]+)(-([0-90-9]+))?/g,
sp1 + "$2" + sp2
+ ("$4" ? "$2" : "$4")
+ sp3 + "$1$2$3<\/a>");
document.write(line);
</script>
ではこれでどう?
651 :
650 :2005/09/08(木) 20:47:45 ID:???
間違った。だめだorz
652 :
623 :2005/09/09(金) 19:15:40 ID:???
よく考えたらレス番数字の正規表現はこのままだと
「>132」等の全角半角混じりでもあてはまってしまうので
([0-9]+|[0-9]+)
でした。。
>>646 >>648 2chの生datをかちゅ〜しゃdatに変換しようとしているのですが
生datを見てみると、レスアンカーは
例えば「&gt;&gt;1」だと
「<a href="../test/read.cgi/server/0123456789/1" target="_blank">&gt;&gt;1</a>」
となっているので、それらを除外させる為に前後につけています。
その正規表現も正しいのかどうか・・。
あと すみません、
>>640 さんや
>>650 さんのものだと
例えば「>90-100」だと
「〜&st=90&to=90&nofirst=true〜」となってしまうのです
望む結果は「〜&st=90&to=100&〜」なのです・・
何だか駄々をこねてるみたいで申し訳ないです・・。
653 :
650 :2005/09/09(金) 20:44:02 ID:???
うまくいかない物を貼ってすいません。
今度は大丈夫だと思います。
<script>
line = "&gt;2 &gt;3 &gt;4 &gt;5 &gt;6 &gt;7-8 &gt;90-100 >100-200";
sp1 = "<a href=\"
http://server.2ch.net/test/+read.cgi?bbs=board&key=123456789&st= ";
sp2 = "&to=";
sp3 = "&nofirst=true\" target=\"_blank\">";
function toascii(s) {
dest = "";
for (i = 0; i < s.length; i++) {
ch = s.charCodeAt(i);
654 :
650 :2005/09/09(金) 20:45:42 ID:???
if (ch >= 0xff10 && ch <= 0xff19) dest += String.fromCharCode(ch - 0xff10 + 0x30); else dest += s.charAt(i); } return dest; } function replacefunc(m) { if (m.match(/(&gt;|&gt;&gt;|>|>>|≫)([0-90-9]+)([-−ー]([0-90-9]+))/)) { return m.replace(/(&gt;|&gt;&gt;|>|>>|≫)([0-90-9]+)([-−ー]([0-90-9]+))/, sp1 + "$2" + sp2 + "$4" + sp3 + "$1$2$3<\/a>" ).replace(/(st|to)=[0-90-9]+/g, toascii); } else { return m.replace(/(&gt;|&gt;&gt;|>|>>|≫)([0-90-9]+)/, sp1 + "$2" + sp2 + "$2" + sp3 + "$1$2<\/a>" ).replace(/(st|to)=[0-90-9]+/g, toascii); } } line = line.replace(/(&gt;|&gt;&gt;|>|>>|≫)([0-9]+|[0-9]+)([-−ー][0-90-9]+)?/g, replacefunc); document.write(line); </script>
655 :
651 :2005/09/10(土) 11:01:20 ID:maA6hdJk
preg_match("/^(x83[\x40-\x96]|\x81\x40|\x81\x5B)+$/", $nnn ) PHPで全角カタカナとハイフンと全角スペースだけを通したいんだけどこれ間違えてる?
656 :
623 :2005/09/10(土) 19:09:02 ID:???
>>653-654 の
>>650 さん
すみません、後でじっくりやってみます・・・。
正規表現の内部(?)でも javascript使えるんですね。
>>655 preg_match("/^(\x83[\x40-\x96]|\x81\x40|\x81\\x5B)+$/", $nnn )
にしたら動いた。
\x5bは'['に当たるからエスケープしないとダメ
html-lintって正規表現の塊?
公開してるからソース読んでみろ
660 :
nobodyさん :2005/09/14(水) 09:43:56 ID:krHmg2tG
詳説正規表現って何処に売ってるの? 近くの本屋になかった。
新宿の紀伊国屋なら売ってそうだけど。 立ち読みする必要ないなら通販で買えば。
オライリーの本置いてある書店は
そこそこでかいとこか、技術書みたいな本が置いてあるようなとこくらい。
オライリーが置いてあるとこでも、全部置いてあるわけじゃないから
>>661 の言うように中身確認する必要がなければ通販で買っちゃうのが手っ取り早いかも。
紀伊国屋とかならネットで在庫確認出来るから、利用するのもアリ。
ヨドバシとかビックでも買えるね。
ジュンクを忘れていませんか
大学生協行けよ。
まあまずはおめーはどこに住んでんだっつー話だな。「近くの」じゃ何とも言えんし。
660さんにげてー
Perlにて、正規表現によるマッチングを使おうとして、 $temp[7] =~ /(*.)時(*.)分/; と使うと、以下のようなメッセージが出ます。 Quantifier follows nothing in regex; marked by <--HERE in m/(* <--HERE .)時(*.)分/; at sub2.pl line 161. 初めてでるエラーメッセージなので憶測ですが、HEREで示されたメタ文字[*]が、掛け算の演算子と間違えて認識されているのでしょうか? 文字コードはShift_JIS、開業コードはCR+LFです。ぜひアドバイスお願いします。。。
.*
>>669 ぐおおおおお、本当ですね…
こんな簡単なことでスレ汚してすいません… 回線切ってこのプログラム仕上げてから首吊ってきます…
翻訳サイトの使い方くらいは知っとこうね。
>>661-667 ありがとう!
熊谷で売ってなくて、大宮のそごうでも売ってなくて、結局新宿の紀伊国屋まで行ってきたよ。
半端じゃない数だな…。
何が半端じゃない数なの?
ああなるほど。 ところで、最近正規表現の入門的な書籍がたくさん出てきてるみたいだけど、 プログラミングや正規表現の初心者向けに一冊すすめるとしたらコレ、 っていうのは何かある?
詳説くらいの内容を必要としないなら、ネットの解説サイトの類で事足りる気がしなくもない
PHPで正規表現を使った置換について質問です。 3以上の数字が、特定の文字列(Xとする)の後に来た場合にマッチさせ置換します。 数字は全角でも半角でもマッチとし、マッチした部分を\\1後で使います。 数字は二桁までを範囲とします。 $pattern = "/X([0-9]?[3-9]|[0-9]?[3-9])/"; preg_replace ("$pattern", "X<span class=\"level\">$1</span>", $aaaa); これだとうまくマッチしないのですが、何が原因でしょうか。
10以上で一の位が0〜2になってる数がヒットしないよなそれ。
(?:[1-9][0-9]|0?[3-9]) とかじゃねー?
>>671 数量詞はregexで何にも続きません; --<によってマークされて、m/(*<--HERE。)時(*)分/のHERE; sub2.plに、161を裏打ちしてください。
なんか、php で正規表現ほげる場合って、二重に囲まんといかんから面倒だな。 "/^fuckyou$/"
シングルクォートで囲むと少しはマシになるよ
少しはとは? 表現のなかに ' やら " が出て来た場合面倒杉。
684 :
nobodyさん :2005/09/19(月) 18:50:05 ID:XLGKZohV
↓こんな風に、適当な文字列の『』で囲まれた部分に特定の文字(この場合“か”とする)を 含まれたものをヒットさせたいのだが、うまくいかない。 $line =~ /『.*?か.*?』/g; だと、例2のような間に』と『あるやつも引っかかってしまうのだが・・・・・・・わかる人お願い。 例1 $line = "あいうえお『かき』くけこさし『すせ』そ"; →○ 例2 $line = "あい『うえお』かき『くけ』こさしすせそ"; →×
/『.*?か[^『]*?』/
>>683 "で囲むと、$とかもエスケープしなきゃいかんでしょ。その分が少し。
>>677 こういうのよく見るけど、
$pattern を用意して、preg_replace() かける時に
わざわざ再度ダブルクォートで囲うのって
個人的にはちょっと…怖いかも。
副作用がありそうで。
Javaで、文字列をスペース区切りで分割 ただし、"で囲まれた文字列はスペースで分割しない ということをやりたいんだけど、これって正規表現で うまくできる? 例: dir "c:\abc def" ghi jkl dir c:\abc def ghi jkl こんな感じに分割したいです。
690 :
nobodyさん :2005/09/20(火) 23:38:25 ID:pDhdrwjA
できません。
置換に関しアドバイスください。 VK_C, 57634, NOINVERT, CONTROL, VIRTKEY VK_BACK, 57643, NOINVERT, ALT, VIRTKEY VK_F6, 57681, NOINVERT, SHIFT, VIRTKEY VK_Z, 57643, NOINVERT, CONTROL, VIRTKEY これを1 or 2回の置換で下のように編集できるでしょうか? CONTROL C, 57634 ALT BACK, 57643 SHIFT F6, 57681 CONTROL Z,57643 秀丸つかってるんですが、タグつき正規表現に関する知識足りず、 ノーマル置換とExcelでまかなっている現状です。
秀丸つかったことなけど普通に VK_([^,]+),\s+(\d+),\s+[^,]+,\s+([^,]+).*$ → \3 \1, \2 で駄目なの?
>>682-683 エスケープが嫌ならヒアドキュメントで変数に代入してからreplaceに放り込めばいいじゃない
>>692 ありがとうございます。ただ少し手直し必要だったので、一応のせておきます。
検索 VK_\f[A-Z0-9]+, [0-9]{5}\f, [A-Z]+, \f[A-Z]+\f,.+
置換 \3 \1
でも意味はあまり理解してません。
@n →@n-1 Vn →Vn/2 例 @1 →@0 V127 →V63 V63→V31 V31→V15 というように、@とVに続く数値をそれぞれ「-1」、「1/2」になるように処理したいのですが、 どのような正規表現を記述すれば良いでしょうか?
696 :
695 :2005/09/23(金) 23:28:24 ID:???
すみません、失礼しました @n →@n+1 例 @0 →@1 の誤りでした。
$1eval($2+1) $1eval($2/2)
698 :
nobodyさん :2005/09/24(土) 01:41:34 ID:PQeiuh7H
perlにて $valに含まれる"a"全てを"ab"に置換する $val = "aaa"; $val =~ s/a/ab/g; print "Content-type: text/html\n\n"; print "$val"; /gというのは繰り返しということですが、 どのような繰り返しなのか理解できていません 1.置換前$valを把握し、参照するというような形で文字を繰り返し置換する 出力結果 ababab 2.毎回$valの最初から繰り返し置換していくので 置換後の"ab"にも"a"が含まれているので永久ループになる 出力結果 aaaaa.......................... (永久に終らず) 1を望んでいるのですが2だった場合が怖くて試せません 実際はどのような結果になるのでしょうか? もし2だった場合は実際どのように記述すればいいのかご教授してくれると助かります
>>698 まず最初の "a" に /a/ がマッチして "ab" に置換したら、
次は $val 中の次の文字 (2文字目の "a") から /a/ のマッチを開始する。
というのを繰り返すので、 2. にはならないから安心しる。
2. だったら怖くて誰も /g を使いたがらない罠。
700 :
nobodyさん :2005/09/24(土) 02:02:00 ID:PQeiuh7H
698です
>>699 永久にはならないのですね、安心しました
これでまたいろいろ試せそうです
早い解答どうもありがとうです
701 :
695 :2005/09/24(土) 03:26:00 ID:???
>>697 すみません、これFlexRenamerなどで置き換えリストを作る場合、
ファイル名置換指定: $1eval($2+1) or $1eval($2/2)
にするとして、
ファイル名検索指定: の文字列はどのように入れればいいんでしょう?
702 :
695 :2005/09/24(土) 03:43:59 ID:???
あと、検索条件なんですが、文字列が @に続く数値 Vに続く数値 に特化して計算処理をさせたい次第です。 @、V 以外に続く数値(TやOなど)もテキストファイル中に含まれるのですが、 それらの数値はそのままにしておきたいのです。
>>701 > すみません、これFlexRenamerなどで置き換えリストを作る場合、
おいおい、どんな言語やソフトを使ってるかは先に言えっつーの。
で、 Flexible Renamer ってのを見てみたけど、
ファイル名置換指定で -1 とか 1/2 とかいった演算はできないみたいね。
何か適当なスクリプト言語か何かで処理した方が良さそう。
正規表現に関するメールマガジンとかある?日本語で。 メールじゃなくても郵便でもいいや。
郵便てキミ…
regexはなんと読むのですか。
フェデックス
708 :
nobodyさん :2005/09/26(月) 01:14:20 ID:AIxnVq6m
すみません、置換ソフト「Repl-Ace」で正規表現置換を行いたいのですが どうしてもうまくいきません。どう書けばいいでしょうか。 やりたいこと <HTML>で始まり、<!--ここまで-->で終わる部分を削除する。 この区間に含まれる文字や文字数は不定、日本語アリ。複数行。 書いてみてダメだった表現 <html>.*--ここまで--> ←処理されない .*--ここまで--> ←<html>からの処理ではない。<!--ここまで-->のある行だけ削ったようだ <html>[\s\S].*<!--ここまで--> ←処理されない Perlメモとか読んでみましたが、・・・ごめんなさい見方がわからない(というか理解が?) このソフトについているリファレンスを見てやってます。
709 :
708 :2005/09/26(月) 01:27:01 ID:???
置換したいのはこんな文字列です。 <HTML> <head> <meta http-equiv=Content-Type content=text/html; charset=Shift_JIS> <title>test</title> </head> <body bgcolor="#000000">hogehoge<!--ここまで--> test</body></html>
.が改行にマッチしてないのかな?そんなオプションない?
>>708 こんなんでどうでしょ?
<HTML>[\S\s]+<!--ここまで-->
>>708 そのソフトは大文字小文字無視という設定無いみたいね。BBSでやっと見つけた。
>>712 最短マッチを否定の最長マッチに置き換える手があるよ
/<A HREF=([^ >]+)[^>]*>([^<]+)<\/A>/
'/' をエスケープして "\/" とかやってるやつはばかです。
m!/! とかやれ、って話だったらヘソで笑っちゃう
718 :
712 :2005/09/26(月) 20:15:43 ID:???
>>713 無事できました。そんな書き方を初めて知りました。サンクス。
719 :
708 :2005/09/26(月) 22:12:35 ID:???
>>710 オプションは「マルチラインモード」っていうのがありますが
マッチしてないです。
・・・って、
>>711 できました。ありがとう(T△T)
720 :
711 :2005/09/26(月) 22:26:07 ID:???
>>713 そうそう。探したんだけど見つからなかった。
もし大文字でも小文字でも動くようにするなら、めんどくさいけどこうかな。
<[Hh][Tt][Mm][Ll]>[\S\s]+<!--ここまで-->
>>719 ドキュメントを見る限りだと、「マルチラインモード」は、
^ (行頭) と $ (行末) の処理にしか反映しないっぽいのよね。
面白い話があるからおまいら聞いてくれ。 彼女が医療関係の学校に通ってるんだが、実習か何かで精神 障害者の施設へ行ったそうなんだ。それが終わって会った時に、 単なる会話として「大変だった?」とか訊いてたら、「あなたと同じ 本を読んでる患者がいた」って言うんだよ。隠してあったエロ本が 見つかったのかと動揺してたら、「あれだよ、表紙に動物の絵が 書いてあるコンピュータの」って言うから、オライリーのを順番に 見せていったら「それそれ! フクロウのやつ」だって。 施設の人が言うには、その患者は絶対にその本を手放さないし、 取り上げると錯乱するからずっと持たせてあるんだってさ。
な・・なぜにあの本を・・・? よっぽど正規表現が好きな人だったんだな・・彼(彼女)に足を向けて寝れない。福岡から見た方角を教えてくれw
>>721 自閉症っぽいね
知能の離れ小島といってある特定分野だけすごく集中して記憶している
こうやって、自閉症に関するデマが面白半分に広められていく・・・ ヒトの不幸は密の味ですな。
特定の物に対するこだわりの強い自閉症はあるよね。 本を抱えているからといって中身を理解しているとは限らないわけで 単純に絵が気に入っているのかもしれない。
726 :
721 :2005/09/30(金) 19:21:05 ID:???
>>722 いやいやw、みんなも気をつけてくれと言いたかった。
マッチがどうしてもうまくいかない時は、精神的にも
肉体的にも参ってしまうことがあるだろう?
>>725 SEとかそういった職業に就いていたことは聞いたそう。
当然ながら施設の人は(医師さえも)、「正規表現」が
何なのかも知らないわけで、彼の話を理解してくれる
相手がいないとなるといい環境ではないなと。
ひょっとしたら正規表現でしかコミュニケートできなく
なってるんじゃないか、紙と鉛筆を渡せば正規表現で
意思表示してくれるんじゃないか、などと妄想してみた。
俺、精神障害持ってる。 時間は人より掛かったけど旧帝大の電子工学科卒業してるし、情報処理の資格も持ってる。 が、本業はソフト屋じゃ無く、ハードの設計開発してる。 精神科に入院した事もあるし(2度)、今の会社もそんな事も理解した上で採用してくれた。 君らが、どんだけ精神障害者に偏見持ってるのか、あるいは無知なのかはしらないが、 『こんな風にあげつらって、楽しいのか?』
まぁ俺も閉鎖病棟にぶち込まれた過去を持ってるが、 世の中にはいろんな人がいるんだよね。
スレ違いだし、こんなふうに不快に思うひとも少なからずいるわけで、 このへんでもういい加減やめれ。
730 :
nobodyさん :2005/09/30(金) 21:23:08 ID:??? BE:4356858-###
m|こうやってコミニュケートすればいいのだ!|
精神の障害について周りの人間は常に偏見を持っている or 無知である というのは、それ自体が一種の偏見だな。
>>731 なるほど、
>>726 とかは、正確な知識等に基づいて、精神障害者をあげつらってるわけね。
そりゃすばらしい。
>>732 正規表現スレの住人の割には日本語の読み方が大雑把だな。
単語境界の概念って日本語にはないのか。 難しいね。
141P 4.2.1 例題について そのためツールによっては、 示したもをサポートしていないものもある。 他にもいくつかミスがあったはず。 正規表現を扱う人はミスを見逃さない人ばっかりだと思ってました。
それは明らかに偏見
>>736 こんなとこに書かずに出版社に連絡しろよ。
PHPでの正規表現による置換について質問です。 $xxxregexp = "%<TD WIDTH=\"448\" VALIGN=\"TOP\"><A href=\"(.+?)\">\n(.+?)\n<\/A>%"; $match_count = preg_match_all($xxxregexp, $data, $xxxs); xxxregexpの二つめのグループ内を抽出して出力したいのですが、マッチしないようです。 二つめのグループで抽出するのは日本語なのですが、この場合どのように記述すれば正しいのでしょうか
EUC-JP でこれで試してみたけど取れたよ。 $data = '%<TD WIDTH="448" VALIGN="TOP"><A href="foo"> ほげほげ </A>%'; $xxxregexp = "%<TD WIDTH=\"448\" VALIGN=\"TOP\"><A href=\"(.+?)\">\n(.+?)\n</A>%"; $match_count = preg_match_all($xxxregexp, $data, $xxxs); print($xxxs[2][0]);
ちなみに窓の杜のHTMLなんですが、だめですね…… もう少し考えてみます
あぁ、窓の杜見てみたけど、もしかしたら改行コードかも。 \n じゃなくて \r\n とか \r?\n にしてみたら?
あー\r\nで出来ました。ほんとこんな単純な事で悩ませて済みません ありがとうございます orz
NOn または Non NOff または Noff という文字列を正規表現で検索させる場合は [N][Oo](n|ff) こんな感じじゃ駄目なんですかね?
最初のNは普通にそのままじゃ駄目かしらん。 N[Oo](n|ff)
fgggfffggg gfgfgfgfff みたいに10桁の二つの文字列にマッチするにはどうしたらいいでつか?
>>748 不定の2種類の文字で構成されているってことだろうから
^(.)(\1*)(.)(\1|\3)*$
ただしこれは10文字以外でもマッチするからそれも入れるなら面倒そうだ
src属性の値を抜き出したいのですが、 jpg以外が混じってるとうまくいきません。 どうすればいいのでしょうか? /<img\s.*?src="(.*?\.jpg)".*?>/i <img SRC="test_01.gif" /> <IMG src="test_02.jpg" border="0"> <img alt="test" src="test_03.jpg" />
jpgって正規表現に入ってるんだからjpg以外だとうまくいかないのはあたりまえだろwww
すみません。説明不足でした。 /<img\s.*?src="(.*?\.jpg)".*?>/i だと、 【<img SRC="test_01.gif" /><IMG src="test_02.jpg" border="0">】 ↑みたいに余計な部分を含んでマッチしてしまいます。 ↓だけマッチするようにしたいのですが、、 【<IMG src="test_02.jpg" border="0">】
/<img\s[^>]*?src="([^\"]+\.jpg)"[^>]*>/i;
無理ったら無理。入れ子の深さを限定すればなんとか。
無理とか言わないでw 「数行」 ってのは正規表現以外の処理入ってもよくて、例えば、 my $string = 'aa {bb} cc { dd {ee} } ff { gg { hh { ii { jj } kk } ll } mm } nn'; 1 while ($string =~ s/(\{(?>[^{}]*))\{((?>[^\}]*))\}/$1\x11$2\x12/); # 中のカッコを一旦escape while ($string =~ /(\{[^{}]*\})/g) { local $_ = $1; tr/\x11\x12/{}/; # 中のカッコをunescape print $_, "\n"; } これより上手い方法思いついたら教えてほしいのですr
>>758 正規表現以外の処理を前提にするなら、それは正規表現スレで
する質問では無くなるよな。各言語のスレへお行き。
>>759 いや、そりゃそうなんだけど、
もっとうまい正規表現があるかと思って疑問に思った核が正規表現の部分なんだから、このスレでいいかと思ったんだけどな。
perl板に行っても正規表現スレに行けって言われるのがオチなので、ダメなら諦めるわ。
> 正規表現スレに行けって言われるのがオチ そんなことはないと思うけどなあ。 Perl でのアルゴリズムの話でもあると思うので、 厶板 Perl スレあたりで聞いてみるのもアリかと。
外部エンジンを使うんだ
> 外部エンジン 詳しく!
764 :
nobodyさん :2005/10/12(水) 22:20:33 ID:enZtkyi2
正規表現で、半角数字と記号のみ弾く上手い書き方は無いでしょうか? 現在はこんな感じで書いていますが「ー」などを弾いてしまうので困っています。 if( !preg_match("/[0-9\x\-\x(\x)\x[\x\]\x<\x>\x?\x\/\x\.\x\+\x\*\x_\x!\x#\x\$\x%\x~\x\|\x\@\x;\x,\x`\x{\x}]/", $R_um_name1) ){ $ERROR=$ERROR.'エラー<br>'."\n"; }
2chのsubject.txtをスレッドキー、スレ名、件数に分割するにはどうすれば良いのでしょうか? 現在、「.dat<>」と「 (」で分割してるのですが、 0000000000.dat<>スレッドタイトル (レス数) という形式だけでなく、スレ数の括弧が全角だったりするところもありますorz 誰か教えてください
正規表現道場 へ よ う こ そ ! .ノ′ } 〕 ,ノ .゙'┬′ .,ノ ノ } ゙l、 」′ .,/′ .,ノ _,,y .,v─ーv_ 〕 〕 .| .il゙ 《 ._ .,,l(ノ^ノ ,i(厂 _,,,从vy .,i「 .》;ト-v,|l′ _,ノ゙|.ミ,.゙'=,/┴y/ l ,zll^゙″ ゙ミ .ノ .il|′アll! .>‐〕 \ _>< 《 il|′ フーv,_ .,i″ ||}ーvrリ、 ¨'‐.` { \《 ヽ .゙li ._¨''ーv,,_ .》′ ゙゙ミ| ,r′ } \ ,゙r_ lア' .゙⌒>-vzト .ミノ′ 〕 .゙'=ミ:┐ .「 ./ .^〃 :、_ リ .} ゙\ア' .-- ,,ノ| 、 ゙ミ} :ト ゙^ー、,,,¨ - ''¨.─ :!., リ ノ 〔^ー-v、,,,_,: i゙「 } .,l゙ l! .´゙フ'ーv .,y ] '゙ミ | ,/゙ .ミ;.´.‐ .] ミ, | ノ′ ヽ 〔 ミ } } ′ } { .| .ミ .< 〔 〕 .{ \,_ _》、 .{ .} { ¨^^¨′¨'ー-v-r《 〔
>>767 ココは正規表現スレです。詳しい仕様がなければ回答しません。
貴方は調べるのを面倒に感じて投げ出したのに、我々に資料集めからやれと仰るのでしょうか?
オープンソースな2chブラウザのコードを見るという手もありますが、それはこのスレの範疇にありません。
具体的な仕様の提示・スレの移動 の何れかを選択してください。
770 :
nobodyさん :2005/10/13(木) 12:20:37 ID:4gxpiBDK
>>772 foreach($tmp as $value) {
$tmp = split("<>", $value);
if($tmp[0]) {
$thread['key'] = $tmp[0];
list($thread['name'], $thread['res']) = split(" \(", $tmp[1]);
list($thread['key'], $tmp) = split(".dat", $thread['key']);
list($thread['res'], $tmp) = split(")", $thread['res']);
printf("\n<TR><TD><A href=\"%d\">%d</A></TD><TD>%s</TD><TD>%s</TD></TR>", $thread['key'], $thread['key'], $thread['name'], $thread['res']);
}
}
現在は、試行錯誤を繰り返しながら分割でやっているのですが、「 (」がタイトルにあると失敗します。
774 :
773 :2005/10/13(木) 15:32:40 ID:???
適当にやってみたんだけど $tmp = preg_match("/^([0-9]+)\.dat(<>|,)(.*) (\(|(|<)([0-9]+)(\)|)|>)$/", $tmp, $match); でいいのかな・・・ 111111111.dat<>テスト (実験用) (2) Part2 (100) ↓ Array ( [0] => 111111111.dat<>テスト (実験用) (2) Part2 (100) [1] => 111111111 [2] => <> [3] => テスト (実験用) (2) Part2 [4] => ( [5] => 100 [6] => ) )
>>768 は 「それは性器表現だ!」 ってツッコミを期待していたのかな。
gaishutsu desu
777get, zuzaa
>>727 ^(\d+)\.dat<>(.*)(?:\(|()(\d+)(?:\)|))
これで抽出できるはず
質問です。 vbsで2ちゃんのidxファイル内のスレ数が抽出できません。 (\t)\8[^(\t)](\t)\9
.
質問お願いします。 grepで、ファイルから行を抽出したいんですが、 文字列1か、文字列2のどちらかを含む行の条件の指定って どのように書けばよろしいのでしょうか?
>>782 (文字列1|文字列2)
でいいんじゃないか?
grepなら \(文字列1|文字列2\) でした
785 :
782 :2005/11/09(水) 09:49:48 ID:???
>>783 レスありがとうございます。
早速試してみたのですが、どうもうまくいきません。
>>783 だとsyntax errorで、
>>784 だと、
grep \(s1|s2\) file だと、パイプの前後で別のコマンドとして扱われ、
s2):comannd not foundになってしまいます。
環境はCygwinなんですが・・・
相対パスを絶対パスに変換するにはどうすれば良いでしょうか? 言語はPHPです。 出力直前にHTMLを一括で変換しようと思っているのですが、 元のHTMLが汚く、以下のように書き方がバラバラで困っています・・・ <img src="/lib/aaa.gif"> <img src=/lib/aaa.gif> ← ダブルクォーテーションなし <img src='/lib/aaa.gif'> ← シングルクォーテーション <img src=lib/aaa.gif> ← 最初のスラッシュなし
>>786 まず元の HTML の書式を統一させるように変換をかけてから、パスの変換をかけるといいかも。
あるいは元の HTML 自体をあらかじめ直しておくか。
いずれにせよ、一発で全部やるのは効率悪いと思う。
PHPの正規表現なんですが、現在 ([0-9][=+]?) が64個並んでいます。 マッチした()の中身を出力するためなのですが、 ([0-8][=+]?){64} ではダメでした。 何かいい方法はあるんでしょうか?
789 :
788 :2005/11/09(水) 15:42:44 ID:???
>>786 ページパスと相対パスで、絶対パスを出力する関数作って、
そこに切り出してきた相対パスを放り込む作戦はやったことがある。
>>788 下側は ([0-9][=+]?){64} の間違い。
>>788 preg_match_all()じゃだめなのか。
791 :
788 :2005/11/09(水) 16:21:49 ID:???
>>790 存在を忘れてました...orz
吊ってきます
792 :
nobodyさん :2005/11/09(水) 20:45:26 ID:ySyrfo3j
>>792 -をエスケープ汁
[]の中にそのまま書くと左から右までの範囲という意味
-を最後に盛ってきたらいけました。 あと、あげてすみませんでした。
エスケープしてもだめだったんです。
上の例で \- みたいにエスケープすると \-~ となってしまって、
ASCII コードで '\' から '~' までの範囲の意味になっちゃうからかな。
>>794 みたいに文字クラスの先頭 (もしくは最後) に盛ってくるのが無難な希ガス。
eregではそうだったのか…いいかげんなこといってごめん
eregに限らんがな
自分でどこまで試したか努力のあとが見られない質問者には厳しいスレ。
>>799 def.ghi 二度と書き込むな、クズ
ここは道場だ。 入門者はそれなりの覚悟を持って欲しい。
>>799 ではないけどできた。正規表現初心者よりv
804 :
nobodyさん :2005/11/11(金) 13:03:02 ID:BiZLdrp5
11月11日11月12日11月13日・・・と連続している場合、 はじめの11月11日だ毛を取りたいです。 月=>11, 日=>11 教えてくださいませーーー
>>1 の「使用言語や得たい結果をなるべく詳しく書きましょう」が読めない香具師が大勢・・・
>>804 /(\d+)月(\d+)日/ で十分な気が。
807 :
nobodyさん :2005/11/13(日) 03:51:30 ID:0sDXu6D3
>>807 123月0日
にもマッチしちゃうじゃん
費用対効果とか考えたことのない奴が言いそうなことだ。
809 :
nobodyさん :2005/11/16(水) 02:15:16 ID:S0o67+2o
困ってます教えて下さい。><
htmlから正規表現を使って一部分を取得したいのですがちょっと引っかかってます。
言語はPHPなんですがperl等でも理解はできるので宜しくお願いします。
簡単に言うと、例えば・・・
$source = "<a href=
ttp://aaa.com/ >あああ</a>";
と文字列があるとして URLと表示部分を取得するには現在は以下のようにしています。
// = の次から > を含まない全角を含んだ全ての文字が連続する物を取得
// > の次から < を含まない全角を含んだ全ての文字が連続する物を取得
mb_eregi("<a href=((?:(?!>).)*)>((?:(?!<).)*)</a>",$source,$reg);
これで
$reg[1] = "
ttp://aaa.com/ "
$reg[2] = "あああ"
上記のように取得できたんですが
$source = "<a href=
ttp://aaa.com/ >あああ</a><a href=
ttp://ccc.com/ >bbb</a>";
こんなふうに、ヒットする物が繰り返される場合
最初の "
ttp://aaa.com/ " と "あああ" しか取得できず
次に有る "
ttp://ccc.com/ " と "ddd" は無視されてしまいます
aタグは複数連なっており、全てではなく場合によって n 個目を取得したいです。
n回目にヒットした物や、次にヒットした物、を得る方法は無いでしょうか?
正規表現で何とかなる問題なのかどうかも解りません。
do while とか使わないと出来ないんでしょうか・・・
※ mb_eregi() は、大文字小文字を区別しないマルチバイト対応な関数です
>>809 欲張りじゃない繰り返しを覚える。
mb_eregi("<a href=((?:(?!>).)*?)>((?:(?!<).)*?)</a>",$source,$reg);
少し洗練。
mb_eregi("<a href=([^>]*?)>([^<]*?)</a>",$source,$reg);
[^>]*は常に最小マッチになるから?はいらないよ
*? でしたか。 有り難うございました><
813 :
nobodyさん :2005/11/20(日) 21:30:03 ID:E/P1aLNd
mb_eregi("<a href=(o[^-^]o?)>(;^_^A -_-?)</^-^a>",$source,$reg);
814 :
nobodyさん :2005/11/25(金) 11:16:59 ID:t2pzoEwO
VBScriptのRegExpで、メールアドレスのチェックを
正規表現でチェックするプログラムがあったのですが、
プログラム書いた人がもういなくてわかりません。
^([\w\.\-]+)@([\w\.\-]+)$
とかかれてました。
\wはわかるとして、「\.」、「\-」の意味がわかりませんでした。
エスケープ文字なのでしょうか?
でももしそうだとしたら、「
[email protected] 」
と入力してはじかれてしまうので、そういう意味ではないような気がします。
どなたか教えてもらえないでしょうか?
.そのもの、-そのものの意味だよ。
>>815 そのものの意味なんですね、ありがとうございます。
…ということはいけるはず…ということはプログラムがまずいのか…
817 :
nobodyさん :2005/11/26(土) 01:23:13 ID:l7a43yMv
>>814 .@.
こんな文字列にもマッチするのですが・・・
>>814 これ、ほとんど正規表現でチェックしている意味ないよな〜
実際、真ん中に@が含まれているかどうかだけだし。
>>818 んなことないっしょ。
2バイト文字や空白や記号みたいにあからさまに不正な文字ははじけるし、
あと、後方参照用にグルーピングしてるみたいから、
チェックだけが目的じゃなさそうだし。
820 :
nobodyさん :2005/11/26(土) 15:48:49 ID:RIen9muB
正規表現で9桁の数字をwebページ(下の方の階層も含めて)からさがしたいのですが、 なにかいい案ありませんか? よろしくおねがいします。
それは正規表現だけでは無理というもの。
822 :
nobodyさん :2005/11/26(土) 15:56:35 ID:RIen9muB
どの板いけばいいのか分からなくて・・ 言語は一応Javaでやりたいのですけど・・
Java means JavaScript?
824 :
nobodyさん :2005/11/26(土) 16:59:12 ID:RIen9muB
違います
「java スパイダー」で検索したら、そのまんまな本が出てきたから、 それを読んでみてはいかが。
826 :
nobodyさん :2005/11/27(日) 01:17:00 ID:mxeBXpTz
>>825 ずいぶん前から持ってます。
板違いみたいなので
どっか他のとこ逝ってきます。
ありがとうございました。
827 :
nobodyさん :2005/11/27(日) 03:00:37 ID:2DsEIeio
([XY][0-9]+)|([BW][A-F0-9]+) ってもうちょっとかっこよくかけない?
posixのsedなんで\dなんてありませんよ
>>829 そういう肝心なことを先に言わない香具師は、
|が使える処理系は(GNU sedとか)あるけど、これもエスケープが必要。
質問です。 コメントタグが何個かあって、コメントタグからコメントタグまでの内容をえたい場合どういうふうに書けばいいのでしょうか。 /<!--([^-]*)-->(.*)<!--([^-]*)-->/ コメントタグは<!--hoge-->など色々で、上のように書くと、$2には最初のコメントタグから最後のコメントタグが入ってしまいます。
訂正 $2には最初のコメントタグから最後のコメントタグまでの内容が入ってしまいます。 です。 追記 改行文字は取り払った後なので、含まれていないものとします。
>>834 Perl で良いんだよね?
コメントとコメントの間が (.*) だと最長マッチしちゃうので、 (.*?) とすると良いと思う。
>>836 ありがとうございす。うまくいきました。
*?の使い方、頭に叩き込んでおきます。
838 :
nobodyさん :2005/12/04(日) 20:14:17 ID:N27X1adx
現在Janeで以下のような正規表現を使っています。現在マッチング範囲が半角数字四桁+αになっていますが、
これを全角数字四桁にもマッチングさせたいんです。
これだけなら出来るのですが、またそのマッチした全角数字を半角に変換して$2に格納したいんです。
どなたかご教授頂けると幸いです。
マッチング対象文字列:([^-#=&\w+>@/×*?])(?!\d000)([1-9]\d{3})([^-\d_*×月日円年時分目→万千億兆人台枚回./@&?=])
変換後文字列:$1
http://c.hibi.info/?$2.png
aaa のように3文字までではヒットせず、 aaaaaaaaaaaaaaa のように4文字以上だとヒットするにはどのように書けばいいですか?
{4,}
>>840 なるほど・・・
ググりすぎて全然関係ないことを試していたようです。
ありがとうございました。
842 :
839 :2005/12/05(月) 14:20:07 ID:???
もう一つ質問させてください。
phpで書いているのですが、
>>839 の場合に、
「連続した任意のアルファベットと数字を、その連続した文字の1文字にまとめる」場合はどう書けばいいですか?
aaaaaならaに、abcdeeeeeeeefgならabcdefgにしたいです。
if(preg_match("([a-zA-Z0-9]{4})", $str))
{
$str = preg_replace("([a-zA-Z0-9]{4})", "ここの書き方がわからない…", $str);
}
844 :
nobodyさん :2005/12/05(月) 14:44:37 ID:FuV10sP7
PHPで aaaa bbbb AND cccc OR dddd eeee のような文字列の「aaaa」と「bbbb」の間のスペースと 「dddd」と「eeee」の間のスペースを 「 AND 」に置き換えるにはどうしたらいいですか?
>>843 まんまじゃないけど、要は後方参照ってこと。
847 :
839 :2005/12/05(月) 14:58:09 ID:???
>>843 さん
ありがとうございます。
後方参照という言葉すら知りませんでしたが、パターンにマッチしたものが一時的にキャッシュされるんですね。
しかし、abcdeeeeeeeefgがfgになってしまいましたorz
abcdにはマッチしてないはずなのになんでだろうなぁ…
単純に言えば、(a)\1でaaにマッチするわけ
849 :
839 :2005/12/05(月) 15:17:09 ID:???
>>848 さん
ありがとうございます。しかし全然わかりませんでしたorz
察するに、"([a-zA-Z0-9]{4})"の部分が悪いのでしょうか・・・?
>>849 そう
[a-zA-Z0-9]って英数字のどれでもいいわけです。
それが四つでマッチするわけだ。
851 :
839 :2005/12/05(月) 15:49:46 ID:???
>>850 さん
なるほど・・・
abcdeeeeeeeeeeeeeeeeeeeefgという文字で試していたのですが、
abcd eeee eeee eeee eeee eeee fg
となって、4文字に達していないfgだけが表示されたんですね・・・
(.)\1 なんてしてみましたがうまく動いてくれませんでしたorz
なんとなく理解できてきたのでいろいろ試してみます。
何度もすみませんでした。
852 :
nobodyさん :2005/12/05(月) 18:36:28 ID:xIS9Um0e
(a|b|c) と [abc] の違いは何でしょうか?
>>851 ([a-zA-Z0-9]{4})
これだと"abcd"でも"0123"でもとにかく4文字続いてたらマッチしちゃう。
$str = "aaaaabbccccccddddeeff";
$str = preg_replace( "/([a-zA-Z0-9])$1{3,}/", "$1", $str );
echo "$str\n";
結果:
abbcdeeff
こうしないと。
>>853 [abc]の方が短い。
>>852 普通にマッチするよ。ソースファイルはEUC?
encodeだかdecodeだかのサブルーチンが悪さしてるんでしょ。
つか、Yahooのhtmlは最初からeucなので、
そのdecodeとかいう処理が要らないのでは?
>>854 すみません、短いとはどういう意味ですか?
>>853 前者はマッチした文字をキャプチャし、更に(aa|bb|cc)のようなものにも対応できる。
859 :
852 :2005/12/06(火) 03:43:11 ID:???
>>855 EUCでEncode使わなかったら出来ました。ありがとうございました_ _
単純にa, b or cなら文字クラスのほうが早いと思うよ
Rubyなんですが、[] で括られた文字列を抽出するのはどうしたらいいでしょうか。 ・[]はネストできる。 "xxxx[123[45]6[7]8]xxxxxx" の場合"[123[45]6[7]8]" を得たい。 ・\[ とすることでエスケープできる。 "[xx\]" はマッチしない。 "[\\\[]" は全体がマッチする。 正規表現だけに頼らなければ問題ないのですが。。
そういうふうに書けばいい
正規文法では扱えないんじゃないのかな
文脈自由文法じゃないと無理
例えば \[(?:[^\[]*|\[[^\]\\\\]*(?:\\\\.[^\]\\\\]*)*\])*\]
こういうのはなんでNG?
>>867 []]]]
こういうのにもマッチするけどいいのかな
いや、これだけだと他にも色々問題はあるけど 根本的に変遷取れないのはどれ?って話 鬼車の拡張は無しの方向で
最近はPCREでも再帰マッチサポートしてるね。 RubyはもうOnigurumaに変更されたんだっけ。
シラネ 最近勉強し始めたばっかだし 解がもとまるかどうかすぐ分かるくらいになりてえ
873 :
862 :2005/12/07(水) 01:26:25 ID:???
>>867 []の数は等しくないとまずいです
等しくなくてもいいのならば
\[.+([^\\](\\\\)*)\]
になりませんか?
電信八号というメーラーを使っていまして、海外からのスパむがうるさくて かなわないので、「subjectに2バイト文字が含まれないもの」を振り分けたい だけど、正規表現でどう書くのかわかりません。 subject で始まる行が1バイト文字だけで構成されている。 にマッチで良いと思うんですが・・・・
/^FROM:.*mag2/i magmag.FLD FROM:で始まる行にmag2という文字列が含まれていたら、 magmag.FLDに振りわけてる。 /^Subject:1バイト文字のみの1回以上の繰り返し spam.FLD どうかくの?
>>874 POPFileでも使った方がはやいかも
アルファベット若しくは半角数字、半角記号が一回以上繰り返される場合、でいいのかな。
/^subject:[ a-z0-9その他記号等]+/i spam.FLD もし使えたら[\x20-\x79]+とか
>>878 > アルファベット若しくは半角数字、半角記号が一回以上繰り返される場合、でいいのかな。
そのとおりです。お願いします。お手数お掛けします。
ちなみにPOPFileは大嫌い
884 :
881 :2005/12/07(水) 16:14:28 ID:???
>>883 > マニュアル読むのも大嫌いそうだな。
すいません。ご指摘のとおりです。
助かりました。
おはずかしい。しかし望む動作はだいたい実現しました。
/^subject:[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789!"#$%&'@+]*/i spam.FLD
885 :
881 :2005/12/07(水) 16:17:53 ID:???
「正規表現」でスレタイ検索したらココが一番アクティブだったので、 スレ違いを承知で質問させてもらっちゃいました。スレ違いスマソ
初々しい奴じゃな
過疎板は優しい人が多い。
888 :
nobodyさん :2005/12/09(金) 00:38:44 ID:iCbRbzp1
数字 小数点あり 0以上 という正規表現を実現したいのですが、何かいい方法ありませんか? 0.000000000(永久につづく) 以上っていう書き方が思いつきません・・・・。
てか、正規表現のやり方が分からないなら。 それが数値にマッチするかを調べて、0以上かの判定はスクリプトなり何なり使えば・・
なんでもかんでも正規表現にすればいいってもんじゃないぞ
まだ習いたてだけど、このような意味? ([1-9][0-9]*|0)\.?[0-9]*[1-9]
892 :
891 :2005/12/09(金) 01:24:34 ID:???
あっ、ちがうわ。
893 :
891 :2005/12/09(金) 09:10:57 ID:???
これでどう? ([1-9][0-9]*|0)(\.[0-9]*[1-9])?
1.0は数字じゃないの?
895 :
nobodyさん :2005/12/14(水) 12:30:18 ID:3LtPjEbb
数字にきまってんじゃんかよ、あんたアフォ?
>>888 ([1-9]+[0-9]|[1-9])(\.[0-9]+)?|0+\.0*[1-9]
>>895 ( ´_ゝ`)フーン
^(([1-9]+[\d]*)(\.[\d]+)?|0\.[\d]+)$
+が一個余計だったわ。
>>897 > 数字 小数点あり 0以上
だから0.0を通してはだめでは?
0+\.かつ^$でマッチ可否の判定をするなら
^([0-9]*[1-9][0-9]*(\.[0-9]+)?|0+\.[0-9]*[1-9][0-9]*)$
つーか
>>888 で「0以上」って0含んでもいいじゃん
「0を越える」の間違いだな
オー ニホンゴ ムズカシィネ
Finalという文字列から始まらない行にマッチする正規表現を書きたいんですが ^[^Final].*\r? と書いた所何もヒットしないんですが 自分では「先頭が」+「Finalでない」+「何でもOK」+「改行」 と書いているつもりなんですが… どこがおかしいのか教えて下さいまし
[^Final] は F, i, n, a, l 以外の文字
>904 一般的な正規表現に文字「列」の否定はありません。Perl には ?! あるいは ?<! といった拡張が存在しますが。 プログラム中で使おうと思っているなら、先頭が Final で始まる行を正規表現で引っかけて、それ以外、とするのが簡単だと思います。 Perl だと↓な感じで。 print "NOT FINAL\n" if $str !~ /^Final/; むりやり正規表現で表すなら ^([^F]|F[^i]|Fi[^n]|Fin[^a]|Fina[^l]).*\r? になるんじゃないかと。
>>905 丁寧に解説して頂きありがとうございます
今回はJ-editというエディタ内で置換したかったのでプログラムではできなさそうですが
勉強になりました。
Perlでローカルのファイルは変更出来ないんだっけ?
出来るがスレ違い
>>905 エディタがサポートしてないとしたら仕方ないが、その正規表現は泥臭すぎる……
サポートしてるなら「^(?!Final).*$」がいいんじゃないか。
910 :
nobodyさん :2005/12/16(金) 14:20:34 ID:3Jn+fCoS
phpで〜(にょろ)を正規表現で表すと何になりますか? $val = "<TD>1000〜</TD>"; preg_match_all("/<TD>(.*)〜<\/TD>/", $val, $name); とすると $name[0][1]には1000〜となり〜が入ります。 これをぬこうにも $name2 = str_replace("〜", "", $name[0][1]); $name2 = 1000〜となり〜が取れません。
何だこいつら?
913 :
nobodyさん :2005/12/17(土) 23:21:43 ID:9ZVQMdkG
s/(^-^;)/(-_-#)/g;
914 :
nobodyさん :2005/12/18(日) 02:15:55 ID:E4qxneT1
海外から掲示板を荒らされて困ってます。 2バイト文字を全く使っていない書き込みはendにしたいのですが、 どのように表現したらいいのでしょうか? どうぞよろしくお願いします。
>>915 即レスありがとうございました!
全角文字の判別で検索すればよかったんですね!
>>916 全角文字の判別を知らなくても全てがASCIIの範囲ならはじくというのは
書けそうなものだがな...
JAVAで [ と ] を文字として扱い、 他の文字列とマッチングをさせたいのですが どうすればいいでしょうか? 対象とする文字列は Mem[0]、Mem[1]…(以下、数字が増加) になります。 正規表現の "Mem\[[0-9]*\]" で試したのですが、 上手くマッチしてくれませんでした。 何か良い方法があれば教えてください。
Javaで \[ を表現したければ \\[ とするべし。
921 :
919 :2005/12/20(火) 21:51:53 ID:jBM1u1uW
>>920 即レスありがとうございます。
ただ、 \\[ という書き方だと、
\[ (バックスラッシュ[) とマッチするような気がするのですが…
[ とマッチさせる場合は特別で、
バックスラッシュが二つ必要になるのでしょうか?
923 :
919 :2005/12/20(火) 23:45:59 ID:???
>>922 文字列として扱いたいのは\ではなく[と]の方です。
単に[と]を書くと、括弧の中に着目されてしまうので
\[や\]と書けば良いのかと思ったのですが、
この方法だとマッチしたという判定にならず。
他に記述方法があるのかどうかと…
分かりにくい質問でスミマセンでした。
リンク先、参考にしてみます。
>>923 リンク先を熟読してから文句をつけるように。
外部CSSを使ってHTMLを装飾しているのですが、 その外部ファイルにどんなものが定義されているかを htmlのtable要素を使って一覧にしたいと思い、下記のようにしましたがパースエラーと出ました。 XXX { ○○○ } とあるものを <table> <tr> <td>XXX</td><td>○○○</td> </tr> </table> のように表示させたいのですがこの条件でマッチする表現を教えて頂けますか
s#(?:^|\n)([^\s\{]+)\s*\{\s+(\S+)#<table>\n<tr>\n<td>$1</td><td>$2</td>\n</tr>\n</table>#g
927 :
925 :2005/12/21(水) 23:26:34 ID:???
>>926 ありがとうございます。
下記のコードで試してみたところ
改行以降をひろってくれなかったのでちょっと改造にチャレンジしてきます。
-----------------------------
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<?
$lines = file('./hoge.css');
$file = implode('',$lines);
preg_match_all("/(?:^|\n)([^\s\{]+)\s*\{\s+(\S+)/",$file,$css);
for ($i=0; $i< count($css[0]); $i++) {
?>
<tr bgcolor="#9999cc">
<td><?=$css[1][$i]?></td><td><?=$css[2][$i]?></td><td><?=$css[2][$i]?></td>
</tr>
<?
}
?>
</table>
928 :
925 :2005/12/22(木) 00:02:45 ID:???
\sでスペース、\Sでスペース以外だったんですね。 最後の(\S+)を(.*)}?にして "}が来るまでを最短マッチ"って書いたつもりでしたが.*は改行にマッチしないんですね…。 orz むつかしいぃぃぃ
Perlだったら /s 修飾子をつければいい。
930 :
?? :2005/12/22(木) 06:00:17 ID:VYb6VtoN
I can not write
931 :
?? :2005/12/22(木) 06:08:36 ID:VYb6VtoN
I can not type Japanese now (this PC). but I can read. I use PHP. I want to change every HTML tags in a file as follows: <span class='test'>abcdefg</span> -> <b><font color=#ff0000>abcdefg</font></b> I tried eregi('<span class="test">.*</span>', '<b><font color=#ff0000>.*</font></b>'); It does not work.
eregi ?? ereg-replace ?
933 :
?? :2005/12/22(木) 11:46:44 ID:VYb6VtoN
soudesu ereg-replace desu sumimasen
>>934 eregi_replaceで大文字小文字を区別しないってところが技巧的なんじゃないかな
936 :
925 :2005/12/25(日) 16:01:19 ID:???
結局正規表現で表すことが出来ずに"{"と"}"を両方とも"@@@@"に変換してから @@@@でexplodeしてループ処理しました。 ヘタレだなぁ orz
$aがメールアドレスかどうかPHPで簡単でいいのでチェックしたいのですが if(ereg("[^0-9a-zA-Z@_\-\.]+",$a)){エラー処理} だとうまくいかないようです。どこがおかしいのでしょうか?
あげ
940 :
937 :2006/01/05(木) 15:17:17 ID:???
>>939 ありがとうございます。参考にして試してみます。
時(1〜12)を正規表現であらわしたいのですが、 どうすればいいでしょうか? [1-12]ではもちろんだめぽですよね・・・
{0,1}と?ってどっち使っても一緒?
>>941 そんだけの情報でダメかどうかなんて判断つかんだろ。
少なくとも [1-12] がだめなことは判断つくな(w
[1-9]|(1[0-2])?
[1-9]|1[0-2]
1[0-2]?|[2-9]
そういう類の質問は大概にして正規表現で何から何まで片付けようとしているのが間違いであることが多い。
949 :
nobodyさん :2006/01/09(月) 05:39:24 ID:DKtQK5nB
1-9と-(ハイフン)を指定する場合、 [1-9-]であってる? それともエスケープしなきゃならんのでしょうか。
OK
hoge以外に一致させる場合どう記述すればよかとでしょうか? [^hoge]だとhとoとgとe以外になってしまいますよね
そんぐらい自分で試行錯誤すりゃわかるだろ 少し自分で考え、実験してみてそれでもわからなくなったら質問しろ
$var = "<A>"; preg_match_all("/<A>/", $var, $array1); preg_match_all("/A/", $var, $array2); phpなんですが、$array2にはAが入ってるんですが、 $array1には<A>が入りません。 <>が問題ありなのは分かりますが、根本的理由が分かりません。 へるぷみー
>>953 結果の画面のソース見たらわかるんじゃないの
956 :
953 :2006/01/09(月) 19:07:16 ID:???
>>954 通常は問題ないはずということでしょうか?
エラーメッセージ等は表示されておらず、ソースを見ても理由が分かりません。
957 :
953 :2006/01/09(月) 19:15:11 ID:???
954さんの言ってることが理解できました、ありがとうございます タグとして処理されてました・・・鬱だ・・・
>951 >483-491 >902-909
何でもかんでも正規表現でやろうとするなっ
正規表現は万能です!
962 :
951 :2006/01/09(月) 22:19:51 ID:???
phpでは^(?!文字列)のような拡張はないでしょうか?
964 :
馬鹿です :2006/01/09(月) 23:13:46 ID:3zyjeInA
perlを勉強しています。教えてください。 正規表現で例えば、全角カタカナを表したら、[ァ-ヶ]と (?:\xA5[\xA1-\xF6])と(?:\x83[\x40-\x96])とありますよね。 この中のどれを使えばいいんでしょうか?後の2つはeucとsjisと いうことは分かるんですが結局[ァ-ヶ]を使えばどちらでも(eucとsjis) 使えるということなんでしょうか?初心者ですいません。。
>>964 Jperlじゃないと日本語(の2byte文字)に対応してないから
[ァ-ヶ]じゃ無理なんよ。
>>965 せんせー、これ上手くいくんですけど。
use encoding qw(shiftjis);
my $str = "アノネキュウタロウハネ";
$str =~ /^[ァ-ヶ]+$/ and print "true";
encodingを使えばいいかな。でも
>>965 はPerlメモを見て
言ってるんでしょ。あの文脈ではencodingなしでってこと
だから(ちょっと苦しい)…
で、
>>965 さんの疑問には、スクリプトと対象ファイルと
端末の文字コードが同じなら「はい」、そうでなきゃ、
STDIN=>'euc-jp', STDOUT=>'shiftjis'などを組み合わせなきゃ
化けるよというのが答えか。
他スレから流れてきました。 平仮名すべてとカタカナすべてにマッチさせるのは $s =~ /[あ-ん]|[ア-ン]/; ですか? それとも $s =~ /[あ-ん]|[ア-ン]/; ですか?
性器表現でアーンですか。
[ぁ-ん]|[ァ-ヶ]
(i)
972 :
nobodyさん :2006/01/15(日) 02:59:40 ID:4XZbfZj+
そういえば、Perl5.8でShift-JIS(cp932か?)の2バイトがふつーに使えてるんだけど…なんで? エンコードとかしてない。
>>972 ふつーに使えてるってなによ。
1文字ごとに処理すれば、使えないよ。lengthとか…
975 :
nobodyさん :2006/01/18(水) 02:18:59 ID:4mLPDnIV
んあ。わかった。つまり、 禿→\x00\x00 で評価されてるわけか? やば…なおさな…。
<Files ~ "\.(php|cgi)$"> ~ は何を表すものでしょうか?
>>978 RedirectMatchはクエリストリングにはマッチしないしクエリストリングの変換もできない
>>979-980 ありがとうですー
が下位の階層が全部403になりますorz
スレ違いっぽいんで、RewriteRuleの勉強してきますー^^