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

正規表現道場

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/01/11(木) 02:40:43ID:uW7xEbZY
【正規表現道場の掟】

・言語不問

・質問も大歓迎。使用言語を書くのを忘れずに。

正規表現と関係ない話・質問は他スレへどうぞ。
0153nobodyさん2007/09/02(日) 11:04:51ID:tGLa/mAn
>>150-151
正規表現とは文字列の集合を表現する手段でありますから、
ワイルドカードを用いた表現も正規表現の一種であります。
0154nobodyさん2007/09/02(日) 11:20:25ID:tGLa/mAn
>>152
> (\d+)(\.([*(\d+)])){3}

これは数字があり、 その後ピリオドと 「*」、 「(」、 数字、 「)」、 「+」 のどれかの組が3回繰り返す文字列群の表現です。

> *.168.50.5

これは数字の後、 ピリオドと 「*」、 「(」、 数字、 「)」、 「+」 のどれかの組が2回しか繰り返していないので、
先ほどの正規表現にマッチしません。
0155nobodyさん2007/09/02(日) 11:40:01ID:tGLa/mAn
いや、 待ってください。

> (\d+)(\.([*(\d+)])){3}

だと、

> 192.168.50.5
> 192.168.*.*
> 1000.1000.1000.1000
> *.168.50.5

のすべてにマッチしないはずです。 先ほど

> これは数字があり、 その後ピリオドと 「*」、 「(」、 数字、 「)」、 「+」 のどれかの組が3回繰り返す文字列群の表現です。

と申しましたが、 より正確には、

・ 数字が1つ以上あり、 その後ピリオドと 「*」、 「(」、 数字1つ、 「)」、 「+」 のどれかの組が3回繰り返す文字列群の表現

でありまして、

> 192.168.50.5
> 192.168.*.*
> 1000.1000.1000.1000
> *.168.50.5

のどれもそのような文字列ではないからです。
0156nobodyさん2007/09/02(日) 12:28:15ID:???
\.
0157nobodyさん2007/09/02(日) 13:10:37ID:???
どうせ1000がいやんって話なんだろうけど、0から255までの
数字だけがマッチする正規表現ってむずくね?
[0-9]|[12][0-2]?[0-9]|[12]?[34][0-9]|1?[5-9][0-9]|25[0-5]
とか
[0-9]|1[0-9][0-9]?|2[0-4]?[0-9]|[3-9][0-9]|25[0-5]
とか
0158nobodyさん2007/09/02(日) 19:09:05ID:???
PHPのPerl互換の正規表現のことで質問です。

次のような文章があったとします。
左のは行番号で、実際の文章中にはありません。

01.<div>
02.text
03.<img>
04.</div>
05.
06.<div>
07.text1
08.text2
09.</div>
10.
11.<div>
12.hoge
13.<img>
14.</div>

ちなみにドットは改行にもマッチするようにしておきます。
これに対してパターン「<div>\n(.+)\n</div>」を最小マッチさせると、
サブパターンで02,03と07,08と12,13と17,18,19,20行目がそれぞれきちんとマッチしてくれるんですが、

今度は<img>を含むdivだけをマッチさせようとして、「<div>\n(.+\n<img>)\n<div>」で最小マッチをさせると、
02,03と07,08,09,10,11,12,13行目にマッチしてしまいます。
ここで02,03と12,13行目だけにマッチさせるにはどうすればいいのでしょうか?
いろいろ考えたのですがよくわかりません。
どなたかよろしくお願いします。
0159nobodyさん2007/09/02(日) 19:35:53ID:/HflMMhV
↑
すいません
「02,03と07,08と12,13と17,18,19,20行目がそれぞれきちんとマッチしてくれる」は
02,03と07,08と12,13の間違いですね
0160nobodyさん2007/09/02(日) 20:08:53ID:???
すいません自己解決しました
「<div>\n((?:[^<]|<(?!div))+\n<img>)\n<div>」
これでいけるんですね
0161nobodyさん2007/09/04(火) 05:14:07ID:p30GnV0e
IPアドレスの正規表現についてやっぱりわからなかったです。
2オクテッド目以降は*が来てもOKとするにはどうすればよいでしょうか?
192.168.50.*
192.168.*.*
192.*.*.*
192.168.50.5
1000.1000.1000.1000
これらはすべてOKとします。
0162nobodyさん2007/09/04(火) 09:42:52ID:???
>>161
> 2オクテッド目以降は*が来てもOKとするにはどうすればよいでしょうか?

