トップページ⇒php
981コメント301KB

正規表現道場@2ch Part4

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん05/01/17 11:51:25ID:SH1ygN1P
Perlに限らずスクリプト系言語で大活躍の正規表現。
このスレは有用そうな正規表現を紹介したり、
どう表現したらいいかわからないときに質問をしたりするためのスレッドです。
質問するときは使用言語や得たい結果をなるべく詳しく書きましょう。

註:& や " を書くときには、& " と描いておきましょうね。

Perlメモ
 http://www.din.or.jp/~ohzaki/perl.htm
正規表現メモ
 http://www.kt.rim.or.jp/~kbk/regex/regex.html
Regex::Diagram.pm
 http://www.cc.rim.or.jp/~midorin/mad-p/RegexDiagram.html
正規表現
 http://www.cc.rim.or.jp/~midorin/mad-p/perl/benkyou/PRC2kRegex/
UNIX正規表現入門 目次
 http://www01.u-page.so-net.ne.jp/jc4/hiroyuki/rex_index.html
Regular Expression(Riue ちゃんの正規表現講座) - Index
 http://www.sixnine.net/regexp/

ほとんどは↓のリンク集にまとまっています。
正規表現最新リンク集2002
 http://www2.famille.ne.jp/~akio1998/l_grep.html

過去スレ
正規表現道場@2ch
 http://pc.2ch.net/test/read.cgi/php/996105815/
正規表現道場@2ch Part2
 http://pc2.2ch.net/test/read.cgi/php/1038146241/
正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
 http://pc5.2ch.net/test/read.cgi/php/1069245758/
0140nobodyさん05/02/10 21:44:38ID:???
>>139
これでダメみたい。
<a href=hoge>hoge</a>
hoge が消えちゃう。

'#</?\w+(?:\s+(?:\w+\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^"\'>\s]*)|\w+))*\s*/?'.'>#i';
0141nobodyさん05/02/10 22:10:06ID:???
JSPで入力された項目がメールアドレスであるかを
正規表現で調べたいんだけど、うまく動作してくれない。

メールアドレスの正規表現って、
^[a-z0-9][\\w\\.]*@[^\\.][\\w\\.]+[^\\.]$
でいいよね?
0142nobodyさん05/02/10 22:20:47ID:???
>>141
とりあえずパッと見て気がついた点は、
[...] の中の '.' はエスケープしなくて良いのと、
ドメインにはハイフンもありうるけど \w にはハイフンは含まれない。
014313005/02/10 23:09:13ID:???
>>140
エンバグしてました orz
'/<\/?\w+(?:\s+(?:(?:\w+\s*=\s*(["\']?).*?\1)|noshade|selected|checked|multiple|noresize))*\s*\/?>/'

# ああ、もういいや。
0144nobodyさん05/02/10 23:13:25ID:???
strictなHTMLだけを対象にすりゃええやん。
クォートなしの属性値はHTML4.01までならOKだから考慮する必要があるけど
実体参照になってない&<>"なんかは論外。
0145nobodyさん05/02/11 00:21:17ID:???
パーサーかCC使ったほうが楽かもね。
<!CDATA[ <tag attr=""> ]]>
0146nobodyさん05/02/12 00:04:09ID:???
グダグダだな
014713005/02/12 08:02:28ID:???
$html = '<\/?[\w\.]+(?:\s+(?:\w+\s*=\s*(?:\'[^\']*\'|"[^"]*"|[^>"\'\s]*)|\w*))*>';
$sgml = '<!(?:\[\s*(?:[\w\.]+|\%[^;]+;)\s*\[.*?\]\]|[\w\.]+(?:\s+(?:\'[^\']*\'|"[^"]*"|\[[^\]]\]*|[^"\'>\s]*))*)>';
$remark = '<!(?:\s*--(?:\'[^\']*\'|"[^"]*"|[^"\']*?)*--\s*)?>';
"/$remark|$sgml|$html/is"

グダグダついでに。
SGMLをマッチする方向に変更。
ショートタグの大部分、エンプティタグ、NET、一つのタグ内の複数の注釈は非対応。
014813005/02/12 08:10:57ID:???
ああ、また orz
$html = '<\/?[\w\.]+(?:\s+(?:\w+\s*=\s*(?:\'[^\']*\'|"[^"]*"|[^>"\'\s]*)|\w*))*\/?>';
でおながいします。
0149nobodyさん05/02/12 23:55:30ID:???
教えてください。
数字が10個以上連続していない行をマッチさせたいんですが、
どのような正規表現を書けばいいでしょうか?
0150nobodyさん05/02/12 23:57:49ID:???
↑あ、言語はPHPです...
0151nobodyさん05/02/13 00:19:32ID:???
>>149
数字が10個以上連続している行を除外するのではだめでしょうか?
0152nobodyさん05/02/13 00:45:32ID:???
>>149
直前に数字十個以上がない全ての文字の連続という正規表現を書けばいい
PCRE系ならMオプションをつけて行マッチさせろ
015314905/02/13 00:51:12ID:???
うー・・よくわかりません…
数字10個のものを除外するのでは、
意図していることと違っちゃうのでちょっとだめです。
0154nobodyさん05/02/13 01:05:37ID:???
後ろに十個以上の数字を伴わない任意の文字、の連続
のほうが書きやすいか。
0155nobodyさん05/02/13 02:09:24ID:???
分からんのは回答者のほう。お前の意図なんか知らんよ。エスパーじゃないし。
pcreなのかposixなのかも知らんし、どのくらい噛み砕けば理解できるのかも分からんし、
よく分からない、の「よく」がどの程度かも知らんし、データが複数行なのか単一行なのかも知らんし、
Gマッチなのか一個でいいのかも知らんし、正規表現書けるかどうかさえ知らんのだYO。

>>154
言葉からだといくつかパターンが考えられるけど、数字が続かない文字だと、
数字のみからなるデータで常に文末にマッチすることないか?
>>152のように否定言明を使って (?!\d{10,}). みたいにするしかないと思う。
後方言明だと可変長の正規表現を扱えないし、、、。
015615505/02/13 02:19:44ID:???
あれ、直前に?なんか解釈間違ったかも。
ともかく普通に否定言明にドットつなげばいけるよ。
0157nobodyさん05/02/13 17:13:27ID:iVFDDmsL
php4なんですが、
ある文字列が、全角カタカナで50字以内かいなかは
どうやっってかけばいいのでしょうか?
015815405/02/13 18:52:34ID:???
>>155
あーそうかも。とりあえずパフォーマンスの悪い別解。激しくナンセンスだがw
/^(?(?!\d{10,}).*)$/

>>157
全角カナ換算で50文字以下なら、エンコード指定してmb_strcountか、strlenの結果を一文字の
バイト数で割って算出。
振り仮名などで対象がすべてカナであることも保障したい場合は、使用している文字コードの
全角カナのブロックをすべて文字クラス[]に放り込んで{,50}$を指定すれば、正規表現的にはOK。
0159nobodyさん05/02/13 18:57:00ID:???
×mb_strcount
○mb_strlen
ね
0160nobodyさん05/02/13 19:14:12ID:???
PHP 使う奴は、まず pcre や mbstring の利用の可否を書いておくべし。
0161nobodyさん05/02/13 20:11:56ID:???
perlの正規表現で、記号類はどのように表現すればよいですか?
やりたいことはUTF8で書かれた日本語の文章から、
> −-―・「」!'(),….『』´’~☆‐/?“”、!+。
> []:→〈〉&()←×‥♂〜#`℃@"‘*¨「」φ|【】; %
> =〔〕《》◇∞〓♯●\^◎°○★�U♭?〃?�\▲≪≫
などの記号類を全て取り除きたいのです。
EmEditorの正規表現では\Wでこれが実現できるのですが、
perlで\Wとすると・・・。

宜しくお願いします。
0162nobodyさん05/02/14 17:22:57ID:SqkH/Xuz
>>124に近いのですが、HTMLにおけるリンク先の抽出に手間取ってます。
タグはとりあえず見ずに、srcとhrefの後ろの=から"か'をキャッチして対応する
"or'までを取得したいのですが。。。
言語はPHPです。
0163nobodyさん05/02/14 21:10:11ID:???
>>161
perl5.8.1以降ならtr///が使える。
スクリプトもUTF-8で書かれていると仮定。
(\r\nは、マッチ文字列に改行が含まれていて、
改行コードが削除されてしまうための対策。不要なら削る。)