それ先に言えよ!
どういう結果が欲しくて、どう書いたら、どうダメだったか、を具体的に書かんと。
あと、使用してる処理系 (言語やソフトウェア) も。

で、ダメだった正規表現中の [*(\d+)] だけど、
[] は「文字クラス」の正規表現なので、
>>154 の言っているように * ( 数字 + ) のいずれかの「文字」を表す。
「* または数字」を表現したいのであれば、 (\*|\d+) みたいにする。

ので、こうかな。
(\d+)(\.(\*|\d+)){3}
0163nobodyさん2007/09/04(火) 11:21:03ID:/G1gxUUQ
$` (マッチした文字列の前にあるすべての文字列 )
↑これの使い方を教えてください。言語はPerlです。
0164nobodyさん2007/09/04(火) 11:29:12ID:???
>>163

"hoge" =~ /og/;
print join(",", $`, $&, $'), "\n";

↑こんな感じで、この場合は "hoge" に対して "og" がマッチするので、
$`, $&, $' にはそれぞれ "og" の前の "h", "og", "og" の後ろの "e" が格納される。
0165nobodyさん2007/09/04(火) 11:54:02ID:/G1gxUUQ
>>164
できました。ありがとうございます。
0166nobodyさん2007/09/09(日) 01:04:12ID:???
***.com([0-9]もしくは[a-z]の文字が3つ並び、その後に.com)の表記方法を教えてください
0167nobodyさん2007/09/10(月) 21:26:12ID:lrmAiBXN
>>166
Perl互換の正規表現だと

[0-9a-z]{3}\.com
0168nobodyさん2007/09/12(水) 05:01:53ID:???
>>166
\w{3}\.com
0169nobodyさん2007/09/12(水) 11:22:48ID:DkIOyoGe
>>168
それだと大文字とアンダースコアにもマッチしてしまいます。
0170nobodyさん2007/09/15(土) 15:32:58ID:???
<title>ほげほげ</title>
の「ほげほげ」だけを抜き出すのにはどう表記すればいいのでしょうか?
0171nobodyさん2007/09/15(土) 16:48:18ID:???
/<title>([^<]+)<\/title>/
0172nobodyさん2007/09/15(土) 17:17:54ID:???
>>171
ありがとうございます。
0173nobodyさん2007/09/16(日) 01:35:56ID:6P4HpCmY
PHP 4.4.7で

hoge
hage
123.txt

の中から 123 を抜き出したいんだけど
"/^(.+?).txt/"
だと当然

hoge
hage
123

がマッチしてしまう。
hoge や hage は任意の文字列で数字が入る可能性もあるのだけど、どうやって抽出したらいいんでしょう。
01741732007/09/16(日) 02:11:14ID:???
マッチした文字列を
strrev()
で逆順にして、今度は
txt. で再度マッチングさせたらとりあえず抽出できました。それをもう一度逆順に。
こんな力業じゃなくて他に方法があるんだろうな……。
0175nobodyさん2007/09/16(日) 02:19:07ID:???
^^
0176nobodyさん2007/09/16(日) 03:52:16ID:vOvwrq99
>>173
前後にデリミタ (「/」) が付いているという事はPerl互換の正規表現関数を使うのでありましょうが、
そうであれば 「.」 はs修飾子がない限り改行にマッチせず、 よって

/^(.+?).txt/

は

hoge
hage
123.txt

にマッチせず、 したがって

hoge
hage
123

がキャプチャされることはないはずです。
0177nobodyさん2007/09/16(日) 12:32:40ID:???
>>173
まあとにかく「マッチしてしまう」とかいうそのコードを晒してみ。
0178nobodyさん2007/09/16(日) 13:59:22ID:G/qusHMm
$bairitsu = 0.5;という風に$bairitsuに倍率を入れておいて
height:244pt を height:122pt…
height:244pt を height="150"に
といった具合にheight:●●ptやheight="●●"の数値部分を
$bairitsu倍して置換するにはどのようにすればいいですかね?
やろうとしてることは、エクセルで作ってHTMLで保存したものを、
A4サイズの用紙に合うようにHTMLの中にあるサイズ指定を変更したいです。
使用言語はPerlです。よろしくお願いします。
01791732007/09/16(日) 15:18:36ID:6P4HpCmY
>>175
それは……ヒント? それともAA?

>>176
失礼。パターンを行頭にしたり行末にしたり改行文字にしたりしてるうちにこんがらかってしまったみたい。
正確には
"/^(.+?).txt/"
でマッチしました。

>>177
コード的にはこんな感じ。

$string = "
hoge
hage
123.txt
";
preg_match("/^(.+?).txt/", $string, $matches);
preg_match("/txt.(.*?)\r/", strrev($matches[0]), $matches);
echo strrev($matches[1]);
// 結果 123

PHPも正規表現も初心者なので変な書き方してるかもだけど……。
01801732007/09/16(日) 15:27:38ID:???
あれ?正確にはも何も最初に書いたのであってるなあ。
なんで「マッチしてしまう」のだろう。
0181nobodyさん2007/09/16(日) 21:38:24ID:YMkvDZNb
>>179
ああ、 改行コードをCRにしているのですね。
私は

> 「.」 はs修飾子がない限り改行にマッチせず

と申しましたが、 正確には 「LFにマッチせず」 でありまして、 CRにはマッチします。

普通はスクリプトの内部では文字列の改行コードをLFにするものですが、
何か理由があってCRにしているのですか。
0182nobodyさん2007/09/16(日) 21:48:57ID:YMkvDZNb
改行コードがLFなら、 m修飾子を使うことにより 「^」 が行頭にマッチするようになるのです。
01831732007/09/17(月) 00:37:12ID:/5o1hJUZ
>>181
> と申しましたが、 正確には 「LFにマッチせず」 でありまして、 CRにはマッチします。

あー、そういう事なのか……。
勉強になります。

> 何か理由があってCRにしているのですか。

実はいつも決まった形式で入稿されるテキスト原稿を決まった形式のHTMLにするだけの仕事が定期で入ってくるんです。
で、毎回毎回コピペにつぐコピペで対応し続けるのもバカくさいので極力自動化しようと思い、PHPでシコシコ書いている次第。
そのプログラムに食わせるお客さんからの入稿原稿を元に作ってたのでCRになってました。
試しに改行コードをLFにしてm修飾子というのを試したらうまくいきました。

なるほどもらった原稿をLFに変換してから使えばいいわけだな。
ありがとーございました!
0184nobodyさん2007/09/17(月) 01:05:58ID:T68tRmUw
あと1つ指摘しますと、 「.txt」 は 「\.txt」 にすべきですね。
01851732007/09/17(月) 15:37:44ID:/5o1hJUZ
> あと1つ指摘しますと、 「.txt」 は 「\.txt」 にすべきですね。

おーなるほど。ありがとうございます。
0186nobodyさん2007/09/18(火) 14:10:13ID:hpuf++fz
Perlを使って、アフィリエイトのコードやJavaScriptなどを含むコメントタグがなぜか削除できません。

例)
<!--
 コード
  ・
  ・
-->

HTMLタグは s/<.*?>//sg; とすれば削除できますが
なぜかコメントタグだけが残ってしまいます。

コメントタグの開始「<」と終了「>」以外の全ての文字列・記号・改行コードを削除したうえで
s/<>//g; としてみましたが削除することができません。

s/<//g;
s/>//g;
とするとなぜか削除できます。

うまく削除できる方法をご存知の方がいたら教えて下さい。
0187nobodyさん2007/09/18(火) 16:31:55ID:???
前処理としてまず s/<!--.*?-->//gs やってみたら?
コメントタグのネストはないだろうし(JavaScriptとかで書き出してたら別だけど・・)
0188nobodyさん2007/09/19(水) 07:54:55ID:???
>>187
レスどうもありがとう。
s/<!--.*?-->//gsでもなぜかうまくいかないので
コメント行が現れたらif文でスルーするようにしました。
0189nobodyさん2007/09/19(水) 21:54:47ID:???
PHPで正規表現勉強したいんですが、オライリーのふくろう本を読めるでしょうか?
もちろん本人の技量にもよると思いますが、Perlをまったく知らない人間がという解釈でお願いします。
逆に文字列処理をしたいなら、Perlを一からやっとけみたいなのもありです。
0190nobodyさん2007/09/20(木) 00:20:26ID:???
>>189
preg_.*系関数ならPerl互換なのでふくろう本の記述が使えると思う。
というかね、ふくろう本のキモは処理系にほとんど依存しない3章と4章で、
それ以外はおまけだ。熟読すべし。
0191nobodyさん2007/09/20(木) 01:57:42ID:???
ありがとう。時期を見計らって購入するよ。第三版出るみたいだし
0192nobodyさん2007/09/20(木) 02:42:28ID:???
>>191
え、日本語訳出るの?
0193nobodyさん2007/09/20(木) 13:36:17ID:KlmMrt1+
<TD width="52" height="25" bordercolor="#CCCCCC" valign="middle">
<div align="center">F8FA</div>
</TD>

これの

「F8FA」の部分をpreg_match_all取得したいのですが、
'/<TD .*><div .*>(.*)</div><\/TD>/Ums'

としたのですが、何も取得されません。
どのように表記すれば良いのでしょうか?
0194nobodyさん2007/09/20(木) 13:42:18ID:???
/<TD.*?><div.*?>(.*)?</div><\/TD>/

こんな感じ?
0195nobodyさん2007/09/20(木) 13:44:34ID:???
試してないけどひとまずパッと見でおかしそうなのを直すとこう?
'/<TD .*>\s*<div .*>(.*)<\/div>\s*<\/TD>/Ums'
0196nobodyさん2007/09/20(木) 17:00:54ID:SqIRO2nC
'#<TD(?:\s[^>]*)?>\s*<div(?:\s[^>]*)?>(.*)</div>\s*</TD>#ms'
0197nobodyさん2007/09/20(木) 19:58:25ID:???
>>193
正規表現は二作出てるから次も一年たった今頃出るかなという予想込みだけど出なかったら出ないのもタイミングかなと。
0198nobodyさん2007/09/20(木) 22:27:42ID:???
>>197
日本語でおk
0199nobodyさん2007/09/20(木) 23:09:32ID:???
>>198
おk!=日本語
0200nobodyさん2007/09/21(金) 00:43:48ID:???
>>191
ソースは?
0201nobodyさん2007/10/02(火) 19:12:55ID:DsttFroa
PHPの正規表現でユーザーエージェント(IE限定)から
ブラウザバージョンとOSのバージョンを取得するため
以下を作成しました
preg_match('/Mozilla\/.*(MSIE [0-9\.]+);.*(Win[^;\)]+|Mac[^;\)]+).*/i', $lua, $match)
ほぼ間違いなく取得できるのですが唯一以下形式のエージェントのみ
失敗します
Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; Yahoo! JAPAN Version Windows 95/NT CD-ROM Edition 1.0.; DigExt)
古いバージョンなので切り捨てても良いとは思うのですが悔しいので
どうすれば正しく取得できるか教えていただけないでしょうか?

上記の正規表現では
MSIE 5.0
Windows 95/NT CD-ROM Edition 1.0.

ほしいのは以下
MSIE 5.0
Windows 98
0202nobodyさん2007/10/02(火) 19:26:37ID:???
m#(MSIE\D*[\d\.]+).*?((?:Win|Mac)\D+\d+)#

こんな風でどう?
0203nobodyさん2007/10/02(火) 19:34:02ID:DsttFroa
>>202
ありがとうございます
おかげ様でできました
比較検証して勉強させてもらいます
0204nobodyさん2007/10/05(金) 23:08:47ID:ivRnBDKk
質問です

$text = "第41条 [国会]は、[国権]の最高機関であつて、国の唯一の[立法機関]である。";

というテキストで[]でくくられた部分を検索エンジンに飛ばすためのリンクに書き換えるための置換処理を行いたいと考えています。
そこで下のように組んでみたところ

$text =~ s/\[(.*)\]/(<a href=\/http:\/\/foo.bar?query=\"$1\">$1<\/a>)/;

置換の対象となるカッコは行の先頭の[から行の最後の]までが対象となってしまい。上手く機能しません。
この置換処理はどうかけば、いいのでしょうか?
0205nobodyさん2007/10/06(土) 00:06:57ID:???
>>204
* や + は、そのままだと最長の文字列でマッチしてしまうので、
最短マッチにするために .*? みたいにすると良い。

あと、繰り返し処理させるために、 g オプション (/.../g みたいな) を付けるよろし。
0206nobodyさん2007/10/06(土) 00:07:46ID:???
$text=~ s#\[(.*?)\]#my$r=$1;(my$s=$1)=~s/([^\w ])/'%'.unpack('H2',$1)/ge;
$s=~tr/ /+/;'[<a href="http://foo.bar?query='.$s.";\">$r</a>]"#ges;

こんな風でどう?
0207nobodyさん2007/10/06(土) 00:35:40ID:1+GhnPpX
>>205-206
どちらも上手く機能しました。
奥が深いですね
0208nobodyさん2007/10/06(土) 16:42:21ID:kTx5Crj6
普通の文字として\を表現するにはどうすればいいですか?
C言語風には、'\\'みたいなやつです
0209nobodyさん2007/10/06(土) 17:45:43ID:???
まずはそれを試してみてください
0210nobodyさん2007/10/06(土) 17:50:21ID:kTx5Crj6
ためしたけど、駄目でした。
\\\ってかいたら一個認識した。
でも\\って連続する文字列は、\\\\\\だと駄目だった。
謎
検索に使ってるエディタは、UnEditorです
0211nobodyさん2007/10/06(土) 18:29:58ID:C0xnGICK
>>210
「\\\\」 というエスケープシーケンスが解釈されて文字列 「\\」 になり、 文字列 「\\」 が正規表現として解釈されて 「\」 を表すと見た。
その推測からすると、 「\\」 を表すには 「\\\\\\\\」 と打てばよい。
0212nobodyさん2007/10/06(土) 18:34:59ID:kTx5Crj6
>>211
なんという\
いけました。ありがとうございます。

0213nobodyさん2007/10/07(日) 17:23:56ID:bdyGFUK8
半角英数文字だと>>205の方法でOKなんすですが、日本語の文字列の場合、エンコードする必要があるので
>>206のようにしなければならないわけですね。今、気がつきましたよ。
0214nobodyさん2007/10/25(木) 15:30:25ID:???
phpで、変数にファイル名を入れて処理したいんですが
正規表現で文字制限をかける場合どのように書けばよいでしょうか?

日本語を含まなければ簡単そうですが、、、、
0215nobodyさん2007/10/25(木) 16:34:35ID:???
>>214
どゆこと?どんな制限をかけたい?
0216nobodyさん2007/10/27(土) 01:42:21ID:???
>>214
つマルチバイト
0217nobodyさん2007/11/05(月) 12:34:21ID:???
(愛うえお) [下記kuけこ] saし素せそ [07.07.07]
↑の様にファイルに名前をつけているのですが、これを下のようにリネームしたいのです。
(愛うえお) [07.07.07] [下記kuけこ] saし素せそ

[07.07.07]は日付です。2006/10/15なら[06.10.15]となります。
正規表現でどのように表現したら一括変換できるでしょうか?
どなたか御教示ください。
0218nobodyさん2007/11/05(月) 12:38:12ID:EztAcqYR
もしスレ違いでしたら案内していただけると助かります
0219nobodyさん2007/11/05(月) 12:47:34ID:???
>>217
まずは >>1 の二項目。
02202172007/11/05(月) 13:09:25ID:EztAcqYR
>>219
失礼しましたPerl5です。
http://www.hi-ho.ne.jp/~babaq/bregexp.htmlのDLLを使って
Nameryでリネームするつもりです。

的外れなレスだったらすみません
0221nobodyさん2007/11/05(月) 13:59:05ID:???
「連続置換・マクロ」にチェックして、こんなんでどう?

s/^(\(.+?\))( \[.+?\] .+?)( \[.+?\])/\1\3\2/

空白の処理とか適当なので、あとは自分で調べていろいろいじってみてちょ。
0222nobodyさん2007/11/05(月) 14:37:50ID:EztAcqYR
>>221
バッチリできました!ありがとうございました
しかし依頼するカタチを間違えていましたorz
gomennnasaigomennnasaigomennnasai

(愛うえお) [07.07.07] [下記kuけこ] saし素せそ
↑ではなく↓にするにはどうすれば・・・
(愛うえお) [下記kuけこ] [07.07.07] saし素せそ
0223nobodyさん2007/11/05(月) 14:41:33ID:EztAcqYR
間違えた>>222は無視してください

はぁゆとりすぎて面目ない
0224nobodyさん2007/11/12(月) 05:47:51ID:Kg6xKnVX
「あいうえおABC+F481ABC+F485かきくけこABC+F7A5さしすせそABC+F3F0ABC+F39EたちつてとABC+F65AなにぬねのABC+F485ABC+F7A5はひふへほABC+F7A5ABC+F39Eまみむめも」

上記の中に、「ABC+16進数x2回」がいくつ含まれているかをPHPの正規表現で表すにはどうかけばよろしいでしょうか?
ご鞭撻よろしくお願いいたします。
0225nobodyさん2007/11/12(月) 10:41:44ID:???
>>224
正規表現はいまひとつなのでもっと上手いやり方があるかもしれないが・・・
$input_str = "あいうえおABC+F481ABC+F485かきくけこABC+F7A5さしすせそABC+F3F0ABC+F39EたちつてとABC+F65AなにぬねのABC+F485ABC+F7A5はひふへほABC+F7A5ABC+F39Eまみむめも";
echo preg_match_all("/ABC\+[A-F\d]{4}/",$input_str,$out_ary);
※$out_aryは無いとエラーになるので消さないで
0226nobodyさん2007/11/13(火) 16:45:36ID:KDxCSN/c
質問です

PHPスクリプトでpreg_match("/^[^@]+@[^.]+\..+/", $superunkoman))
という正規表現があったのですが

^[^@]+   ←最初の文字が@以外の文字の一回以上の繰り返し
@      ←で、@が入り
[^.]     ←この部分が理解できません。

教えてください
0227nobodyさん2007/11/13(火) 17:15:59ID:???
>>226
ドット以外の文字列が1つ以上
hoge@.ドメイン.ne.jp
だとか画駄目ってことじゃないの?
0228nobodyさん2007/11/13(火) 17:39:32ID:???
>>227
ありがとうございました。そのとおりですね
0229nobodyさん2007/11/13(火) 22:44:37ID:???
質問です
phpスクリプトで

$str = ereg_replace(

"(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)",

"<a href=\"\\1\\2\">\\1\\2</a>",

$str);

この正規表現の(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)の部分とhref=\"\\1\\2\">\\1\\2</a>この部分は
何を表しているのか教えてくれませんか?
0230nobodyさん2007/11/14(水) 12:22:47ID:E8xVrSo0
あげわすれ
0231nobodyさん2007/11/14(水) 13:37:57ID:???
>>230
次回からはまずマニュアル嫁

PHPマニュアルより引用
string ereg_replace ( string pattern, string replacement, string string )
pattern の中に括弧でくくられた部分 文字列が含まれている場合、
replacement の中に \\数字 のような部分文字列を埋め込むことも
できます。この部分は、 「数字」番目の括弧でくくられた部分文字列に
マッチする文字列に 置き換えられます。また、\\0 は文字列全体を
指します。9 個までの部分文字列を使うことができます。括弧は
入れ子になっていても構いません。この場合は開き括弧 '(' が
最大 9 個まで使用可能です。
0232nobodyさん2007/11/23(金) 11:29:24ID:OIbrK2sw
正規表現を先輩から教えてもらったのですが、
文字列 [全ての文字] を 正規表現 [[]([^\]]+)] で 全ての文字 を取り出
すことができますが、
文字列 {全ての文字} で 全ての文字 を取り出す正規表現を教えてください。
0233nobodyさん2007/11/23(金) 15:30:11ID:???
>>5
0234nobodyさん2007/11/23(金) 20:53:35ID:tvqFA7ba
それは無理ですよ
すべての文字
を取り出す事は
0235nobodyさん2007/11/27(火) 18:05:34ID:fIXcwnBh
Dカップ以上の25歳以下で抽出したいです
PHP5です
0236nobodyさん2007/11/27(火) 19:15:14ID:???
[D-Z]カップ.*(1?[0-9]|2[0-5])歳
0237nobodyさん2007/11/28(水) 13:29:18ID:fpWBgokp
PHPで正規表現であれやこれやと苦戦してます。
で、正規表現チェッカー
 ttp://www.asterworld.com/ja/soft/regexchk.html
 という物をみつけて、こりゃ便利だ!と思ってたのですが
作成した正規表現を preg_replace に設定してもマッチしてくれません。
そんなに方言があるとも思えないのですが...

C#2005の正規表現のようなのですがPerlの正規表現と何がちがうのでしょうか。
C#2005の正規表現をPerlの正規表現に変更するには無理なのでしょうか。
Perlの正規表現を作成するようなソフトはあるのでしょうか?

恐れ入りますがどなたか教えてください 頭がゴチャゴチャしてきて..
0238nobodyさん2007/11/28(水) 15:10:44ID:???
もっとかなり基本的なところで勘違いしているんではないかと想像。
まずは、これ以上ないってくらい単純な正規表現で挙動を比較してみて、
そこから順次複雑な正規表現にしていって差異を見てみては。
02392372007/11/28(水) 15:41:05ID:???
ネットで調べても、どの言語の正規表現なのか今ひとつ判らないので
取り合えずアマゾンで本を注文しました。
言語ごとの差が判るようなものがあれば...
02402382007/11/28(水) 15:48:56ID:???
C# なら .NET なんだろうけど、「詳説 正規表現 (第2版)」には差異などが載ってる。
それで、ぱっと見で、基本的なところは Perl と .NET とで大した差は無いと思う。
02412372007/11/29(木) 13:36:57ID:???
「正規表現の達人」って本を手にして今、読んでますが、
お昼食べた後なんで眠くて眠くて フワァァ(/ 0 ̄)~゜
がんばってみます。。
0242nobodyさん2007/12/11(火) 20:35:33ID:???
すみません、ヘルプをお願いします。
PHPにて、特定の画像ファイル名を持つ<IMG>タグを抽出するという正規表現を作りたいのですが
上手く行かなくて困っております。

どなたか、お助けください。。。
0243nobodyさん2007/12/12(水) 01:18:37ID:???
>>242
もちっとくわしく。src属性以外に属性をもつのかとか。
多分alt属性がついていそうだけど。

preg_match('/<img .*?src=(["¥'])特定のファイル名を表す正規表現¥¥1 .*?>/', src);

とかか。今適当に作ったのでうまく動くかどうかはわからんけど
0244nobodyさん2007/12/19(水) 16:38:31ID:H15tWjcK
PHPのpreg_replaceなんですが、おたたすけ願います。
特定の文字列で囲まれた文字列を変換しない正規表現を教えてください。
たとえば
preg_replace("/aaa/", "[\1]", "aaa aaa aaa aaa aaa")
だと結果は "[aaa] [aaa] [aaa] [aaa] [aaa]" になりますが
preg_replace("/aaa/", "[\1]", "aaa{{{aaa aaa aaa}}}aaa")
となっていたときに
"[aaa]{{{aaa aaa aaa}}}[aaa]" という結果を取得したいんですが
思うように出来ません。

答えを直接出なくてもいいのでヒントだけでも教えてください。
0245nobodyさん2007/12/19(水) 18:16:44ID:???
>>244
後読み表明は量指定子を含められないから、もしpreg_replaceだけでやろうとするなら、
それ以外の部分を食わせておいて置き直すという、やや気持ち悪いことになると思う。

例えばこんなふうに
preg_replace('/(.*?(?:\\Q{{{\\E.*?\\Q}}}\\E.*?)*)(aaa)/', '$1[$2]', "aaa{{{aaa aaa aaa}}}aaa");

分解してから対象の部分だけ処理する等の方法も検討した方が宜しいかと。
0246nobodyさん2007/12/19(水) 18:44:19ID:???
大田区ホームページ:職員の不祥事について(処分の公表)
http://www.city.ota.tokyo.jp/oshirase/mokutekibetsu/other/fusyouji_syobun/index.html

当区職員が傷害の容疑で逮捕されるという事件につきましては、新聞等での報道やホームーページで公表したところですが、今回、事実関係が明らかになり、以下のとおり懲戒処分を行いましたので公表いたします。
 区民の皆様の信頼を裏切ることとなり、誠に申し訳ありません。あらためて、お詫びいたします。

懲戒処分とは
 職員が一定の義務違反を犯した場合に、公務の規律と秩序を維持することを目的として、その責任を追及するために制裁として行う処分です。
 大田区では懲戒処分の公表基準に基づき、免職処分をした場合や特に区民の関心が大きい事案又は社会的影響が大きい事案について、個別の懲戒処分を公表します。
(懲戒処分の制度の詳細は、大田区人事白書をご参照ください。)

処分発令日
 平成19年12月19日

被処分者氏名
 建築調整課 吉原 幸光

処分の内容
 停職3月

処分の理由
 一般非行関係(法令に違反し、全体の奉仕者たるにふさわしくない非行があったため)

事件の概要
 この職員は、平成19年11月16日(金曜日)、勤務時間終了後、東神奈川駅周辺で飲食した後、帰宅途中のJR京浜東北線川崎―蒲田間の電車内において、乗客男性に全治4週間の怪我を負わせる暴行を働き、傷害の容疑により蒲田警察署に現行犯逮捕されました。
 同職員は、東京簡易裁判所に起訴され、罰金刑を申し渡されています。
0247nobodyさん2007/12/22(土) 08:43:52ID:KKfYoqPi
すみません、教えてください。
PHPで携帯電話に文字列を表示する際に、
電話番号の部分をteltoリンクにしたいと思い以下のように書きました。
$bodySTR = preg_replace('/([-0123456789]+)/', '<a href="tel:\\1">\\1</a>',$bodySTR);

当然ながらこれだと、「100円」や「〒123-4567」にも反応してしまいます。

そこで、
「03-1234-5678」「090-1234-5678」「03−1234−5678」等にマッチして
「100」や「123-4567」にはマッチしない正規表現は可能でしょうか?
0248nobodyさん2007/12/22(土) 14:06:28ID:???
可能です
0249nobodyさん2007/12/22(土) 16:17:35ID:???
/(0¥d+-¥d{1,4}-¥d{4})/
でどうよ
0250nobodyさん2007/12/22(土) 17:39:05ID:6MoMAQ1+
perlの正規表現について質問です。
>>244の方と同じ様なものなのですが

"test <a href="http://test.jp"> test"
の様な文字列があった場合、タグ内のtestは変更せずに
"[test]<a href="http://test.jp">[test]"
という形にしたいのですが、どのようにすれば宜しいでしょうか。

一度置換した後、<>タグ内の物は[]を外す方法も考えてはみたのですが、
思うように動作させる事が出来ず。ご教授の程、宜しくお願い致します。
0251nobodyさん2007/12/22(土) 17:52:18ID:???
s/(<.*?>|test)/$1?$1:"[$2]"/ges
02522502007/12/22(土) 18:04:13ID:???
>>251
なるほど、どうも有難う御座いました!
■ このスレッドは過去ログ倉庫に格納されています