use encoding qw(utf8);

tr{\r\n
−-―・「」!'(),….『』´’~☆‐/?“”、!+。
[]:→〈〉&()←×‥♂〜#`℃@"‘*¨「」φ|【】; %
=〔〕《》◇∞〓♯●\^◎°○★�U♭?〃?�\▲≪≫
}{\r\n}d;
0164nobodyさん05/02/14 21:38:42ID:KmG+pbP2
PHP環境なのですが、「半角記号にマッチ」というのを
シンプルにあらわす方法はないですか?
0165nobodyさん05/02/14 22:01:44ID:???
>>164
[[:graph:]] とか
0166nobodyさん05/02/14 22:17:29ID:???
>>165
thx!
0167nobodyさん05/02/15 02:50:04ID:???
>>162
何が出来ないのか分からんが、上であがったのを流用すればいいだろう
0168nobodyさん05/02/16 16:27:58ID:SLDSz7ZK
質問です。たとえば1〜20までの数字があって、
1と3の2つだけをマッチさせたいのですが、
/^[1|3]/
とすると、1、3はもちろんマッチするのですが、
11も12も13も・・・マッチしてしまいます。

この場合、どう書いたらいいのですか?
0169nobodyさん05/02/16 16:29:48ID:???
/^[1|3]$/
0170nobodyさん05/02/16 18:09:46ID:???
>>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と
なってしまいます。これを思い通りにマッチさせるのは
どうしたらいいのでしょうか?
0171nobodyさん05/02/16 18:43:47ID:???
"/^(1|10|25|45|60)$/"
0172nobodyさん05/02/16 22:23:02ID:???
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>にマッチしている
部分なのでしょうか。
0173nobodyさん05/02/16 22:43:33ID:???
すみません、解決しました。
m#<DT><A.*?>([0-9]+).+?(?:<A HREF=mailto:(.+?)>)?<B>(.*?)</B>(?:</A>|</FONT>) :(.*?)<DD>(.*)<BR><BR>#mi
0174nobodyさん05/02/17 02:06:18ID:???
質問です。

HTMLのコメントタグを引っ掛けるにはどうしたらよいでしょうか?
単に引っ掛けるだけならできたのですが、例えば

<html><body>
<div id=" test<!--test ">a</div>-->
</body>
<html>

こんなのを引っ掛けないようにしたいんです。
0175nobodyさん05/02/17 02:44:37ID:???
>>174
http://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag
0176nobodyさん05/02/17 04:15:35ID:???
コメントはタグじゃない・・・(ぼそ)
017717405/02/17 11:15:34ID:???
>175
回答ありがとうございます。そこの正規表現である
tag_regex = '<!(?:--(?:(?!--).)*--(?:(?!--)[^>])*)*(?:>|$(?!\n)|--.*$)';

を利用したのですが、

"<!--------------------------->foo"

となっていると文字列全部を取得してしまいます。(fooの前まで引っ掛けて欲しい)
これがコメントとして間違ってることは理解しています。
しかし、こういう具合に間違ってるWebページは結構多いので、
これもコメントとして認識したいのですが
どうにかならんものでしょうか?
0178nobodyさん05/02/17 11:34:14ID:???
それがマッチする正規表現を新たに作ればよかろう
一回で全てしようとするから駄目なんだよ
0179nobodyさん05/02/17 13:37:18ID:???
そもそも>>175のやつだと>>174のもとれないわけだが
これらに対応するのはキツイんじゃないかな
何回かに分けたとしても間違えてとったやつを弾くことは難しいわけで
0180nobodyさん05/02/18 04:21:47ID:???
スキャナ書いた方が早道のような気もするね。
0181nobodyさん05/02/18 05:40:21ID:???
適当にBNFで定義して終了
0182nobodyさん05/02/18 06:04:51ID:???
>>174
Perlなら、>>147-148を利用して、
my $match = $str =~ m/($remark)|$sgml|$html/isg;
0183nobodyさん05/02/18 08:00:53ID:???
>>182
my @match = $str =~ m/($remark)|$sgml|$html/isg;
だった…。
0184nobodyさん05/02/18 12:08:09ID:4JcRNkuB
wakaru^-^
0185nobodyさん05/02/18 12:09:11ID:???
↑miss...
0186nobodyさん05/02/18 15:39:39ID:???
>>181
XML はともかく、 HTML で BNF 定義しようと思ったら地獄を見るような気もしなくはない。
0187nobodyさん05/02/19 16:48:15ID:???
あんた、地獄を見るわよ
0188nobodyさん05/02/19 16:56:01ID:???
>>179
たとえばどんな奴とか?
0189nobodyさん05/02/21 20:38:23ID:???
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
0190nobodyさん05/02/21 21:38:35ID:???
>>189
最後のでいけたぞ?
0191nobodyさん05/02/21 21:55:19ID:???
>>190
いけました・・・
ありがとうございました

多分ブラウザのキャッシュか、.htacessに書く時点で間違えていたか、
どっちかだったと思います
0192nobodyさん05/02/22 17:24:46ID:???
perl5.8です
1〜685の数字にマッチするように

6[0-8][0-5]|[1-5]\d\d|[1-9]\d|[1-9]

としてみたのですが、スマートというか
模範となるような書き方があったら教えてください
0193nobodyさん05/02/22 18:33:44ID:???
>>192
その正規表現が間違ってるのはともかくとして、
全部正規表現でやろうとせず、
文字列としての評価は [1-9]\d* くらいで検査しておいて、
あとは数値的に評価した方が良いと思われ。
0194nobodyさん05/02/23 05:20:38ID:Vw9LlCLC
ruby-1.8.2で、mixiの友達リストを取得するスクリプトを書いてます
ID番号などは、半角数字というのもあって、簡単に取得できたのですが、
名前取得で手こずっています。

<td>名無しさん(17)<br><a href=show_friend.pl?id=774>
^^^^^^^^^^
を取得したいと思っています。

上記にマッチする正規表現例を教えていただけないでしょうか?

\<td\>(.*)さん\([0-9]+\)
これでは取得できていません。
0195nobodyさん05/02/23 05:35:47ID:???
申し訳ありません。。。取得できました。
rubyの文法を間違えていました。

ごめんなさいごめんなさい。。。
ちなみに上記の正規表現でOKでした。
0196nobodyさん05/02/25 22:30:13ID:qCTUQzjg
文字列から半角英数字以外は全部取りたいんですが、正規表現で一発で表現できますか?
019719605/02/25 23:02:07ID:qCTUQzjg
↓こんなふうにしてみましたが、ダメでした。

ereg_replace( "/[^a-zA-Z0-9\s]/", "", $t )

何か勘違いしているでしょうか?
0198nobodyさん05/02/26 01:29:40ID:EGev6g90
文字列クラスを定義して終わってるから何にもマッチしないと思うけど。
0199nobodyさん05/02/26 01:31:43ID:EGev6g90
文字クラスだった。
0200nobodyさん05/02/26 06:16:34ID:???
>>197
preg_replace()ならだいじょうび。
0201nobodyさん05/02/26 06:37:59ID:???
>>197
$t = ereg_replace("[^a-zA-Z0-9\s]", "", $t);

こういうこと?
それから、日本語扱うならmb関数にする。
0202nobodyさん05/02/26 17:50:17ID:LErwwWXI
半角英数文字列が入っている変数$fooと$barについて
大文字、小文字を区別無くマッチさせたいのですが、どうやればいいんでしょうか?
言語はPerlです。

$foo="[email protected]";
$bar="[email protected]";
このようなものが入っている場合、マッチさせたいのです。
0203nobodyさん05/02/26 18:05:57ID:???
>>202
i オプションで。 /^123test\@example\.ne\.jp$/i みたいな。
0204nobodyさん05/03/02 04:35:55ID:???
↓こういう文字列を
  "あいうえお「かきくけこ「さしすせそ「たちつてと」なにぬねの」はひふへほ」まみむめも」やゆよ「らりるれろ「「わをん"
↓こんな感じに
  "あいうえお<em>かきくけこ<em>さしすせそ<em>たちつてと</em>なにぬねの</em>はひふへほ</em>まみむめも」やゆよ「らりるれろ「「わをん"
変換したいんですけど、どうすればいいんでしょう?

イメージ的には
  /「[^「]*?」/
こういうことをしたいんだけど、[ ] の中はアスキーだけだし。
use encoding とかはナシな方向でひとつ。
020520405/03/02 04:49:22ID:???
いまんとこ
-------------------------
my ($s, $t) = (quotemeta '「', quotemeta '」');
$_ = "あいう〜";
s/($s)/\a$1/og;
while (s/ \a $s ([^\a]*?) $t /<em>$1<\/em>/ogx) { 1; }
-------------------------
とか 「 \a 」 で印つけてるけど、他にもいい方法あるかと思って。
0206nobodyさん05/03/02 11:34:17ID:???
>>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を前後につけた

というあたりです。

0207nobodyさん05/03/02 13:53:48ID:???
PHPを使ってます。
タグの外にあるカタカナと『ー』の前後に半角スペースを入れたいのですが
(文字コードはEUC)

$t = preg_replace("/(?:^|(?<=>))([^<]*)((?:\xA5[\xA0-\xFF]|\xA1\xBC)+)/i","$1 $2",$t);

のようにすると、
例えば『七時のニュースです』という文字列の場合『ス』の前後にしか空白が入ってくれません。
どうにかして解決できないでしょうか……
020820405/03/02 17:36:49ID:???
>>206
わー、ありがとう!
答えだけじゃなく、技術的にも勉強になったよ THX!
0209nobodyさん05/03/02 19:46:42ID:???
>>207
ここはおまえのバカっぷりを晒すとこじゃないぞ。出直してこい。
0210nobodyさん05/03/02 22:15:55ID:???
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]*?に変えてみたのですが変化がありませんでした。
どのように変更を加えればよいのでしょうか?
021120705/03/02 22:24:58ID:???
ごめん、俺が馬鹿だった。出直してくる。解決したけど。
0212nobodyさん05/03/03 10:12:04ID:???
>>210
$pattern = "/<!-- BEGIN -->(.*?)<!-- END -->/s";
パターン修飾子 s をつけることで . が改行にもマッチするようになります。
0213nobodyさん05/03/03 13:52:50ID:???
>>212

あ〜〜〜そんないいものがあったんですね。
どうもありがとうございました
0214nobodyさん05/03/03 14:08:03ID: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を使っているので、もう少しいっぺんに同じ動作を
させることはできるでしょうか?
0215nobodyさん05/03/04 20:58:51ID:gtJy+aSQ
入力された身長体重が正しいかを判別したいんだけど...

^(?:d+(?:.d*)?|.d+)$

と考えたけど、うまくいきません。

エロイ人、添削キボン
0216nobodyさん05/03/04 22:28:59ID:???
>>215
まずどういうのが正しいのかを示すべき。
0217nobodyさん05/03/05 05:18:05ID:???
/+。:.゚ヽ(*´∀`)ノ゚.:。+゚/i
0218nobodyさん05/03/05 08:15:13ID:8nW34nzC
>>216
170
175.5
60
60.5
がOKで、
.6
15.15.52
なんてのがボツ
もちろん、数字と.以外がはいるとボツ

>>217
エラーになりますた
0219nobodyさん05/03/05 08:36:43ID:???
>>215
正規表現のスレでいうのもあれなんだが
数字として比較したほうがわかりやすいと思う
if ($height < 130 || $height > 200) print "Error";
0220nobodyさん05/03/05 12:19:51ID:hbhM7+40
$string = "12.3.45";

$pattern = "/^[0-9]+?\.[0-9]+$|^[0-9]+$/s";

if (preg_match($pattern, $string)) {
echo "正常です";
} else {
echo "違います";
}
0221nobodyさん05/03/05 12:22:32ID:???
$string = "12.3.45";

$pattern = "/^[\d]+?\.[\d]+$|^[\d]+$/";

if (preg_match($pattern, $string)) {
echo "正常です";
} else {
echo "違います";
}
0222nobodyさん05/03/05 12:26:53ID:OYa1FD+r
ぽちぽちドットコム:キャッシュバック100円から!
http://pochi-pochi.com/pages/index.php?refid=hopedkco
0223nobodyさん05/03/05 13:35:01ID:???
<?php
$string = "12.3.45";

$pattern = "/^\d+?\.\d+$|^\d+$/";

if (preg_match($pattern, $string)) {
echo "正常です";
} else {
echo "違います";
}
?>
0224nobodyさん05/03/05 19:27:01ID:???
$pattern = "/^\d+\.\d+$|^\d+$/";
0225nobodyさん05/03/05 20:43:45ID:???
/^\d+(\.\d+)?$/
0226偽崎 博基05/03/05 21:42:08ID:???
改行で終わっていた場合にも正常とみなされる記述は"間違い"です.
0227nobodyさん05/03/05 22:40:51ID:???
>>226
/^\d+(\.\d+)?\z/
0228nobodyさん05/03/07 05:11:36ID:DaphPIkI
----------------------------------------------------
http://www.abc.ne.jp/abc/abc.htmゴッゴル
コメント
http://www.nurupo.ne.jp/null/def.htm
ホゲホゲ
ホゲホゲ
ゲゲボ
http://www.g00.ne.jp/gero/ghijkl.htmまんくるぽ
ぬるぽ
http://www.mahoo.ne.jp/abc/mnopqrstu.htm
----------------------------------------------------

↑の文章がテキストに記述されてるとして、
「正規表現で置換を行いURL以外を削除する」
若しくは
「URLだけを抜き出す」
にはどうすればいいですか?
K2Editor と bregexp.dll を使用しています。
0229nobodyさん05/03/07 12:11:56ID:???
>>226
なんか偉そうだな
0230ひろやん05/03/07 19:30:39ID:???
>>229
そんなあなたにPerlメモ
0231nobodyさん05/03/08 13:16:24ID:???
>>228
>>26
0232nobodyさん05/03/10 10:04:14ID:Oal+cA17
ファイル内文字列置き換えツールのSpeeeeedを使っている方
います?
他にどこできいていいものやらわからないので・・・。
Tepaエディターの正規表現でヒットする文字列がヒットしないんですけど、
具体的には
...:..:...ID:........$
という検索文字列を文字なしで置き換え、2chのスレッド内発言の時間とIDを削除しようとしています。
今日初めて正規表現のことを知って、美しくない検索かもしれませんが・・・。
と書きつつも231さんのIDがID:???であることを知った。
初めて見ました。
よろしくお願いします。

補足
BREGEXP.DLLを導入して、Speeeeedから正規表現が扱える状態になっています。
0233nobodyさん05/03/10 10:07:14ID:???
>>232
>>1のリンク先読んでから来てね。
0234nobodyさん05/03/10 10:25:23ID:Oal+cA17
Speeeeedを使っている人はいないということを
おっしゃりたいのでしょうか?
勉強してからこいとおっしゃりたい?
0235nobodyさん05/03/10 12:22:03ID:???
俺には「>>1のリンク先を読んでから来い」としか読めないのだがな。
0236nobodyさん05/03/10 14:06:21ID:???
>>232
Speeeeed のホームページのサポート掲示板を「行末」とかで検索してみたら、
改行の扱いがどうもいまいちみたいね。
...:..:...ID:........\r\n
ってなかんじでどうでしょ。
0237nobodyさん05/03/10 23:52:18ID:???
>>236
ありがとうございます。
それでいけました。

>>235
正規表現が使える他のエディタではうまくいくので、
Speeeed固有の問題だと考えたけれど、>>1のリンク先には
その回答がなかったので・・・。

スレよごしすいませんでした。
0238nobodyさん05/03/13 23:43:38ID:d9JNVB9S
PHP環境で、テキストからURLだけを抜き出そうと思っているのですが、
---
$txt = "mae http://hoge.jp mannaka http://abc.jp ushiro";
preg_match("/(http:\/\/[\w;\/\?:\@&=\+\$,\-\.!^\*'\(\)%#]+)/", $txt, $matches);
foreach ($matches as $tmp) {
   echo $tmp."\n";
}
---
とすると、
---
http://hoge.jp
http://hoge.jp
---
となってしまいます。
http://hoge.jpとhttp://abc.jpを抜き出すためにはどうしたらよいのでしょうか?
0239nobodyさん05/03/14 00:19:26ID:???
>>238
http://jp.php.net/manual/ja/function.preg-match-all.php
■ このスレッドは過去ログ倉庫に格納されています