5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

正規表現 Part5

1 :デフォルトの名無しさん:2008/06/03(火) 22:07:28
正規表現(Regular Expression)スレです。

質問する場合は実装言語や処理系ソフトウェア名を示しておくと話が早いです。

前スレ
正規表現 Part4
http://pc11.2ch.net/test/read.cgi/tech/1186030400/

2 :デフォルトの名無しさん:2008/06/03(火) 22:08:44
◆関連サイト
正規表現メモ
http://www.kt.rim.or.jp/~kbk/regex/regex.html
Perl正規表現雑技
http://www.din.or.jp/~ohzaki/regex.htm
Regular Expression(Riue ちゃんの正規表現講座)
http://www.sixnine.net/regexp/
正規表現パズル
http://oraclesqlpuzzle.hp.infoseek.co.jp/regex/
詳説 正規表現
http://www.oreilly.co.jp/books/4873111307/
正規表現プログラミングFAQ
http://capslockabcjp.kitunebi.com/faq.html
JScript 正規表現の概説
http://msdn.microsoft.com/library/ja/script56/html/js56reconIntroductionToRegularExpressions.asp
.NET Framework 正規表現言語要素
http://msdn.microsoft.com/library/ja/cpgenref/html/cpconregularexpressionslanguageelements.asp

◆関連スレ
[UNIX板] 正規表現
http://pc8.2ch.net/test/read.cgi/unix/1039165754/
[WebProg] 正規表現道場
http://pc11.2ch.net/test/read.cgi/php/1168450843/

◆前スレ
[1] http://pc8.2ch.net/test/read.cgi/tech/1062152374/
[2] http://pc8.2ch.net/test/read.cgi/tech/1131028296/
[3] http://pc11.2ch.net/test/read.cgi/tech/1156413899/
[4] http://pc11.2ch.net/test/read.cgi/tech/1186030400/


3 :デフォルトの名無しさん:2008/06/04(水) 04:23:54
[|:;,  ]{2}[|!:;.,\]
[\∧∨ヮ]
([w]{5}|[w]{3})

これを一行にまとめるとどういう書き方ができるでしょうか?

4 :デフォルトの名無しさん:2008/06/04(水) 04:28:50
([|:;,  ]{2}[|!:;.,\∧∨ヮ]|[w]{5}|[w]{3})

5 :デフォルトの名無しさん:2008/06/04(水) 18:10:12
スルーされにくい質問のテンプレと例

●正規表現の使用環境
Java1.5

●検索か置換か?
検索

●説明
各行の1番目のAまでを検索したい

●対象データ
ABCA
BCAA
CABA

●希望する結果
ABCA
^
BCAA
^^^
CABA
^^


6 :デフォルトの名無しさん:2008/06/05(木) 01:44:43
根性の悪い捻くれた奴が減れば無問題

7 :デフォルトの名無しさん:2008/06/05(木) 20:10:15
このスレの過去ログ集はないんですか?

8 :デフォルトの名無しさん:2008/06/05(木) 20:14:17
>>7
>>2
> ◆前スレ

9 :7:2008/06/06(金) 00:18:32
>>8
ありがとうございます。全部DAT落ちしています。
どこかにHTML化されたものがUPされていませんか?

10 :デフォルトの名無しさん:2008/06/06(金) 00:19:51
>>9
http://2ch.tora3.net/

11 :デフォルトの名無しさん:2008/06/07(土) 01:24:25
ダブルコーテーションで囲まれた部分を検索したいのですが、
囲まれた部分が複数あると全部をまとめて見つけてしまいます。
最初のひとつだけを対象にするにはどう書けば良いでしょうか?

data="あいうえお" name="かきくけこ"

このような文字列の中から
あいうえお
だけを検索したいです。

現在は
reg = New Regex("data=""(?<DATA>.+)""", RegexOptions.Compiled)
というようにしてあります。
これだと、
str = reg.Match(pagedata).Result("${DATA}")
での取得結果が
あいうえお" name="かきくけこ"
になってしまいます。
VB.NETなのですが、宜しくお願いします。


12 :デフォルトの名無しさん:2008/06/07(土) 02:07:35
>>11
reg = New Regex("data=""(?<DATA>.+?)""", RegexOptions.Compiled)

13 :デフォルトの名無しさん:2008/06/07(土) 03:05:29
>>12
すごい!出来ました
ありがとう
色々調べたのに全然違ってた^ー^;)

14 :デフォルトの名無しさん:2008/06/07(土) 04:07:24
"""と3つ続けて書くときもあるんだなぁ
あぼーん対象になってた

15 :デフォルトの名無しさん:2008/06/12(木) 03:01:13
"foo\"bar"@baz.com

ローカルパートの前後の"だけを除去したいのですがどう書けば良いのでしょうか
preg_replace('/[^\\\]"/', '', $str);
では最初の"が除去されませんでした



16 :デフォルトの名無しさん:2008/06/12(木) 09:13:54
/^"|"@/ でいいのでは。
メールアドレスに「\で"をエスケープ」なんて仕様あったっけ?


17 :デフォルトの名無しさん:2008/06/12(木) 09:29:16
おとなしく@で分割して前後削っときなさい

18 :15:2008/06/12(木) 14:16:47
>16
ローカルパートでスペースや","といった文字を使う場合はダブルクォートで括る必要があるみたいです。
受信したメールで希にそういうものがありました。

>17
おとなしくそんな対応にしましたどうもです

19 :デフォルトの名無しさん:2008/06/12(木) 16:36:41
>>18
「""で括る」というのはその通りなんだけど、その括られた中で \" と
いう記述のルールはあるの、ということ。


20 :デフォルトの名無しさん:2008/06/12(木) 17:52:10
>19
http://www003.upp.so-net.ne.jp/hat/imail/sec08.html

>もっと面倒なのは、ユーザ名に「"」や「\」が入っている場合です。
>このときは「""」で括っただけではダメだという決まりがあるので、直前に「\」を付けます。
>次は、ユーザ名が「urashima"taro」の場合と、「urashima\taro」の場合です。

To: "urashima\"taro"@example.com
To: "urashima\\taro"@example.com

だそうです。

21 :デフォルトの名無しさん:2008/06/12(木) 18:23:57
"\""は許されるが、"\\"は許されない

22 :デフォルトの名無しさん:2008/06/12(木) 18:25:55
>>21
また大嘘を…

23 :デフォルトの名無しさん:2008/06/12(木) 19:41:30
>>20
ほんとだ、確認してみたらちゃんとそういうルールがあったね。騒がせてごめん。


24 :デフォルトの名無しさん:2008/06/16(月) 20:51:15
すみません。
sakuraエディタをインストールして
<A href="http://www.xxx.com/" target="_blank">ABC</A>

<A href="http://www.xxx.com/" target="_blank"
title="http://www.xxx.com/">ABC</A>
に置き換える方法を探してるんですけど、別所で
・検索文字列に「<(a|A) ([^>]*)href="([^"]+)"」、置換文字列に「<$1 $2href="$3" title="$3"」と入れる
・置換する。
といわれたのを参考に色々試したんですが、全くの無知なもので、ぜんぜん置き換えできないので、
よければ詳しく教えてください。
テキスト内全部置き換えじゃなくて、通常の置き換えみたいに下方向とか指定できれば助かるんですが、
無理ならHTMLから部分的に切り取ってやってみます。

25 :デフォルトの名無しさん:2008/06/16(月) 21:04:20
正規表現はそれで機能する。実際にsakuraエディタで試した
あとはsakuraエディタの問題だからこれ以上はスレ違い

26 :デフォルトの名無しさん:2008/06/16(月) 21:14:28
href="([^"]+)"
href="$1" title="$1"

めんどくさいし、これでいいよ

27 :デフォルトの名無しさん:2008/06/16(月) 21:27:19
すみません。チェックいれたらできました・・・・
失礼しました。

28 :デフォルトの名無しさん:2008/06/16(月) 21:32:09
ついでに聞きたいんですけど、、

URLにある文字列
たとえば www.abcd などのドメイン名が含まれる場合のみ置き換えて、他のドメインは一切触らないってコマンドも可能ですか?
www.abcd.aa www.abcd.ab とwww.abcdが含まれる物は当然全部置き換えるようにしたいんですけど……

29 :デフォルトの名無しさん:2008/06/18(水) 17:36:50
href="www\.abcd.*?"

30 :28:2008/06/19(木) 07:51:48
>29 ありがとうございます。
でもやってみたけど出来ませんでした。()と[]で囲んでみましたが、駄目でした。

>24も私なんですけど、
色々調べてみたんですが、([^"]+)の( )内は$で指定できるってのは分かったんですが、
[^"]+でどうしてurlが指定できてるのか全く理解できません。

とりあえず、以下の置き換え方法が分かれば、知りたいこと全部解決するのですが、

<A href="http://www.xxx.com/a/a.html" target="_blank">AA</A>
<A href="http://www.123.com/a/a.html" target="_blank">123</A>
<A href="http://www.xxx.com/a/b.html" target="_blank">AB</A>
<A href="http://www.123.com/a/bhtml" target="_blank">123</A>
<A href="http://www.xxx.com/b/c.html" target="_blank">BC</A>
上記URLが並んでいたとして、以下のように置き換え。
<A href="http://www.xxx.com/a/a.html" target="_blank" title="AA http://www.xxx.com/a/a.html">AA</A>
<A href="http://www.123.com/a/a.html" target="_blank">123</A>
<A href="http://www.xxx.com/a/b.html" target="_blank" title="AB http://www.xxx.com/a/b.html">AB</A>
<A href="http://www.123.com/a/b.html" target="_blank" title="123_b.html">123</A>
<A href="http://www.xxx.com/b/c.html" target="_blank" title="BC (http://www.xxx.com/a/b.html)">BC</A>
4と5行目は可能ならって感じですが、これ全部分かれば今後の応用もアレンジできそうなので。
>24が解決すれば全部自分で出来そうだと思ってましたが、甘かったです。

図々しいですが、分かる方いましたら教えてください。


31 :デフォルトの名無しさん:2008/06/19(木) 09:27:36
ここまでくると、エディタの置換一発って訳にはいかないだろう。
perlとかrubyとか、正規表現とテキストの扱いに長けたスクリプト言語を使うとか、
エディタの置換でも、一発で全て解決しようとせずに
多段階で置換するとか、目的の物を他と区別出来る一旦違う形に変換するとか、
そういう工夫が要る。
個人的には、数が多くて今後もまたやる作業なら、何らかの言語を使う。

32 :デフォルトの名無しさん:2008/06/19(木) 09:43:42
出来ないことはないだろうけど、タグが厄介なんだよな。
正規表現マッチングする前にHTMLパーサーとか使って処理したい。


33 :デフォルトの名無しさん:2008/06/19(木) 09:56:48
パズル的な楽しさを追求するならいいけど、
実用だったら早々に見切りを付けるのも肝心だよね。
複雑な正規表現は、後で手直しするのも面倒だし。

34 :30:2008/06/19(木) 11:32:57
ありがとう御座います。
では、これだけでも無理でしょうか?
<A href="http://www.xxx.com/a/a.html" target="_blank">AA</A>
<A href="http://www.123.com/a/a.html" target="_blank">123</A>
<A href="http://www.xxx.com/a/b.html" target="_blank">AB</A>

上記URLが並んでいたとして、以下のように置き換え。
<A href="http://www.xxx.com/a/a.html" target="_blank" title="http://www.xxx.com/a/a.html">AA</A>
<A href="http://www.123.com/a/a.html" target="_blank">123</A>
<A href="http://www.xxx.com/a/b.html" target="_blank" title="http://www.xxx.com/a/b.html">AB</A>

29さんのでは理解できなかったので、要するに、1行目と3行目は24の方法で出来てるので、
24の方法に「この部分がマッチした場合のみ置き換え」って感じで加工したいのですが、
([^"]+)の( )内を弄ればいいんでしょうけどやってみましたが、検索できなくなってしまいます。

35 :デフォルトの名無しさん:2008/06/19(木) 12:09:29
>>34
暇なので書いてみた。Pythonだけど、出来合いのHTMLパーサは使ってない。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6967.txt

>>30のようなことをやりたければ、ツリーパーサがないと面倒だな。

36 :34:2008/06/19(木) 12:35:03

こんなに複雑なこと頼んでたんですか……
置き換えで出来ると思ったけど甘かったんですね。
使い方調べてやってみます。
ありがとう御座いました。

37 :34:2008/06/19(木) 12:58:55
すみません。
何かソフト必要なんでしょうか?Windows使用です。
最後の("http://www.xxx.com")を書き換えることぐらいしか検討つきません。
abc.txtの内容を置き換えるとして、どのようにしてやればいいのか教えてほしいです。
いまここをみてるんですが、分かりかけてるようで分からない。
ttp://d.hatena.ne.jp/cloudnet/20080609/pythonfile

Blenderで3Dメッシュ加工したことはありますが、関係ないですよね・・



38 :デフォルトの名無しさん:2008/06/19(木) 13:37:21
えーと
pythonのスクリプトだから、pythonがインストールされていなければダメだよ

foo.pyという名前で保存したとすると
python foo.py <hoge.html
のようにして標準入力から食わせてやるとよい

39 :デフォルトの名無しさん:2008/06/19(木) 13:54:59
perl だとこんな具合

$htm = <<_EOF;
<A href="http://www.xxx.com/a/a.html" target="_blank">AA</A>
<A href="http://www.123.com/a/a.html" target="_blank">123</A>
<A href="http://www.xxx.com/a/b.html" target="_blank">AB</A>
<A href="http://www.123.com/a/bhtml" target="_blank">123</A>
<A href="http://www.xxx.com/b/c.html" target="_blank">BC</A>
_EOF

$htm =~ s/<(a href=)"(http:\/\/www.xxx.com\/[^"]+)"([^>]*)>(.*?)(<\/a>)/<$1$2$3 title="$4 $2">$4$5/ig;
print '-'x78,"\n";
print $htm;
print '-'x78,"\n";

実行結果
------------------------------------------------------------------------------
<A href=http://www.xxx.com/a/a.html target="_blank" title="AA http://www.xxx.com/a/a.html">AA</A>
<A href="http://www.123.com/a/a.html" target="_blank">123</A>
<A href=http://www.xxx.com/a/b.html target="_blank" title="AB http://www.xxx.com/a/b.html">AB</A>
<A href="http://www.123.com/a/bhtml" target="_blank">123</A>
<A href=http://www.xxx.com/b/c.html target="_blank" title="BC http://www.xxx.com/b/c.html">BC</A>
------------------------------------------------------------------------------

40 :デフォルトの名無しさん:2008/06/19(木) 14:04:24
anchor以外の任意のインライン要素が
anchorの子要素になり得るので注意

41 :デフォルトの名無しさん:2008/06/19(木) 14:30:04
えっと
anchorとか
foo.pyとか全く理解できないんですが、
いまここから
http://www.activestate.com/
ActivePerl 5.10.0.1003 for Windows (x86)をダウンロードしてインストールしてみました。


42 :デフォルトの名無しさん:2008/06/19(木) 14:36:55
なぜPerlを…Pythonってwindows用のバイナリないの?

43 :デフォルトの名無しさん:2008/06/19(木) 14:39:39
ActivePythonというのがあるし
自分でコンパイルもできるよ

44 :デフォルトの名無しさん:2008/06/19(木) 14:39:56
同じとこにあるよ。ActivePython

45 :デフォルトの名無しさん:2008/06/19(木) 14:43:45
あのー全く無知なもんで、scriptと言えばwebのjavascriptと cgiscriptしか分からないのですが、
やりたいのは、sakuraエディタで今開いてるabc.txtの置き換えです。
35サンと39さんが同じ人かは分かりませんが、39さんの手法が分かりやすそうなんで、
別の人だったら35さんには悪いですが、pealって書いてあるから
必要だと思ってインストールしてみたんですが、動かし方がよく分かりません。;;

46 :デフォルトの名無しさん:2008/06/19(木) 14:45:23
あ、あったんで、今ActivePython落としてます。

47 :デフォルトの名無しさん:2008/06/19(木) 14:52:11
wxPython2.8-win32-unicode-2.8.7.1-py25.exe
を落としてインストールしました。
前にBlender弄ったときに入れた気もしますが。

48 :デフォルトの名無しさん:2008/06/19(木) 15:00:31
Python Shellを起動してabc.txtを開いてみたんですが、これにどうにかしてupしてもらったtxtの内容を使えばいいのかな?

49 :デフォルトの名無しさん:2008/06/19(木) 16:13:44
ここは君の作業ログじゃないから、
試行錯誤して困ったらまたおいで。

50 :48:2008/06/19(木) 18:41:53
最終的に
python234jp-20040927
をインストールして、helpファイルずっと見てるんですが、さっぱり理解できません;;
pythonについては別板で聞いたほうがいいんですかね?

51 :39:2008/06/19(木) 19:14:10
# unko.pl
# ActivePerl で動作確認済
# つかいかた...コマンドプロンプトで C> unko.pl abc.txt
open FILE, '<', $ARGV[0];
read FILE, $htm, -s FILE;
close FILE;

$htm =~ s/<(a href=)"(http:\/\/www.xxx.com\/[^"]+)"([^>]*)>(.*?)(<\/a>)/<$1$2$3 title="$4 $2">$4$5/ig;
print $htm;

52 :デフォルトの名無しさん:2008/06/19(木) 20:30:01
やっぱり別の人だったんですね。
とりあえず、>51の4行目以下をテキストにコピーして、unko.plで保存。
cmd.exeと同じディレクトリにabc.txtとunko.plをおいて試しましたが、駄目でした。
処理が始まって、終わったあとabc.txt見ても内容変化してないです。
原因は、www.xxx.com/abc.def?ghi=xyz.とかになってるとして、?とか=の文字が原因になってるとかありませんか?
それか、_blank">ここが日本語になってる</a>のが原因とか・・・
pythonのほうも弄ってますが、まだわかりません。

53 :デフォルトの名無しさん:2008/06/19(木) 22:13:56
JScript 5.6(WSH)で行先頭の数式を検索したいのですが、
単体の数字や何故か英単語まで反応してしまって困っています。
要するに数値といずれかの演算子を含むパターンが組めればよいのですが、正規表現に馴れておらずうまくいきません。
問題なく検索可能なパターンを教えていただけないでしょうか?

「50+2*2 付随テキスト」にはマッチする。
「50 付随テキスト」にはマッチしない。

現在問題の出ているパターン
 new RegExp("^([\d\+\-d\*\/\(\)r@]+)[ | ]*(.*)", "i") //d, r, z ,@は演算子としてそれ以降の処理で使用しています

54 :デフォルトの名無しさん:2008/06/19(木) 23:35:08
>>53
とりあえずヒントとしては、
●JavaScriptの文字列定数内では \ がエスケープ文字
●[演算子じゃない文字]([演算子][演算子じゃない文字])+


55 :デフォルトの名無しさん:2008/06/19(木) 23:36:33
●[演算子じゃない文字]+([演算子][演算子じゃない文字]+)+
に訂正。
厳密じゃないけどね。


56 :53:2008/06/20(金) 00:23:42
>>54
うまくいきました。ありがとうございます。

57 :デフォルトの名無しさん:2008/06/20(金) 00:51:11
>>52
おまえなぁ、要求をコロコロ変えるなよ。
あとからあとからチビチビ仕様を変更せずに、最初にキッチリ書いとけよ。

58 :デフォルトの名無しさん:2008/06/20(金) 01:01:11
>>52
わかったかった。「置き換える」の意味が、やっとわかったよ。
ここは正規表現スレなんで、置換の事だと勘違いしてた。
unko.pl は画面に表示するだけだ。
置き換えしたければ abc.txt を open して print 文で $htm を書き出せ。

59 :デフォルトの名無しさん:2008/06/20(金) 06:58:38
入力が決まらないのに正規表現を書くなんて徒労もいいとこだお

60 :デフォルトの名無しさん:2008/06/20(金) 07:40:45
51で問題ありませんでした。
私のやり方が間違ってたようです。
お二人には感謝してます。
プログラムの面白さが分かったような気がするので、これを機に少しずつ勉強初めてみます。
最初はやっぱりcgiとかがいいんでしょうか?
web関係で役立つスキルが欲しいのですが・・・・

61 :デフォルトの名無しさん:2008/06/20(金) 10:21:09
>>60
お手軽さならJavaScriptかな。
ローカルでも実行可能だし、正規表現も扱えるし、ページを動的加工して遊べるし。

62 :デフォルトの七資産:2008/06/20(金) 16:04:20
都道府県名からの住所を一行で入力する

**県※※郡○○市●●-●●

この文字列を
都道府県名、郡名、市区町村名、その他に分けるときの正規表現はどうしたらいいのでしょう?

※「村山市」や「四日市市」など市区町村名に「市区町村」の四文字が入ったものは考えないものとします。
言語はPHPです。

63 :デフォルトの名無しさん:2008/06/20(金) 18:11:47
>>62
自分でどこまで書いてみた?


64 :デフォルトの名無しさん:2008/06/20(金) 19:23:36
PHPの文法は知らないけど、単純に考えると
/([^県]+県)([^郡]+郡)([^市]+市)(.*)/で、$1〜$4かなぁ。
郡って必ず付くのかな。

65 :デフォルトの名無しさん:2008/06/20(金) 20:41:43
/([^県]+県|[^道]+道|[^府]+府)([^郡]+郡|[^市]+市)(.*)/ の方が良くないかな。

66 :デフォルトの名無しさん:2008/06/20(金) 23:59:54
明治以降、郡に属している市はない

67 :デフォルトの名無しさん:2008/06/23(月) 22:05:00
書き込ませて頂きます。

Adobe Goliveの置換機能で、正規表現の奥深さを
知りました。

<!-- start -->
<div class="menu">
<ul>
<li></li>
<li></li>
<li></li>
</ul>
</div>
<!-- end -->

これの<!-- start -->から<!-- end -->までを選択したいとき、

<!-- start -->\n.*\n.*\n.*\n.*\n.*\n.*\n.*\n.*<!-- end -->とすると
選択はできました。
しかし\nや.*がたくさん出てきてしまい、困っています。

もう少し簡素化できないでしょうか?
ご教授お願いします。<(__)>


68 :デフォルトの名無しさん:2008/06/23(月) 22:27:03
Goliveさんの仕様は知らんけど、.が改行を含まない仕様なのかな?
<!-- start -->(\n|.)*<!-- end -->
こんな感じ?


69 :デフォルトの名無しさん:2008/06/24(火) 02:17:47
>>67
mオプションとか
マルチラインモードとか
そういう機能はない?

70 :67:2008/06/24(火) 06:16:41
>>68さん
まさしくそれです!検証したところバッチリ動作しました。
これで管理が楽になると思います。
ありがとうございます(^^)

>>69さん
mオプション、マルチラインモード等の語句でググってきました。
残念ながら今の自分の頭では理解しきれず、その機能があるかどうか不明
です...(ノД`)・゜・。ゴメンナサイ,モット勉強シテキマス




また行き詰まったとき、来させて頂きます。
教えて頂いた方々、本当にありがとうございました。


71 :デフォルトの名無しさん:2008/06/25(水) 16:48:01
正規表現ほとんど触ったことなかったんですが、
1文字以上で特定の文字(チェックしたいのは [ と ] )を含まないってどう書くんでしょうか?



72 :デフォルトの名無しさん:2008/06/25(水) 17:43:46
>>71
>>2 に書いてあるよ。それ読んでもわからなかったら、また質問しにおいで。

73 :71:2008/06/27(金) 15:05:09
なかなか難しい。
C#で試しに'A'がある文字列をはじくように書いてみましたがうまく
動きませんでした。 

string pat = @"^(?!A)*$";
bool result;
result = Regex.IsMatch( "あいうえお", pat );
result = Regex.IsMatch( "あいうAえお", pat );

pat を @"^[^A]*$"
にしてみたらうまく動いたけど、なんで最初の条件で動かないんでしょうか・・。


74 :デフォルトの名無しさん:2008/06/27(金) 15:29:12
> string pat = @"^(?!A)*$";

.netの正規表現には詳しくないんだけど、一般的な解釈で考えるとこれ
はパターンの文法エラーになってもおかしくないよ。ふつうは先読みや
後読みに繰り返し(+ * {n,m})は付けられない。先読みや後読みは文字を
消費しないので、繰り返しても意味がない。



75 :デフォルトの名無しさん:2008/06/27(金) 17:08:29
なるほど。使えない組合せもあるのか〜。
ありがとう。

76 :デフォルトの名無しさん:2008/06/29(日) 19:41:44
これとほぼ同じ性能のやつを作りたいのですが、どんな言語と知識が必要ですか?
当方はhtmlまでしか理解できてません。
スタイルシートの理解度は10%程度です。
たまに、メモ帳の置き換えで正規表現を使うぐらいです。
ttp://www.ahref.org/cgi/urlchu/
多少アレンジするつもりですが、最低限必要なことが知りたいです。

77 :デフォルトの名無しさん:2008/06/29(日) 20:06:25
* HTML。特にフォーム
* CGIの基礎。フォームから受け取った入力にどうやってアクセスするか
* スクリプト言語。Perl, PHP, Python, Rubyのうち好きなのをどれか

あとはHTMLからリンクを抽出する方法でぐぐれば
各スクリプト言語用のサンプルがいくらでも出てくるからそれを使えばOK
これ以降は正規表現云々よりCGIの話だからそっちいって聞いておいで

78 :デフォルトの名無しさん:2008/06/29(日) 23:09:48
Javascriptだけで十分じゃ?

79 :77:2008/06/29(日) 23:16:42
あ、その通りだ。ごめんね

80 :デフォルトの名無しさん:2008/07/01(火) 00:04:06
「アルファベット {a,b,c} 上で a の数が偶数の文字列を表す正規表現」を書
きたいんですが、状態が 8 つ、受理状態が 4 つの状態遷移図は書けるものの、
これをどうやって正規表現に落とせばいいかわかりません。。。

状態遷移図を正規表現にするときのコツみたいのってありますか?




81 :デフォルトの名無しさん:2008/07/01(火) 00:47:10
/([^a]*a[^a]*a[^a]*)*/

82 :デフォルトの名無しさん:2008/07/01(火) 05:16:53
>80
http://oraclesqlpuzzle.hp.infoseek.co.jp/regex/regex-4-10.html

83 :デフォルトの名無しさん:2008/07/08(火) 16:34:43
10-20など、正数-正数という入力をし
ある文字列に10〜20などが入っていた場合にはその文字列を表示しようとしているのですが

自分ではスマートなやり方が思いつかなかったので
まず数字-数字に対して([0-9]{1,2})-([0-9]{1,2})とヒットさせ
前括弧をprematch
後括弧をaftmatchとして
for(int i=prematch; i<=aftmatch;i++)
と回して
10|11|12|...|20
と力技で置換し

それを文字列に対して正規表現でマッチさせています

何か良いスマートな方法はありませんか。

84 :デフォルトの名無しさん:2008/07/08(火) 16:41:04
なんでなんでも正規表現を使いたがるの?
/\d+/抜き出して[10,20]かどうか判断すればいいじゃん。

85 :デフォルトの名無しさん:2008/07/08(火) 17:09:46
>>84
なるほど
検索文字列をどうにかするのではなく
被検索文字列から数字のみを抜き出せばいいんですね

その方法を少し変え別の部分にも適応すると
その部分も解決しそうです

ありがとうございました

#[xx,yy]という表現を知らなかったから勉強し直そう…

86 :デフォルトの名無しさん:2008/07/08(火) 17:14:49
>>83
中身に関係ないけど、
pre <-> post
before <-> after
じゃないのか。

87 :デフォルトの名無しさん:2008/07/08(火) 18:01:54
>>86
postなんて表現があったんですね
直しました、有難うございます

88 :デフォルトの名無しさん:2008/07/08(火) 22:40:23
//A //BBBB //C //DD
//E //FF //G
//H //I
//J
上のデータで以下の塊で取り出したいのですが
//A //BBBB //C //DD
//E //FF //G
//H //I
//J
どのような表現をとればよいでしょうか
環境はjavaです


89 :88:2008/07/08(火) 22:45:31
>>88です
自己解決しました。

90 :デフォルトの名無しさん:2008/07/12(土) 14:15:00
前まで動いていたコードが正しい動作をしなくなったので
相談させて下さい。

\d{2}.\d{2}.\d{2}
で、年.月.日の一番新しいファイルを取ってきていたのですが
何故か2月分のファイルを取ってくる様になりました。

1月〜今月までのファイルは有るのですが、コードを打ち込みなおしても
直りませんでした。

対処法などが有ればご教授ください。



91 :デフォルトの名無しさん:2008/07/12(土) 14:22:55
>>90
抽出元のフォーマットはどんな感じになってるんだ

92 :デフォルトの名無しさん:2008/07/13(日) 08:23:29
>>91 レス有難う御座います。

hoge08.01.01.xls 〜 hoge08.07.13.xlsと言う感じなのですが
何か心当たりは有りますでしょうか?

93 :デフォルトの名無しさん:2008/07/13(日) 08:37:28
その二月分のファイル名と \d{2}.\d{2}.\d{2} はマッチするかとか試してみた?

とりあえず . はドットそのものじゃなくて任意の一文字を表す
ドットそのものは \. ね

94 :デフォルトの名無しさん:2008/07/13(日) 10:26:29
こんな感じで正規表現の事例集とかもっといっぱいない?
http://homepage.mac.com/overspeeds/Windows/WindowsMACAdd.htm

95 :デフォルトの名無しさん:2008/07/13(日) 11:50:24
>>93 早いレス助かります。

hoge08.02.14.xls辺りを優先でマッチしてしまう様だったので
\d{2}.07.\d{2}に変更すると、今月内の最新のを優先で当たります。

>\.についても気になったので、直したのですが動作的には
変りませんでした。


96 :デフォルトの名無しさん:2008/07/13(日) 12:47:05
それは正規表現の問題じゃないと思うよ

97 :デフォルトの名無しさん:2008/07/13(日) 14:58:19
>>96

何か正規表現で一番最優先でマッチしてくるものとかが有るのかな?
と思ってみたのですが、以前は正常に稼動していたので
サーバで異常な動作なのかな・・・。

大変有難う御座いました。

98 :デフォルトの名無しさん:2008/07/13(日) 17:05:51
>>97
技術屋なら
擬似的にでも似たような環境を作ってテストしてみるのがいい

99 :デフォルトの名無しさん:2008/07/13(日) 17:37:58
>>97
正規表現がやるのは「マッチ擦る/しない」だけで、
優先順位とかは検索処理側かと。

100 :デフォルトの名無しさん:2008/07/13(日) 22:37:09
\d{2}.\d{2}.\d{2} を誰かがいじったか何かで
\d{2}.\d2.\d{2} こうなってしまってるとか???


101 :デフォルトの名無しさん:2008/07/14(月) 12:21:51
単に、ディレクトリ内でのファイル配置が変わっただけじゃないのか?
例えば、今までは単純増加だったところに何らかの理由で2月のデータを更新して配置が変わってしまったとか。
いずれにしても、検索処理側の問題だな。

102 :デフォルトの名無しさん:2008/07/14(月) 12:37:08
すいません、ある条件にマッチした書き込みとそのレスのみを抽出できる正規表現を
探しているのですが、可能でしょうか?よろしくお願いします。

103 :デフォルトの名無しさん:2008/07/14(月) 12:47:55
>>102
>5

104 :デフォルトの名無しさん:2008/07/14(月) 13:09:50
janeを使用しております。

「12345」や「67890」の様に5桁の数字を含む書き込みとそれに関連するレスを表示したい、
と言うわけです。レス抽出オプションの関連レスを含めるを使用しない形でと思いましたのでよろしくお願いします。

105 :デフォルトの名無しさん:2008/07/14(月) 13:28:55
素朴な疑問だが、janeのレス抽出って正規表現使えたか?
つーか、janeと言われても派生が多くてどれのことだか判らんが。

106 :デフォルトの名無しさん:2008/07/14(月) 13:31:04
何度もすいません。JaneDoeViewを使っています。
ちなみに他の正規表現は使用できています。

107 :デフォルトの名無しさん:2008/07/14(月) 13:42:47
janeDoeViewは知らんが、[0-9][0-9][0-9][0-9][0-9]じゃいかんの?

108 :デフォルトの名無しさん:2008/07/14(月) 13:53:29
>>107
ありがとうございます。でもそれだと5桁の数字の書かれている書き込みのみの表示となってしまい
それに関連するレスが表示できないところで悩んでいます…

109 :デフォルトの名無しさん:2008/07/14(月) 13:55:17
それはJane側が対応してないとどうしようもないのでは。

110 :デフォルトの名無しさん:2008/07/14(月) 13:58:34
やっぱりそうですか。何度も有難うございました。

111 :デフォルトの名無しさん:2008/07/14(月) 14:01:00
週末の奴といい、janeの奴といい、正規表現を魔法か何かと勘違いしているんじゃないか?


112 :デフォルトの名無しさん:2008/07/14(月) 14:09:46
追い討ちをかけるようだが
そもそもViewスレで質問する内容だと思うんだが

一つ前のレスで>5へのリンクが貼ってあるにも関わらず読まずに
使用環境書かないし

113 :デフォルトの名無しさん:2008/07/14(月) 14:53:41
正規表現は呪いであって魔法ではないの。

114 :デフォルトの名無しさん:2008/07/15(火) 21:50:07
>>99-101
返信有難う御座います。

正規表現部分のソースコードは睨めっこしても問題無さそう
なので、なんだか不明です。

いちご2008.01.01〜
みかん2008.01.01〜

みたいに取得するファイルは沢山有って、例えばいちごだけが
2月のファイルを取ってくるって動作になっちゃってます。

ディレクトリやファイルネームの間違えも確認しましたが・・・orz


とりあえず、\d{2}.07.\d{2}の回避方法で運用でカバーすることにしました。



サーバは怖くてリブート出来ないので・・・。有難う御座いました!

115 :デフォルトの名無しさん:2008/07/16(水) 00:44:39
>>114
正規表現とヒットする順序には何ら関連がないことは理解できたの?

116 :デフォルトの名無しさん:2008/07/16(水) 01:32:20
すいません、渋谷駅前を歩いている通行人で処女の女性のみを抽出したいんですが
そういう事って可能でしょうか?よろしくお願いします。

117 :デフォルトの名無しさん:2008/07/16(水) 03:04:17
>>116
どう見ても小学生くらいに見えるのなら、先ず大丈夫でしょう。

118 :デフォルトの名無しさん:2008/07/16(水) 03:50:00
>>117
取りこぼしがあっちゃいけないと思うが…

119 :デフォルトの名無しさん:2008/07/16(水) 08:15:27
>>118
それでは先ず、「処女」の定義をはっきりさせてください。
定義がはっきりしたら、対処してご覧に入れます。

120 :デフォルトの名無しさん:2008/07/16(水) 08:44:04
週刊宝石かよ。

121 :デフォルトの名無しさん:2008/07/16(水) 15:30:43
(?<!非)処女

122 :デフォルトの名無しさん:2008/07/17(木) 18:29:00
{{ABC}}こんちわ{{XYZ}}

これの{{ABC}}と{{XYZ}}にマッチさせる表現を教えて下さい。
{{.*}}だと全体がマッチしちゃって・・・お願いします。


123 :デフォルトの名無しさん:2008/07/17(木) 18:30:38
おまいの正規表現エンジンの非欲張り型マッチについて調べれ

124 :デフォルトの名無しさん:2008/07/17(木) 18:59:17
{{{ABC}}} の場合はどこまでマッチしたいんだろうとか思うが、
とりあえず {{[^}]*}} でもいいかもねー。


125 :122:2008/07/17(木) 19:10:27
>>123
ヒントありがとうございます。
>>124
おおっ!

秀丸の強調表示で使おうと思ってました。
で、自分なりに
{{[a-z^A-Z^0-9^ ^$^/^=^+^%^#^\-^_^!^.^,^&^\(^\)^;^:^\"^\'^\?^亜-K^ァ-ヶ^ぁ-ん^0-9^a-z^A-Z^`]*}}
とかやったらよさげだったんですが、>>124でおkですね

本当にありがとうございました。


126 :デフォルトの名無しさん:2008/07/17(木) 21:02:42
>>125
頑張りすぎ

127 :デフォルトの名無しさん:2008/07/18(金) 09:55:24
亜-K ってどういう範囲だっけ?
SJIS?

128 :デフォルトの名無しさん:2008/07/18(金) 10:28:49
Windows-31Jかな。黒の旧字もあるし。
Unicodeだと破綻しちゃうな。
[:alpha:]みたいな感じで、仮名や漢字を指定する構文があればイイのに。

129 :デフォルトの名無しさん:2008/07/18(金) 11:13:43
16区から92区までの漢字のようだね

>>128
Unicodeだと、その範囲の漢字はCJK UNIFIED IDEOGRAPHと
CJK COMPATIBILITY IDEOGRAPHに入るんで、Unicodeのカテゴリやブロック名に
対応している正規表現エンジンなら、それを使うのが普通だと思う

そうでないなら、直接コードポイントを用いてU+4E00-U+9FBFとU+F900-U+FAFFで
指定すればいいんじゃないかな

130 :デフォルトの名無しさん:2008/07/18(金) 13:18:47
Javaだと
[\p{InCJKUnifiedIdeographs}\p{InCJKCompatibilityIdeographs}]
XML Schemaだと
[\p{IsCJKUnifiedIdeographs}\p{IsCJKCompatibilityIdeographs}]
かな。


131 :デフォルトの名無しさん:2008/07/21(月) 21:01:19
CGIの正規表現で(月)など()の中に曜日があって
曜日を消したかったので
$date =~ s/\([月火水木金土日]\)//g;
というのでやってみたんですができなかったんですが
どうすればいいでしょうか

132 :デフォルトの名無しさん:2008/07/21(月) 21:05:07
use encoding

133 :デフォルトの名無しさん:2008/07/21(月) 21:07:47
すみませんsjisです

134 :デフォルトの名無しさん:2008/07/21(月) 21:30:15
>>133
おそらく perl スレで聞いたほうがいい質問だな。

135 :デフォルトの名無しさん:2008/07/22(火) 05:04:38
ありがとうございます
perlスレで質問してきます

136 :デフォルトの名無しさん:2008/07/23(水) 17:27:02
教えてください。テレビ番組の検索で「体操」の番組をすべて検索したいのですが、
そのうち「テレビ体操」「みんなの体操。」を除外するにはどのように書けばいいでしょうか?

137 :デフォルトの名無しさん:2008/07/23(水) 18:22:34
>>136

>>1 を読んでください。


138 :デフォルトの名無しさん:2008/07/23(水) 18:53:31
>>137
すみません。これです http://1st.geocities.jp/tvrock_web/

一般的な話でいいので教えていただけると有り難いのですが。

139 :デフォルトの名無しさん:2008/07/23(水) 19:36:20
含む含まないじゃなくて、完全に一致するのを除外?

^((?!^テレビ体操$|^みんなの体操。$).)*体操.*$

こうかなあ・・・

140 :デフォルトの名無しさん:2008/07/23(水) 19:39:19
環境によっては、最初の括弧のあとに ?# が必要かも

141 :デフォルトの名無しさん:2008/07/23(水) 19:40:15
おっと、?: ね

142 :デフォルトの名無しさん:2008/07/23(水) 21:11:20
(11:22)
このような括弧になっている文字はどうやって指定したらいいんでしょうか?
\([0-9]{1,2}:[0-9]{1,2}\)

こんな感じで試してみたんですがうまくいきませんでした・・・。

143 :デフォルトの名無しさん:2008/07/23(水) 23:55:13
>>142
「(」とマッチさせたいときに「(」と書くか「\(」と書くか「\\(」と書
くかは環境依存なんだ。というわけで >>1 を読んで。



144 :デフォルトの名無しさん:2008/07/24(木) 09:05:30
半角スペースを指定する方法ってありませんか?

145 :デフォルトの名無しさん:2008/07/24(木) 09:45:57
/ /

146 :デフォルトの名無しさん:2008/07/24(木) 09:46:11
>>144
>>1を100回音読しろ。

147 :デフォルトの名無しさん:2008/07/24(木) 09:50:39
>>145
/ /
これってどういう指定法なんでしょうか?

148 :デフォルトの名無しさん:2008/07/24(木) 09:52:30
それでわからんのなら、なおさら自分の環境書けよ

149 :デフォルトの名無しさん:2008/07/24(木) 10:03:51
ごめんなさい、一から勉強してきます

150 :デフォルトの名無しさん:2008/07/24(木) 11:32:45
一からじゃねぇよ、零から始めろ。

151 :デフォルトの名無しさん:2008/07/28(月) 14:13:27
(abc) → abc
([abc]) → abc
[abc(def)hij] → abc(def)hij
[abc(d[ef])hij] → abc(d[ef])hij としたいが、
(ab)(cd) → (ab)(cd) のまま。 ab)(cd  にはしたくない。
([abc)] → ([abc)] のまま。abc にはしたくない。
つまり、「文字列両端にあるかっこが、互いに対応する開き・閉じで限りは削除したい」というとき、
perl 5.8.8 の正規表現で書けますか ?

152 :デフォルトの名無しさん:2008/07/28(月) 14:35:57
(abc) → abc
([abc]) → a-c
[abc(def)hij] → a-f or h-j or ( or )
[abc(d[ef])hij] → a-f or h-j or ( or ) or [ or ]
(ab)(cd) → (ab)(cd)
([abc)] → 構文エラー

(\[abc)]なら動く

153 :デフォルトの名無しさん:2008/07/28(月) 14:45:11
ああ紛らわしくてすみません、(abc) などは、正規表現ではなく、処理対象の文字列です。
(abc) → abc は、(abc) が入ったとき、それを abc に置換したい、という意味です。

  【文字列】  → 文字列
  【文字列A】と【文字列B】 → (置換しないでそのまま)
  《簡単な【文字列】》  → 簡単な【文字列】
  【入れ子の《文字列の【中身】は》そのまま】→入れ子の《文字列の【中身】は》そのまま
  【またいでいる《かっこは】そのまま》 →(置換しないでそのまま)

という置換をしたいのです。

154 :デフォルトの名無しさん:2008/07/28(月) 14:55:46
一番上は\((abc)\)だな

やりたいことは分かったんだが俺には分からないから賢者に任せる

基本外側にある括弧は取り除く
例外として括弧が並んでる or 括弧が入れ子になってる場合は括弧を取り除かない
という感じか

155 :デフォルトの名無しさん:2008/07/28(月) 15:10:52
>>151
pattern code expression (??{ expr }) を使えば再帰的な正規表現を書くことが出来る。

156 :デフォルトの名無しさん:2008/08/02(土) 20:51:34
性器表現で痴漢

157 :デフォルトの名無しさん:2008/08/02(土) 22:50:53
既出

158 :デフォルトの名無しさん:2008/08/05(火) 04:00:55
毎日毎日、暑い。暑い。暑い。暑い。
物価高で肉が食えないからスタミナ無い。
エアコン代もバカにならない。
しかもCPUは温風を吐き出しまくる!
暑い。あ゛〜〜〜っ!もう我慢ならん!
正規表現でなんとかなりませんかねぇ

159 :デフォルトの名無しさん:2008/08/05(火) 16:06:39
htmlソースからcharsetの値(UTF-8とか)を取り出すスマートな正規表現は
どんなものがありますか?

160 :デフォルトの名無しさん:2008/08/05(火) 16:10:35
/\bcharset\s*=\s*("|'|)(.*?)\1/i

161 :デフォルトの名無しさん:2008/08/05(火) 16:11:33
>>160
仕事速いね!
ありがとうございます

162 :デフォルトの名無しさん:2008/08/21(木) 14:13:15
/w{4,}|(っ|ぇ)うぇ/
/うは(w|w){2,}|おk(w|w){2,}/

これに類する内容をマッチさせるのにもっとスマートな方法はないものか。。

163 :デフォルトの名無しさん:2008/08/21(木) 15:06:33
うは[ww]{2,}じゃダメですか

164 :デフォルトの名無しさん:2008/08/23(土) 06:35:43
無限ループになってしまうような正規表現て書けるんですかね?

165 :デフォルトの名無しさん:2008/08/23(土) 09:18:49
書けても、それを解釈するエンジン側で、よきにはからう。
っつーか /.*/ でも無限ループとは言える。
循環参照?

166 :デフォルトの名無しさん:2008/08/24(日) 05:38:57
↓このスレで荒しが酷くてみんな困ってるのですけど
  カレー板限定で見えなくする上手い正規表現は無いでしょうか・・・

お前ら、美味しいレトルトカレーを教えれ! 7袋目
http://food8.2ch.net/test/read.cgi/curry/1203495304/

167 :デフォルトの名無しさん:2008/08/24(日) 05:42:18
/(!|[ww]|…)/iでNG

168 :デフォルトの名無しさん:2008/08/24(日) 09:05:20
なんでこうやって荒らし宛てにNGの抜け道を書くんだろうね。
http://food8.2ch.net/test/read.cgi/curry/1203495304/617

正規表現に特定板限定自動荒らし検知機能はないよ。

169 :デフォルトの名無しさん:2008/08/26(火) 09:20:24
文字列の前後の半角/全角スペースを除去したいのですが、
後ろの部分がうまく除去されません。

^([  ]*)(.*)([  ]*)$

どのようにすればうまく行きますか?




170 :デフォルトの名無しさん:2008/08/26(火) 10:34:12
真ん中の .* に後ろの全角スペースも含まれるからじゃない?
その記法が使える環境なら、[^ ]* とか?

171 :デフォルトの名無しさん:2008/08/26(火) 10:34:58
ってこりゃ真ん中の全角スペースで止まるか。

172 :デフォルトの名無しさん:2008/08/26(火) 10:45:09
*じゃなくて+

173 :デフォルトの名無しさん:2008/08/26(火) 11:22:09
/^(\s*)(\s*\S*)*(\s*)$/
これで引っ掛けられる?
\sは空白、\Sは非空白ね。
^と$は必要ないかも。

174 :デフォルトの名無しさん:2008/08/26(火) 12:05:02
Javascriptだけどこんな感じでやってるな

function trim(str){ return str.replace(/^[  \t]+|[  \t]+$/g, ""); }


175 :デフォルトの名無しさん:2008/08/29(金) 11:48:35
最近は再帰的にマッチできる正規表現が出てきてるんですね
メールのコメントをみんなどうしてるのかずっと悩んでました

176 :デフォルトの名無しさん:2008/08/30(土) 07:59:25
後方参照は便利だね。

177 :デフォルトの名無しさん:2008/08/30(土) 10:09:57
>>175
形式言語的な意味で「正規(正則)」な言語ではなくなってるけどね

178 :デフォルトの名無しさん:2008/08/30(土) 13:12:16
前ってどっちですか?
後ろってどっちですか?

179 :デフォルトの名無しさん:2008/08/30(土) 15:32:26
あー、あるあるw
プログラムカウンタが進む方(番地が大きい方)が前っぽいのに、
前方参照っつーと番地が若い方だったり。

180 :デフォルトの名無しさん:2008/08/30(土) 16:19:58
このマップが悪いのかな、マップの赤点が見づらいわ

181 :デフォルトの名無しさん:2008/08/30(土) 16:20:49
誤爆ね

182 :デフォルトの名無しさん:2008/08/31(日) 10:38:11
Rubyです
予め文字列を逆にしておき連続する改行の後ろだけにマッチ

/\n(?=(?:\n[^\n]+)+)$/

もっとスマートな方法があれば教えてください

183 :デフォルトの名無しさん:2008/08/31(日) 11:31:48
連続する改行の後ろだけにマッチ
って事なら、リバースする前に
/[^\n]+\n(?=\n+)/
じゃダメなのかな

184 :182:2008/08/31(日) 11:58:23
アホだ〜
ここまで解ってるなら逆にする必要なかった

/^((?:[^\n]+\n)+)\n(.*)$/m

これで\1と\2を取り出せば良いんですよね

185 :182:2008/08/31(日) 12:04:02
>>183
リバース前にそれだと前の改行にマッチしてしまいませんか?

186 :デフォルトの名無しさん:2008/09/01(月) 08:28:15
最小一致の呪文を覚えた

/\A((?:.+?\n)+?)(?:\n(.*))?\z/m

最終的にこうなりました
正規表現奥が深いです

187 :デフォルトの名無しさん:2008/09/03(水) 08:43:01
>>84-85
この範囲[x,y]って表現は何のことですか?java/rubyでもないんですけど・・

188 :デフォルトの名無しさん:2008/09/03(水) 09:08:18
>>187
数学

189 :デフォルトの名無しさん:2008/09/03(水) 09:09:23
>>187
[文字の範囲] と
{繰り返し回数} を混同してないか?

190 :デフォルトの名無しさん:2008/09/03(水) 09:15:43
数学。あーそういうことですか。

 \\s(\\w)
 \\s([\\w])

の違いを調べてるんですが、同じくヒットするんですけど何か違いはあるんでしょうか。
\\w => \wです。

191 :デフォルトの名無しさん:2008/09/03(水) 09:19:54
ありません

192 :デフォルトの名無しさん:2008/09/03(水) 09:35:50
あーそーですか。ありがとうございます。

193 :デフォルトの名無しさん:2008/09/03(水) 09:37:55
数学上の範囲[a,b]は、プログラム的な表現は a..b  や (a..b) じゃないですかね?

194 :デフォルトの名無しさん:2008/09/03(水) 12:48:04
Javaなんですが、強欲な数量子ってのは、欲張り表現ってのでしょうか。
デフォルトでは最長一致なんですが(c+は、c+?ではない方です)、このデフォルト
の挙動 c+ が強欲表現 c++ なんでしょうか?
いまいち c+ と c++ の違いがわからないのですが、何か良いサンプルはないでしょうか。
ちなみに、ネタじゃないですよ


195 :デフォルトの名無しさん:2008/09/03(水) 13:21:19
>>194
「強欲な数量子」でググれ





"ab" に対して /.+b/ と /.++b/ とか

196 :デフォルトの名無しさん:2008/09/03(水) 13:29:59
>>194
/c+/と/c++/単独では対した違いはないが、
強欲=「バックトラックしない」だから、後ろに対して影響がある。
たとえば、/c+c/は"ccc"にマッチするが、/c++c/は"ccc"にマッチしない。

197 :デフォルトの名無しさん:2008/09/03(水) 13:35:38
なんだバックトラックか。
rubyでも廃止予定とか言わず、サポートすればいいのに…

198 :デフォルトの名無しさん:2008/09/03(水) 14:17:08
c++ってcが2の倍数分だけ得るって事か

199 :デフォルトの名無しさん:2008/09/03(水) 18:21:05
>>194
c+? : non-greedy (正規表現全体がマッチする範囲で最短)
c+ : greedy "貪欲" (正規表現全体がマッチする範囲で最長)
c++ : possessive "強欲" (正規表現全体がマッチしなくなっても、とにかく最長)

200 :デフォルトの名無しさん:2008/09/04(木) 00:17:26
丁寧にありがとうございます。

201 :デフォルトの名無しさん:2008/09/04(木) 00:22:59
rubyの(?> )とほぼ等価ですかね。
イマイチ使う場面に遭遇しないんですけど…
どういう整形に必要かわからないんですけど、パタン表現になるぐらいだから、ある程度は需要があるのかなと思います。
これら特殊表現は、サンプルが多く出てくると、表現を理解できて、使える人がたくさん増えてくるのかなと思います。

202 :デフォルトの名無しさん:2008/09/04(木) 04:46:06
タグ処理でよくあるんですけど、

<(.+?)>
<(.+)?>

は何か差があるんでしょうか。

203 :デフォルトの名無しさん:2008/09/04(木) 07:21:56
下は
<> や <abcd>>> みたいなのにもマッチするぞ

204 :デフォルトの名無しさん:2008/09/04(木) 08:48:19
>>201
正規表現を最適化するのに役立つ。
つまり「バックトラックしても無駄だ」っていうことを表明できる。

205 :デフォルトの名無しさん:2008/09/04(木) 08:53:47
実装はそうでしょうけど、使う方からすると気にしてませんよ。
そもそもそのバックトラックの違いで速度などの差が出るようなら、regexpライブラリ使わないでしょうし。

206 :デフォルトの名無しさん:2008/09/04(木) 08:54:59
>>205
お前が気にするか気にしないかは問題じゃない

207 :デフォルトの名無しさん:2008/09/04(木) 09:05:39
おまえが気にするかとかよりも、バックトラックで問題が出るなら一般的には誰も使わないんじゃないですかね?
気にしてるのは、あなたの方ですよw

208 :デフォルトの名無しさん:2008/09/04(木) 09:13:57
だから俺は気にするといってるんだが…

209 :デフォルトの名無しさん:2008/09/04(木) 10:46:12
>>203
おお、そんなところに差があったんですか!感謝です!

210 :デフォルトの名無しさん:2008/09/04(木) 11:01:52
気にするって、まさか自分で実装してるんですか?
c のstring.h程度なら自力で実装できるんですけど・・・

211 :デフォルトの名無しさん:2008/09/04(木) 11:36:34
正規表現の記事なんだが
やっと読み終わったぜ
http://codezine.jp/article/detail/1573

212 :デフォルトの名無しさん:2008/09/04(木) 12:02:17
バックトラックの量は正規表現を利用するだけの立場でも気にするべきことですよ。


213 :デフォルトの名無しさん:2008/09/04(木) 12:05:02
ところでそれ、実測しましたか?

214 :デフォルトの名無しさん:2008/09/04(木) 12:30:14
$unko =~ m!-_-!m;

215 :デフォルトの名無しさん:2008/09/04(木) 13:20:26
正直怖いです

216 :デフォルトの名無しさん:2008/09/15(月) 09:35:05
/\w+/にマッチし
/end/にマッチしない
というのをひとつの正規表現で書くのはどうすればいいですか?


217 :デフォルトの名無しさん:2008/09/15(月) 10:31:31
否定読み

218 :デフォルトの名無しさん:2008/09/15(月) 10:37:40
!/\W|end/

勝手に /^\w+$/ だと思い込んでみた。

219 :デフォルトの名無しさん:2008/09/15(月) 20:23:01
サンクス
!//なんて技があるのか。
でもエディタの設定に//の中だけ書かなきゃいけないから使えないっぽい・・・
\b [^] |を駆使すれば出来そうだがめんどいな。

220 :デフォルトの名無しさん:2008/09/15(月) 23:02:18
//の中だけじゃ、ignoreとかのフラグはどうしてんの?

221 :デフォルトの名無しさん:2008/09/15(月) 23:17:10
チェックボックスがあるんだろ

222 :デフォルトの名無しさん:2008/09/16(火) 00:23:31
○○あいうえお□□123
○○かきくけこ○□345
○○あかさたな□○567
○○はまやらわ□□789
○○あいうえおかきくけこ

このような文字列の○○と□□を入れ替えるには
どうしたらいいのでしょうか?

※○□と□○はそのままにする

223 :デフォルトの名無しさん:2008/09/16(火) 00:25:51
(○○)(.*)(□□)(.*)
\3\2\1\4

224 :デフォルトの名無しさん:2008/09/16(火) 00:59:03
素早い返事ありがとうございます。
ただ、それだと2、3、5行目の○○が□□にならないです。

225 :デフォルトの名無しさん:2008/09/16(火) 01:37:44
s/○○/dummy/;
s/□□/○○/;
s/dummy/□□/;

226 :デフォルトの名無しさん:2008/09/16(火) 23:29:17
正規表現である文字を含まない行に一致させる方法はありませんでしょうか?

たとえば

あいう
えおか
きくけ

とこのようにあった場合「お」を含まない行「あいう」「きくけ」にマッチさせたいんですが

227 :デフォルトの名無しさん:2008/09/16(火) 23:52:05
grep -v お n.txt

228 :デフォルトの名無しさん:2008/09/17(水) 00:47:11
>226
多バイト文字に対応しているとして ^[^お]*$
だけど、大抵の正規表現処理系において >227 のように「マッチしない」を指定する方法があるので
そっちを使う方が賢明。

229 :デフォルトの名無しさん:2008/09/17(水) 01:15:58
>>227
>>228
レスありがとうございます。
すみません正規表現で文字処理するマクロソフト使用でしたので処理系があまり詳しくあえいませんでした。

^は基本でしたね、無事 ^[^お]*$ ですることが出来ました
ありがとうございます。

230 :デフォルトの名無しさん:2008/09/17(水) 03:31:00
しかし現行の正規表現って使いづらいよな。
読みにくく書きにくくしかも非力。もう駄目駄目。
2chの面白いレスにのみマッチするといった条件が記述できるくらい強力な
オブジェクト指向か関数型ベースの正規表現を作るべきなんだよ。

231 :デフォルトの名無しさん:2008/09/17(水) 07:51:36
文字列に対してオブジェクトや関数型ベースってどういう意味?

232 :デフォルトの名無しさん:2008/09/18(木) 01:50:50
ブラウザによってもjavascriptの動作変わりますよね

javascriptです。
123451234512345

このような文字列があった場合 /1[0-9]*5/g とするとどのようにマッチするかわかりますか?
このようにして使っていたんですが、ブラウザごとに違う動作をするようでうまくいきません。
IEでは12345  12345  12345 と三つにマッチするみたいです。
このような曖昧なものにするとだめなのでしょうか。
対処策などありましたらお願いします。

233 :デフォルトの名無しさん:2008/09/18(木) 03:36:50
いや、、、どうしたいの?

234 :デフォルトの名無しさん:2008/09/18(木) 09:17:03
貪欲マッチで「12345」にしかマッチしないのは変だな。

235 :デフォルトの名無しさん:2008/09/18(木) 09:53:49
Firefoxで以下を実行すると12345123451234にマッチする
javascript:alert("123451234512345".match(/1[0-9]*4/g));
もちろん
1[0-9]*5
に変えると全部にヒット
JavaScriptのエンジンまでとは言わないからせめてブラウザぐらい書いてくれ

236 :デフォルトの名無しさん:2008/09/18(木) 09:57:10
IEですね、本当にすみませんでした。

237 :デフォルトの名無しさん:2008/09/18(木) 10:05:11
WinME IE6では123451234512345にマッチした

238 :デフォルトの名無しさん:2008/09/18(木) 10:40:46
/▶1◀▶[0-9]*◀▶5◀/
"▶1◀▶23451234512345◀"
[0-9]*で残り全部にマッチしちゃって、最後の「5」があぶれそうに思えるけど、
ちゃんと全体にマッチするんだね。自分もまだ修行が足りない。

239 :232:2008/09/18(木) 12:27:11
IE7でした。IE7でも>>235さんのものを実行したら12345123451234にマッチしますね
正規表現間違っていただけかも・・

「12345」「12345」「12345」
このように3つにマッチさせたいと思ってました。

実際処理していた文字列は長いのですが
.* これを挟んでいたのになぜか
IE7では「12345」「12345」「12345」のように最短マッチのように出ていたみたいです。firefoxでは「123451234512345」

innerHTMLでの処理だったのでIEとfirefoxとでは改行?かなにか、文字列が変わっていたことが原因だったと思われます。

/1[0-9]*?5/gのように?をつけたら同じ動作をするようになりました。
レス下さった方ありがとうございます、勉強になりました。

240 :デフォルトの名無しさん:2008/09/19(金) 19:54:29
単純な知的好奇心の質問なのですが、
123456789と適当な桁数の数値があった時、先後読みだけで3桁ごとにカンマを挿入するにはどう記述したらいいのでしょうか。

preg_replace("/(?=[0-9]{3})/", ",", "123456789");
では左から3桁以下になるまでカンマが一桁ごとに入ってしまいます。
前後逆転せずにできる方法があればお願いします。

241 :デフォルトの名無しさん:2008/09/19(金) 20:20:56
>>240
http://www.din.or.jp/~ohzaki/perl.htm#NumberWithComma

242 :デフォルトの名無しさん:2008/09/19(金) 20:25:42
>>240
整数をカンマ区切りに置換
http://oraclesqlpuzzle.hp.infoseek.co.jp/regex/regex-2-3.html

243 :デフォルトの名無しさん:2008/09/19(金) 21:18:24
>>241-242
ありがとうございます。
自分の頭の固さを痛感しました。

{3}+$で右側が3の倍数である時のみ、という風に指定すればいいんですね。
スッキリいたしましたm(_ _)m

244 :デフォルトの名無しさん:2008/09/20(土) 17:54:15
javascriptで正規表現に%記号がうまく使えません。対処法はありますでしょうか?
/%a/i にすると「%a」にマッチするんですが /%a5/i のように%の後に2文字以上続けるとマッチしなくなります。

エスケープもうまくいきませんでした。宜しくお願いします

245 :244:2008/09/20(土) 17:56:09
エンコードされた文字列にマッチさせたいと思っています。

246 :デフォルトの名無しさん:2008/09/20(土) 19:30:20
"\%a5".search(/%a5/i); // => 0

"%a5" という3文字にマッチさせたいんだよね?
0xA5 という文字コードの文字じゃなく。

247 :デフォルトの名無しさん:2008/09/20(土) 19:57:14
ブラウザとか環境を書けって上でも

248 :デフォルトの名無しさん:2008/09/21(日) 00:51:45
そうです。文字エンコードされた %82%a0%82%a2%82%a4%82%a6 という文字列の中から特定の文字をマッチさせたいと考えています。

javascript:alert("%82%a0%82%a2%82%a4%82%a6%82%a8%82%a9%82%ab%82%ad%82%af%82%b1".match(/%82%a0/g));
このように実行してもマッチされないんですよね
IEでも狐でもやってみましたがnullになります
どこが間違っているんでしょうか

249 :デフォルトの名無しさん:2008/09/21(日) 01:03:10
>>248
その式をコピペしたけど、IE8βでもFirefoxでもOperaでもマッチしたぞ。
何かテスト方法を間違えてる。

250 :デフォルトの名無しさん:2008/09/21(日) 02:59:21
http://server(ここに任意桁の数字があるかもしれない).www
という文字列にマッチしたいとき、どう書けばいいのでしょうか?

例:
 http://server.www
 http://server9.www
 http://server999999.www

よろしくお願いします。

251 :デフォルトの名無しさん:2008/09/21(日) 03:34:01
少しは自分で調べたり考えたりしたのか?

252 :250:2008/09/21(日) 03:42:18
>>251
わからないならレスしないでください。
それに質問に質問で返すのは失礼です。

253 :デフォルトの名無しさん:2008/09/21(日) 04:02:29
あまりにも初歩的だから>>251の気持ちもわかるw

254 :250:2008/09/21(日) 04:51:58
難しく考え過ぎてた。
風呂入ってきたら自己解決しましま
[|\d]*


255 :デフォルトの名無しさん:2008/09/21(日) 04:54:57
[| ]
これは必要なのか?

256 :デフォルトの名無しさん:2008/09/21(日) 12:02:25
練馬というファイル名リネームソフトで正規表現が使えるのですが、

s/\]([^ \.].+)/\] \1/

という正規表現で何故か「従妹」が「従 妹」、「ゾン」が「ゾ ン」という風に
関係ないところまで半角スペースが入ってしまいますが何故でしょうか?

ヘルプを見ると正規表現の仕様は BREGEXP.DLL に準拠すると書かれています
よろしくお願いします

257 :デフォルトの名無しさん:2008/09/21(日) 13:33:33
そのソフトは知らんが、作者が抜けてるだけだろ。

258 :デフォルトの名無しさん:2008/09/21(日) 15:52:50
従やゾの2バイト目が SJIS で ] なんだろう。
正規表現ライブラリが日本語対応してないんだろうな。

259 :デフォルトの名無しさん:2008/09/21(日) 18:45:09
サンクス
他の探すか作者に聞いてみます

260 :デフォルトの名無しさん:2008/09/21(日) 22:45:57
DLL差し替えればいいじゃない

261 :デフォルトの名無しさん:2008/09/22(月) 00:13:26
DLL自体は更新止まってるみたいです

262 :デフォルトの名無しさん:2008/09/22(月) 05:34:17
その練馬とやらを使ってみたし、DLLの説明も見たけど、
SJISとして扱うのには、 k修飾子をつけるyぷになってるんだが
ちゃんとつけてる?

263 :デフォルトの名無しさん:2008/09/22(月) 05:35:30
って>>256みるとついてないね。つけてやってみては。

264 :デフォルトの名無しさん:2008/09/22(月) 11:04:27
Visual Basic 2005で正規表現の処理を入れ子にしようとしたんだけど、
これだと、henkanに「$&」が文字列としてそのまま渡されてしまいます。

str = Regex.Replace(str, "<a href="".*?"">", henkan("$&"))

perlのeオプションみたいなのは見つけられなかったのですが、
どうすればいいのでしょう?

265 :デフォルトの名無しさん:2008/09/22(月) 11:22:09
php5 mb_eregを使用しています。

n個のパターンを後方参照で取得したいです。
例えば 'abcde' を
'([a-z])([a-z])([a-z])([a-z])([a-z])'
というパターンであれば 'a', 'b', 'c', 'd', 'e' ととれるのですが
'([a-z])+'
こんなパターンで取得することは不可能でしょうか?

266 :256:2008/09/22(月) 17:23:44
>>262
ありがとうございます! /kで問題なくいけました!
ちゃんと説明読んでなかった自分が恥ずかしいです・・・

267 :264:2008/09/22(月) 18:03:23
自己解決したので、カキコ。

まず、文字列を評価するための宣言をする
Dim myEv As MatchEvaluator = New MatchEvaluator(AddressOf henkan)

んで、置換部分をこんな感じにする。
str = Regex.Replace(str, "<a href="".*?"">", myEv)

さらに、関数をこんな感じに作る。
Public Function henkan(ByVal url As Match) As String
    Dim s As String = url.ToString()
    s = Regex.Replace(s, "\\", "/")
    Return s

End Function

268 :デフォルトの名無しさん:2008/09/23(火) 18:48:58
>>265
mbじゃないなら
$ php -r 'preg_match_all("([a-z])","abcdef",$reg);print_r($reg);'
でできるんだよな。

でもそれはどうでもいいんだよな。

269 :デフォルトの名無しさん:2008/09/23(火) 21:44:17
PHPのpreg_matchを使ってHTML文書から次の内容を検索する
正規表現で困っています。

<a href="URL">前のページ</a> <a href="URL">次のページ</a>

ここから「次のページ」を囲んでいるAタグのURLを検索したいです

/<a href=\"(.+?)\">次ページ<\/a>/
これだと、前のページのAタグまで含んでしまい困っています。
最左から検索するのが問題だということまでは分かったのですが解決法が分かりません。

/<a href=\"(.+?)\">(?=次)次ページ<\/a>/
こんな書き方もダメでした。

ヒントでもいいので教えていただけませんか?

270 :デフォルトの名無しさん:2008/09/24(水) 01:53:37
>>269
> href=\"(.+?)\"

href=\"([^"<>]+?)\"
にでもしたらどーでしょ。


271 :デフォルトの名無しさん:2008/09/29(月) 06:47:50
始めての…表現
http://anond.hatelabo.jp/20080924122353

272 :デフォルトの名無しさん:2008/09/29(月) 19:04:52
いままでMac OS9 Jeditにて正規表現での置換をしていました.
正規表現での一括置換ができる検索置換ラクダv1.01を導入したのですが
表現方法?Perlでの書き方が違うみたいで上手く置換できません.

できればOS9環境で正規表現の連続置換がしたいので検索置換ラクダで可能な
正規表現をPerl初心者の私にどうかアドバイスというか答えを教えてください・・

「全角文字の前後の半角スペースを削除」例= この MPEG は → このMPEGは 
{[、-◯ぁ-んァ-ヶ亜-腕弌-熙]}\s 【タブ】 \1
\s{[、-◯ぁ-んァ-ヶ亜-腕弌-熙]} 【タブ】 \1

「全角文字の前後の半角カンマを全角カンマへ」例= あ,あ → あ,あ
{[、-◯ぁ-んァ-ヶ亜-腕弌-熙]}, 【タブ】 \1,
, {[、-◯ぁ-んァ-ヶ亜-腕弌-熙]} 【タブ】 ,\1

「行末の西暦を括弧で囲む」例= XX, 2005 → XX(2005) XX,1998 → XX(1998)
, {200[1-9]}$ 【タブ】 (\1)
,{200[1-9]}$ 【タブ】 (\1)
, {19[1-9][1-9]}$  【タブ】 (\1)
,{19[1-9][1-9]}$  【タブ】 (\1)

「半角数字間の全角ピリオドをピリオドを半角ピリオドへ」例= 1.1% → 1.1%
{[0-9]}.{[0-9]} 【タブ】 \1.\2

273 :デフォルトの名無しさん:2008/09/29(月) 19:13:47
>>272
全角文字を文字範囲で指定するのは、
文字コードに依存するからうまくいかない環境もあると思う。

274 :デフォルトの名無しさん:2008/09/29(月) 20:05:20
OS9って昔の環境だよな
検索置換ラクダとやらが何だか知らんし
Perlのバージョンも分からんが、
多分、単に漢字を文字クラスの中で使えない可能性が極めて高い

例えば、. が漢字一文字にマッチするか試してみればいいが、
多分そうなっていないだろう

275 :デフォルトの名無しさん:2008/09/30(火) 09:41:18
php5です


文字列
<tr>
<td colspan="2"><img height="5" src="http://localhost/aaa.jpg" width="1"></td>
</tr>
<tr>
<td width="100" height="147"><a href="/aaaa/bbbb/" title="hogehoge"><img src="http://localhost/aaa/bbb/ccc.jpg">

この文字列の中のaタグのすぐ後ろのimgタグのURLを取りたく

preg_match("/"<a href=\".*?\" title=\".*?\"><img src=\"(http.*?\.jpg)\">/i", $body, $match);

こうしてみましたが、マッチしません
どのように書けばよろしいでしょうか

276 :デフォルトの名無しさん:2008/09/30(火) 10:48:28
>>275
imgタグの中で、srcは必ず先頭に来る前提でいいのかな。
/<a[^>]+><img src="([^"]+)/
で、$1を取り出す。

277 :デフォルトの名無しさん:2008/09/30(火) 11:13:03
空白1つを含む文字列にはマッチするけど、2つ以上連続の空白でマッチしないようにするには
どうすればいいのでしょうか?

ab cd ef  gh

この場合、"ab cd ef"にマッチ。

278 :デフォルトの名無しさん:2008/09/30(火) 12:13:17
>>277
{1}

279 :デフォルトの名無しさん:2008/09/30(火) 12:32:32
>>277
[^ ]+( [^ ]+)*

280 :デフォルトの名無しさん:2008/09/30(火) 12:50:20
>>279
サンクス
うまくいきました

281 :デフォルトの名無しさん:2008/09/30(火) 16:09:48
>>276
できました
ありがとうございました

282 :デフォルトの名無しさん:2008/09/30(火) 23:00:39
質問です。

●正規表現の使用環境
サクラエディタ ver.1.6.2.0

●検索か置換か?
検索

●説明
XMLファイルのタグの中を検索したいです

●対象データ
<aaa><bbb>hogehoge</bbb></aaa>

●希望する結果
aaa と bbb と /bbb と /aaa のみ検索される

色分けをしたいのです。
おねがいしまう

283 :デフォルトの名無しさん:2008/09/30(火) 23:09:21
(?<=<).*?(?=>)

284 :デフォルトの名無しさん:2008/09/30(火) 23:11:00
しまうーなら答えざるを得ない

285 :デフォルトの名無しさん:2008/09/30(火) 23:24:06
今回のパナソニックって
s/松下[電器産業]/パナソニック
でいいですか?

286 :デフォルトの名無しさん:2008/09/30(火) 23:29:57
電波ぽいのが気になるが
s/松下(電器産業)?/パナソニック/ じゃないか

287 :デフォルトの名無しさん:2008/09/30(火) 23:40:13
>>283
できました。ありがとうございました!




288 :デフォルトの名無しさん:2008/09/30(火) 23:43:26
そうだw
()はグループ化で
[]は1文字だけか

289 :282:2008/10/01(水) 00:16:25
やっと理解できたwwwwwwwwww
理解できたってか調べるのに時間かかりました
(?<=<) これで < が前に存在することを保証する
.*? 任意の文字の連続(最短)
(?=>) > が後に続くことを保証する
283は天才www
チラ裏スマソ


290 :デフォルトの名無しさん:2008/10/01(水) 00:18:33
お礼よりも… 分かってんだろうなボウズ

291 :デフォルトの名無しさん:2008/10/01(水) 00:19:44
>>290
わかりませんサーセン

292 :デフォルトの名無しさん:2008/10/01(水) 00:25:56
さっきからチンポ出して待ってんだから… と言えば何か分かるだろ。

293 :デフォルトの名無しさん:2008/10/01(水) 04:10:07
そういうのりきもいよボケ

294 :デフォルトの名無しさん:2008/10/01(水) 05:53:23
>>293
お前ここは初めてか?
いいから力抜けよ。

295 :デフォルトの名無しさん:2008/10/01(水) 07:12:33
>>294
むしろお前が初めてか?
空気嫁よ

296 :デフォルトの名無しさん:2008/10/01(水) 09:46:51
アッー!

297 :デフォルトの名無しさん:2008/10/01(水) 10:05:59
最近の腐女子は正規表現も嗜むのか。
時代は進んでるな。

298 :デフォルトの名無しさん:2008/10/01(水) 11:51:08
PHP4での処理をしております

$str = preg_replace('/(<br \/>|<br>)/i', '<br />', $str);

いろいろやっているうちにチンプンカンプンでしまいには変な顔文字に見えてきて挫折しそうなので
どうかご教授お願いします

やりたい事は$strの中のbrタグが連続して2つ以上あればそれを1つに置き換えたいです
条件として、<br>と<br />を同じ文字列として考えるのと、たまにbrの間に改行コードがあります
<br>\n<br>\n<br /> → <br />
このようにbrタグの間に改行コードがあってもbrタグは連続するものとしたいです
よろしくお願いします



299 :デフォルトの名無しさん:2008/10/01(水) 12:13:59
php -r '$s="<br>\n<br>\n<br />";echo preg_replace("/((<br>|<br \/>)\n?)+/i", "<br />", $s)."\n";'

300 :デフォルトの名無しさん:2008/10/01(水) 12:21:01
brタグのすぐ後ろの改行も吸収してしまうが
$s="<br>\n<br><br />\ntest<br>\n\n<br />";
$str = preg_replace("/(<br( +\/)?>\n*)+/i", "<br />", $s);

301 :デフォルトの名無しさん:2008/10/01(水) 13:19:37
>>299-300
望みどおりの処理ができました
ありがとうございました


302 :デフォルトの名無しさん:2008/10/03(金) 16:41:07
\d+\.\d+\.\d+\.\d+
でIPアドレスを取得しようとしてますが、
127.0.0.1 にだけはマッチさせたく無いです。
どうやったらいいですか?



303 :デフォルトの名無しさん:2008/10/03(金) 17:16:01
(((((((((((((((([^1]*)*(1+[^2][^1]*)*)*)*(1+[^7][^1]*)*)*)*(1+[^.][^1]*)*)*)*(1+[^0][^1]*)*)*)*(1+[^.][^1]*)*)*)*(1+[^0][^1]*)*)*)*(1+[^.][^1]*)*)*)*(1+[^1][^1]*)*)*

304 :デフォルトの名無しさん:2008/10/03(金) 17:16:18
不可能ではないが2段階に分けたら?
なにがなんでもひとつの正規表現でやらなきゃならない?

305 :デフォルトの名無しさん:2008/10/03(金) 17:18:55
>>303
((((;゚Д゚))))ガクガクブルブル

306 :デフォルトの名無しさん:2008/10/03(金) 17:23:05
>>303
そんなの死んでもイヤです!

307 :デフォルトの名無しさん:2008/10/03(金) 17:28:43
まあIPアドレスなら127.まででもいいとは思うけどな。

308 :デフォルトの名無しさん:2008/10/03(金) 21:02:00
文字列がIPアドレスのみなら

$str="192.168.0.1";
preg_match("/(127\.0\.0\.1)?(.*)/",$str,$m);
echo $m[2];

でいけるよな

309 :デフォルトの名無しさん:2008/10/03(金) 21:29:36
127…でやってみた?

310 :デフォルトの名無しさん:2008/10/03(金) 23:16:55
s/127.0.0.1/うんこ/g

/\d+\.\d+\.\d+\.\d+/gp

s/うんこ/127.0.0.1/g


311 :デフォルトの名無しさん:2008/10/03(金) 23:18:12
>>309
>308の事なら中身の有無で分岐すればおk

312 :デフォルトの名無しさん:2008/10/03(金) 23:19:03
ドットにエスケープなんているの?

313 :デフォルトの名無しさん:2008/10/03(金) 23:23:17
可読性

314 :デフォルトの名無しさん:2008/10/04(土) 00:55:36
ドットってエスケープいらないの?

315 :デフォルトの名無しさん:2008/10/04(土) 01:04:01
すまない、必要だった
エスケープしないと任意の一文字でしたね

316 :デフォルトの名無しさん:2008/10/04(土) 01:51:11
VC++でマルチバイト(ユニコードではない)日本語文字列を対象とした正規表現ライブラリの定番は何ですか?

317 :デフォルトの名無しさん:2008/10/04(土) 09:19:23
Unicodeに変換しちゃだめなの?

318 :デフォルトの名無しさん:2008/10/04(土) 21:25:17
ユニコード用しかないのか・・・。
VC++でまともな正規表現やろうと思ったら、ユニコード用の正規表現ライブラリしかないんですかね?
VBAのRegExpコントロールとか、boostのregexとか。

いますごく困ってるのは、VBAのRegExpコントロールを使ってVC++でMBCSプログラミングをしてるんですが、
MatchオブジェクトのFirstIndexプロパティが文字数単位で返ってくることなんですよ。
MBCSだと、バイト単位でどの位置なのか知りたいのに。
もちろん対象となるテキストの先頭から2バイト文字かどうかを調べていけば、
何文字目が何バイト目かを調べることはできるけど、テキストが長くなると処理速度的に満足できない。

ユニコードで何文字目→MBCSで何バイト目を高速に計算するAPIってないですか?

319 :デフォルトの名無しさん:2008/10/04(土) 21:43:13
あと思いつくライブラリは鬼車だけど、どうだろう
何バイト目?ってのは結局頭から見ていくしかないので高速化も難しい
でも長いテキストでも見る開始位置を後ろに持っていくぐらいはできるかな

320 :デフォルトの名無しさん:2008/10/04(土) 23:14:36
>>319
鬼車というのはちょっと見てみましたが、クセがありそうなのでやめときます。
文字数→バイト変換はやっぱり先頭から真面目にカウントするしかなさそうですね。

過去のカウント結果を保持するような文字数→バイトカウント専用のクラスを作って、
同じテキストに関するカウントの高速化をするとか工夫してみます。

321 :デフォルトの名無しさん:2008/10/05(日) 10:09:25
MBCSの定番と言えばbregexp.dllじゃね?あるいは鬼車を同じIFにしたbregonig.dllとか。
鬼車以上にクセがあるが。

322 :デフォルトの名無しさん:2008/10/06(月) 13:33:23
一括置換ソフトを使い、
複数のファイルにて、一括複数行置換をしたく、そのために正規表現を使わなくてはなりません。
色々と試してみてもうまく検索されないので教えてください。

<!--shinobi1-->
<script type="text/javascript" src="http://x7.shidareyanagi.com/ufo/ここに9桁の英数字があります"></script>
<noscript><a href="http://x7.shidareyanagi.com/bin/gg?ここに9桁の英数字があります" target="_blank">
<img src="http://x7.shidareyanagi.com/bin/ll?ここに9桁の英数字があります" border="0"></a><br>
<span style="font-size:9px"><img style="margin:0;vertical-align:text-bottom;" src="http://img.shinobi.jp/tadaima/fj.gif" width="19" height="11">
<a href="http://sbc.rentalurl.net" target="_blank">美容整形</a></span></noscript>
<!--shinobi2-->

ファイルにより、上記の中で、「ここに9桁の英数字があります」のところがそれぞれ異なります。

その複数ファイルの中で<!--shinobi1-->から<!--shinobi2-->まで囲まれた部分を検索にかける場合、正規表現ではどう書きますでしょうか?

一括置換ソフトは
複数行置換 を使用しております。

323 :デフォルトの名無しさん:2008/10/06(月) 13:37:08
>>322
<!--shinobi1-->.*<!--shinobi2-->
ではダメなの?



324 :デフォルトの名無しさん:2008/10/06(月) 13:39:04
<!--shinobi1-->.*<!--shinobi2-->

325 :デフォルトの名無しさん:2008/10/06(月) 13:57:09
最長一致しちゃうから、.* じゃマズいでしょ。
途中にコメントがないなら、<! を避ければいけそう。

326 :デフォルトの名無しさん:2008/10/06(月) 19:16:41
.*? でいいんじゃ

327 :デフォルトの名無しさん:2008/10/06(月) 21:30:13
最短一致で何か問題あるの?

328 :デフォルトの名無しさん:2008/10/06(月) 21:59:53
だれもそんなことはいってないが

329 :デフォルトの名無しさん:2008/10/07(火) 08:19:34
正規表現を使わなければならない、って云ってるのに
やり方が分からないってどういう事だ

330 :デフォルトの名無しさん:2008/10/07(火) 09:48:57
その一括置換ソフトとやらが正規表現を使えるってことじゃ?

331 :デフォルトの名無しさん:2008/10/07(火) 10:25:20
sedで、

 <a href="http://○○<br><br>○○ target="_blank">△△</a>
 <a href="http://○○○○ target="_blank">△<br><br>△</a>

にマッチングして、<br><br>を削除したいのですがどの様な記述になるのでしょうか。


332 :デフォルトの名無しさん:2008/10/07(火) 10:28:10
(<br>){2,}

333 :デフォルトの名無しさん:2008/10/07(火) 10:35:57
追加

 □□<a href="http://○○<br><br>○○ target="_blank">△△</a>□□
 □□<a href="http://○○○○ target="_blank">△<br><br>△</a>□□

失礼しました。<a href=""></a>の前後にも文字列があります。<a href=""></a><a hr・・・と
繰り返している可能性もあり、<a href=""></a>内で<br><br>が発生している時はsedで取り除きたいのです。

334 :デフォルトの名無しさん:2008/10/07(火) 11:22:35
<a href="">.*?(<br>){2,}.*?</a>

335 :デフォルトの名無しさん:2008/10/07(火) 11:33:58
>>334
有り難うございます。 <a href=".*?(<br>){2,}.*?</a> と変更しまして、ためしましたと所、

 <a href=""></a>○○<br><br>○○<a href=""></a> 

にもマッチングしてしまいます。

336 :デフォルトの名無しさん:2008/10/07(火) 14:14:50
/(<a href=.+?>.*?)<br><br>(.*?<\/a>)/$1$2/ でどうだ

337 :デフォルトの名無しさん:2008/10/07(火) 14:17:50
あ、まちごうた。これでどうだ
/(<a href=.+?)<br><br>(.*?>)/$1$2/
もしくは
/(<a href=[^<>]+?)<br><br>(.*?>)/$1$2/


338 :デフォルトの名無しさん:2008/10/07(火) 17:13:07
>>337
有り難うございます。
会議が入ったので取り敢えずの中間報告です。どちらも100件の小さいログサンプルでは、
<a href="○○<br><br>○○></a>にはちゃんと働いてくれました。

良い感じだったのですが、<a href="△△">○○<br><br>○○</a>□□<a href="・・・
とリンク文字間に<br><br>が有る場合は反応いたしませんでした。


339 :デフォルトの名無しさん:2008/10/07(火) 20:37:43
このスレに複数のbrタグを一つにする正規表現があるから
それを活用するといいよ

340 :デフォルトの名無しさん:2008/10/15(水) 17:14:42
その妙なHTMLを吐き出してる奴を修正する。

341 :デフォルトの名無しさん:2008/10/17(金) 20:22:59
C#の正規表現で、「スペース(半角、空白)か改行しかない」という
条件はどう表現するのでしょうか。

^\s+\n と ^\s*$ を組み合わせる事で表現出来たような気したんですが
------


a

------
もマッチしてしまいます。

342 :デフォルトの名無しさん:2008/10/17(金) 20:46:45
空白が何を指すのかちょっとわからないけど
^\s+$ か ^\s*$で通常なら事足りるはず

メソッドの使い方間違えてるかもしれないから
とりあえずC#のコード貼ってみて

343 :デフォルトの名無しさん:2008/10/17(金) 21:55:13
>>342
親切に有り難う御座います。
^\s+$ で無事マッチさせる事が出来ました。
一応メソッドの方は汚いですが抜粋すると以下の様にして判定しており
buffの中に正規表現が入っていてstTargetを判定している感じです。

for (int i = 0; i < buff.Count; i++)
{
    bool regexCheck;
    try
    {
        regexCheck = Regex.IsMatch(stTarget, buff[i]);
    }
    catch
    {
        return true;
    }
    if (regexCheck == true)
    {
        return true;
    }
}

344 :デフォルトの名無しさん:2008/10/24(金) 04:23:35
質問に来ました。

●正規表現の使用環境
boost regexを使用した「Flexible Renamer」というファイルリネームソフト

●検索か置換か?
置換

●説明
[aaaa][bbbb].xxx などとなっているファイル名の最初の[]だけを()に変えたい
(aaaa)[bbbb].xxx となるようにしたい

ソフトがバグっている可能性もあるのですが、いろいろやったけどできません。

345 :デフォルトの名無しさん:2008/10/24(金) 04:28:04
それで質問は?

346 :デフォルトの名無しさん:2008/10/24(金) 07:52:39
s/^(.*?)\[(.*?)\](.*)$/\1(\2)\3/
できないのはソフトのバグではない
じゃあ何の所為なんだろうね

347 :デフォルトの名無しさん:2008/10/24(金) 11:11:02
>>346
d
やっぱりできませんでした
どうもソフト自体が正規表現を受け付けないみたい、説明にもヘルプにもできるって書いてあるのになー
別のフリーソフト探します

348 :デフォルトの名無しさん:2008/10/24(金) 11:56:11
ちょっと触ってみたけど、高度なりネームにチェック入れたか?

349 :デフォルトの名無しさん:2008/10/24(金) 12:11:36
高度なリネームにチェックして、正規表現を選択、
検索:^(.*?)\[(.*?)\](.*)$
置換:\1(\2)\3
で動作したが。

350 :346:2008/10/24(金) 12:18:31
えっ、そこからなの?
ソフトの使い方とか予想外だった

351 :デフォルトの名無しさん:2008/10/27(月) 09:42:10
HTMLのあるタグの中身が入れ子になっていても確実に外側にマッチできる正規表現ってありませんか?
正規表現だけに頼らず、HTMLをパースするしかないんでしょうか?

<div class="1">
あああ
<div class="2">いいい</div>
</div>
↑この、<div class="2"> があろうとなかろうと、<div class="1"> に対応する</div>までをマッチさせたい

352 :デフォルトの名無しさん:2008/10/27(月) 10:23:24
たぶん、正規表現マッチのみだと、荷が重いか無理。
その例みたいに、「divのみで2重まで」とか条件があればまだしも。

353 :デフォルトの名無しさん:2008/10/27(月) 11:17:41
HTMLとかXMLとか扱うのなら、たいていのケースでパーズしたほうが簡単。


354 :デフォルトの名無しさん:2008/10/27(月) 13:40:07
世の中のHTMLがまともなHTMLばかりなら
それで苦労ないんだけどなw

355 :デフォルトの名無しさん:2008/10/28(火) 01:02:35
ネストが狂ってたり閉じタグが無かったりなんてのはザラだからなー

356 :デフォルトの名無しさん:2008/10/28(火) 01:19:07
一つの正規表現では無理だが、ループ作れば何とか。でも、自分では普通かかんよねー。
$match = '';
$str =~ /(<div class="1">)/g or die "no match";
$match .= $1;
while ($str =~ m{\G(.*?</div>)}gs) {
 $match .= $1;
 last if $1 !~ m/<div/;
}

357 :デフォルトの名無しさん:2008/10/28(火) 11:17:52
現在『[\x20-\x7E]』とやって半角文字を抽出してるんですが
半角の空白のみを含まない場合は、どうやって表現したら良いでしょうか
お願いします。

358 :デフォルトの名無しさん:2008/10/28(火) 12:25:44
>>357
アスキーコード表を眺めてみましょう。

359 :デフォルトの名無しさん:2008/10/28(火) 12:38:16
>>358
ありがとうございました『[\x21-\x7E]』でいけました。
ところで、vb2008のRegexクラスでは、^による否定ってできないのでしょうか

360 :359:2008/10/28(火) 13:01:21
使えることがわかりました。自分の記述が悪かったみたいです。ありがとうございました。

361 :デフォルトの名無しさん:2008/10/29(水) 18:31:37
C#で

数字4桁で後ろに
何もない
ハイフンが1個
ハイフンと小文字のアルファベットa-z
の3パターンにマッチするには、どう書けばいいのでしょうか


1234
2345-
7896-d



362 :デフォルトの名無しさん:2008/10/29(水) 19:21:52
>>361
>>2あたりは一通り読んだのか?

363 :デフォルトの名無しさん:2008/10/29(水) 21:45:54
優しさに泣いた

364 :デフォルトの名無しさん:2008/10/30(木) 01:04:02
環境)OS:WinXP-Pro,Mem=3GB,開発ソフト:FlashCS3-Pro(Player9.0,AS3.0)

Flash-ActionScript 3.0で正規表現を用いて、テキスト中の
 1.2345
-0.1234
10.5678

といった数値を抽出しようと思いますが、この場合の小数点の扱いはどのようになるのでしょうか?
テストで .[0-9] (小数点とその右の数値を抽出)を行ったところ、e1 というコードが現れ、
全く出鱈目な結果を得ました。
(ActionScript3.0で「.」は任意の1文字なので仕方ないのですが・・・)

Flashの場合に限らず、小数点を含む類似のサンプルがありましたらご紹介下さい。


365 :デフォルトの名無しさん:2008/10/30(木) 01:07:55
OSとメモリに和んだ

任意の一文字を表す . を \ でエスケープすれば
. そのものになると思うよ

366 :364:2008/10/30(木) 01:31:46
>>365
早速のレス有難うございます。

たった今、手元の本で見つけたのですが、 . はAsciiコードで \x2E と表現するということなので、
これで試しましたが駄目でした(Unicode表記 \u002E でも駄目でした)

半角マイナス(\x2D)やスラッシュ(\x2F)は問題なく抽出できたのですが・・・


367 :デフォルトの名無しさん:2008/10/30(木) 02:06:44
正規表現オブジェクトをどうやって作ったのか
そのオブジェクトとどうやってマッチさせたのかわかるコードを貼ってみて

もし前者で new RegExp("\x2E[0-9]") とかしてるとややこしいことになる
正規表現リテラル /\x2E[0-9]/ や /\.\d/ なら期待通りに動くはず

368 :デフォルトの名無しさん:2008/10/30(木) 02:54:50
[.][0-9]
なんて手もある。
一文字多いけど、 \ の扱いが面倒な状況だと役に立つかも。

369 :364:2008/10/30(木) 22:42:15
>>367-368
試してみました。コードの構成は以下の通りで、マウスクリックでのアクションです。

var str:String = "+ +-- ** / / 0120-123-456 1.2345 -0.1234 10.5678 0.0012"; //適当な文字列

this.expBtnM0.buttonMode = true;// マウスポインタを指の形に
this.expBtnM0.addEventListener (MouseEvent.CLICK, mcClick0);
// 5個のムービークリップ expBtnM0〜expBtnM4 を押して動作

function mcClick0 (event:MouseEvent):void {
var pattern:RegExp = /\x2E[0-9]/g; // <----- ここを5種類で試す
var regObj:Object = pattern.exec(str);
trace ("0 マッチング: " + regObj); // 0 マッチング: 〜 4 マッチング:
trace ("0 文字列: " + str.match(pattern)); // 0 文字列: 〜 4 文字列:
trace ("");
}

結果は、 var pattern:RegExp = /\x2E[0-9]/g; , var pattern:RegExp = /\.\d/g; , 
var pattern = new RegExp("[.][0-9]", "g"); および var pattern:RegExp = /[.][0-9]/g; の4つで可でしたが、
var pattern = new RegExp("\.\d", "g"); ではod が返されて不可でした(odの意味を調べましたが、
分かりませんでした)。
取りあえず、少数点(ドット)には var pattern:RegExp = /〜/; の形が良いようです。

アドバイス、有難うございました。

370 :デフォルトの名無しさん:2008/10/31(金) 01:02:32
今北
最後のやつはダブルクォート中のエスケープだから実態は“.d”で
任意の1文字+dで解釈されたと思われる
それをするなら“\\.\\d”だろうか
どうも「\でエスケープ」の意図が伝わってなかった気がするね
できたんならよしとすればいいけど

371 :デフォルトの名無しさん:2008/10/31(金) 06:50:23
だね。ややこしいところではある

// ASコンパイラは文字列「ドット、次に d 」と解釈
"\.\d"

// 正規表現コンパイラは文字列「ドット、次に d 」を元に正規表現を作成
// 結果、任意の一文字に続いてdが来る文字列にマッチする正規表現が出来上がる
new RegExp("\.\d", "g");

こういうのにはまったら、ASコンパイラと正規表現コンパイラの二者が
(概念的には)存在することを思い出すといいんじゃないかと思う
もちろん、とりあえず正規表現リテラル /.../ 使っとこう、でも構わない
あと >>369 のコード中の str に文字列 od が含まれていないか確認を

372 :364:2008/11/01(土) 11:41:13
>>371
すいません、レス遅くなりました。

ここに貼った var str:String は元が長いので、途中を省略したもので、コード上の元の
文字列には確かに od が入っています。
AS3.0の new RegExp("\.\d", "g"); だと、od(〜d) が対象になるのかなあ・・・・


373 :デフォルトの名無しさん:2008/11/03(月) 18:48:42
●正規表現の使用環境
PHP4.3.11

●検索か置換か?
検索

●説明
CSVファイルを「,」で分離したいが、
「"」で囲まれているフィールドに関しては「,」で分離したくない

●対象データ
AB,BC,"CD,DE,EF",FG

●希望する結果
(1)AB
(2)BC
(3)"CD,DE,EF"
(4)FG

すいません、基礎的な質問かと思いますが
お分かりになる方がいらしたらよろしくお願いいたします。

374 :デフォルトの名無しさん:2008/11/03(月) 19:47:44
CSVの分割は正規表現では完璧に表現できない
プログラムで対処が一般的

375 :デフォルトの名無しさん:2008/11/03(月) 21:01:42
>>373
PHPなら専用の関数が元からあるだろう?


376 :デフォルトの名無しさん:2008/11/03(月) 21:31:19
●正規表現の使用環境
Ruby1.8

●検索か置換か?
置換

●説明
ファイル名の頭から指定の文字列Xまでをなくす

●対象データ
例)指定の文字列X → "test"

ドラゴンボールtestあいうえお.txt
あああいいいtest.txt

●希望する結果
testあいうえお.txt
test.txt

377 :デフォルトの名無しさん:2008/11/03(月) 21:35:30
"aaaiiitest.txt".sub(/.*?test/, "test")
"aaaiiitest.txt".slice(/test.*/)

378 :デフォルトの名無しさん:2008/11/03(月) 21:40:12
テラ早い回答ありがとうございました

379 :デフォルトの名無しさん:2008/11/08(土) 09:49:48
●正規表現の使用環境
Perl v5.8.8

●検索か置換か?
検索

●説明
F1という文字列が含まれていたらヒットさせたい
ただしF1の前にFが付いている場合はヒットさせたくない

●希望する動作
"F1 ほげほげ" →真
"FF11 ほげほげ" →偽


[^F]F1
[^F]?F1
などと試して見ましたが失敗でした

380 :デフォルトの名無しさん:2008/11/08(土) 10:11:16
自己解決
これでうまくいきました
^F1|[^F]F1

381 :デフォルトの名無しさん:2008/11/08(土) 14:32:31
否定戻り読みとか使うのもいいだろう。
(?<!F)F1

382 :デフォルトの名無しさん:2008/11/08(土) 14:36:05
CodeZineの記事オススメだなテンプレにいれとこうぜ

http://codezine.jp/article/detail/3039
http://codezine.jp/article/detail/2676


383 :デフォルトの名無しさん:2008/11/09(日) 06:56:57
>>381
それは否定先読み

384 :デフォルトの名無しさん:2008/11/09(日) 07:01:53
これ間違ってる?

(?<=aaa)bbb 直前にaaaがくるbbbにマッチ(先読み)。
(?<!aaa)bbb 直前にaaaがこないbbbにマッチ(否定先読み)。
aaa(?=bbb) 直後にbbbがくるaaaにマッチ(戻り読み)。
aaa(?!bbb) 直後にbbbがこないaaaにマッチ(否定戻り読み)。

385 :デフォルトの名無しさん:2008/11/09(日) 07:04:38
>>383は無かったことにしてくれ

386 :デフォルトの名無しさん:2008/11/10(月) 09:18:59
●正規表現の使用環境
lex
●検索か置換か?
検索 ?
●説明
C言語のコメントで使われるような書式の検索
/*で始まり*/で終わるような文
ただし途中で*/は出現しない
漢字コードはEUCです。
コメントが英数字だけならできそうなのですが
漢字などが入ってくるとよくわかりません。
よろしくお願いします。

387 :デフォルトの名無しさん:2008/11/10(月) 10:47:44
EUCなら、漢字がバラになっても英数字とコードが重複しないから
問題ないのでは?

388 :デフォルトの名無しさん:2008/11/10(月) 11:20:03
>>387
できれば正規表現を教えてもらえないでしょうか?
英数字は[a-zA-Z0-9]のようにできると思いますが
ひらがなやカタカナは[あ-んア-ン]のようにはやはりできませんよね?
文字コードで書くのでしょうか。。。。

389 :デフォルトの名無しさん:2008/11/10(月) 11:21:52
>>388
この場合、正規表現にひらがなやカタカナを書く必要ないでしょう?


390 :デフォルトの名無しさん:2008/11/10(月) 11:40:01
>>389
コメント/**/の中にひらがなやカタカナ、漢字、英数字がでて来ると思うのですが
必要ないのでしょうか?
例として
「/*(A|***B)*/」
Aは「*、/」以外の文字を表しBは「/」以外の文字を表す。
演算の*と混乱をさけるためアスタリスクは全角大文字にしているが
実際は半角にする。
このAとBを表したいのですが。。。。
例えば[0-9a-zA-z(漢字コード?)^/*(/と*を除く)]のようにすればいいのでしょうか?


391 :デフォルトの名無しさん:2008/11/10(月) 12:15:38
後出しで条件つけるなよ・・・

392 :デフォルトの名無しさん:2008/11/10(月) 13:04:37
>>390
目的は、コメント中の「*」を「*」にすること?

393 :デフォルトの名無しさん:2008/11/10(月) 13:19:29
>>391
すみません、質問の仕方が悪かったです;
>>392
いえ、「/*(A|***B)*/」の「*」は本当は「/*(A|xx*B)*/」
とかけてC言語ではかけるの「x」は「*」で、
正規表現の0回以上繰り返す「*」とかぶってしまうため
「/*(A|***B)*/」とかかないで「/*(A|***B)*/」と書いていると思います。
何がしたいのかはlexを使って字句解析をしたいのですが
コメントの部分をスルーするための正規表現の仕方がしりたいのです。

394 :デフォルトの名無しさん:2008/11/10(月) 13:25:36
字句解析するなら /* と */ だけ検知して
途中は読み飛ばせばいいような気がするんだけど、そうじゃないの?

395 :デフォルトの名無しさん:2008/11/10(月) 13:29:59
英数字なら出来そうとかのたまっているけど、まずはそれで実装してみりゃいいじゃんね。
それでEUCコードの部分で引っかかるようなら改良すればいい。

396 :デフォルトの名無しさん:2008/11/10(月) 13:40:59
ダメだこりゃ

397 :デフォルトの名無しさん:2008/11/10(月) 13:45:57
>>394 が正解。

コードで書くのは簡単なんだが、正規表現にするには独特のコツがいるという
タイプの問題なので、下手にこだわるよりさっくり問題そのものを別の方法で
解決してしまったほうが早い。

398 :デフォルトの名無しさん:2008/11/10(月) 13:58:13
よく分からんが、最短マッチが使えないからどうしようって話か?
/* -> COMMENT状態に遷移
*/ -> 戻す
でいいんじゃね

399 :デフォルトの名無しさん:2008/11/10(月) 14:03:53
>>394
/*と*/を検知するには
{^/*}{/*$}のような感じでいいのでしょうか?
行が複数行になったらおかしくなりませんんかね。。。。。

400 :デフォルトの名無しさん:2008/11/10(月) 14:28:50
ん、あれ?
別の板の正規表現スレで似た話があったから、その続きかと思った。
量指定子を+と*で書くと、

/*([^*]|*+[^/*])**+/

となる。

401 :デフォルトの名無しさん:2008/11/10(月) 15:03:37
>>400
回答ありがとうです<(_ _)>
よく考えて見ます。。
ちなみにマルチはしていません@@

402 :デフォルトの名無しさん:2008/11/10(月) 22:36:25
コンパイラコンパイラで使用できる正規表現というかEBNFは、しょぼくて、マルチバイト
対応するの大変だから生成されたパーサだけ使用して、スキャナは自前実装がお勧め。


403 :デフォルトの名無しさん:2008/11/11(火) 04:08:42
●正規表現の使用環境
Excel & 正規表現検索
※ ttp://srcedit.pekori.jp/tool/excelre.html
●検索か置換か?
置換
●説明
英単語のみ先頭文字を小文字化
●対象データ
One
Two
Three3
●希望する結果
one
^
two
^
Three3
^^^^^^^
○自分の経緯
 検索:(^[a-z])([a-z]*)
 置換:[LOWER]$1$2
 結果:One ⇒ [LOWER]One
○知りたいこと
 このアドインにある「特殊置換」を利用する際の文法
以上、お願いいたします。

404 :デフォルトの名無しさん:2008/11/11(火) 10:08:45
おれなら Excel をデスクトップの「ごみ箱」へD&Dする

405 :デフォルトの名無しさん:2008/11/11(火) 18:18:15
コントロールパネルからアンインストールしないと意味ないって警告出るだろ。

406 :デフォルトの名無しさん:2008/11/12(水) 05:26:09
mmMMamUUqpndbback

407 :403:2008/11/12(水) 05:43:22
それができたら、どんなに楽か・・・

408 :デフォルトの名無しさん:2008/11/12(水) 20:14:38
とりあえずこのスレ>>1-10まで流し見て全く理解できなかった
もう一度読んでみるのが怖い

409 :デフォルトの名無しさん:2008/11/12(水) 20:43:19
>>403
特殊置換は変換後にそれだけしか書けないんじゃない?
とりあえず変換するだけなら↓でいけないか
変換前:^[a-z]+$
変換後:[LOWER]

410 :デフォルトの名無しさん:2008/11/13(木) 00:28:30
検索:A([a-z]*)  置換:a$1
検索:B([a-z]*)  置換:b$1
検索:C([a-z]*)  置換:c$1
検索:D([a-z]*)  置換:d$1
検索:E([a-z]*)  置換:e$1
検索:F([a-z]*)  置換:f$1
検索:G([a-z]*)  置換:g$1
検索:H([a-z]*)  置換:h$1
検索:I([a-z]*)  置換:i$1
検索:J([a-z]*)  置換:j$1
検索:K([a-z]*)  置換:k$1
(省略されました続きを読むにはここをクリックしてください)

411 :デフォルトの名無しさん:2008/11/14(金) 12:10:39
●正規表現の使用環境
Repl-Ace
※ ttp://www.sirmiles.com/repl_ace/
●検索か置換か?
置換
●説明
testA
きょう
あした
testEndA

testA
あした
あさって
しあさって
testEndA
のようなtestAからtestEndAで囲まれている文字列(改行あり)を特定文字列に置換
●希望する結果
testA
1週間前
2週間前
testEndA

412 :デフォルトの名無しさん:2008/11/14(金) 14:23:21
正規表現を魔法のプログラミング言語だと勘違いしてないか?

413 :デフォルトの名無しさん:2008/11/14(金) 14:52:11
そのツールでうまくいくかどうかわからんが

パターン testA\n.*?testEndA\n
置換文字列 testA\n1週間前\n2週間前\ntestEndA\n

でいいのか?

何を期待してるのだかよくわからんが...

414 :デフォルトの名無しさん:2008/11/14(金) 14:59:43
処理系によってはドットは改行とマッチしないので注意。

415 :デフォルトの名無しさん:2008/11/14(金) 19:38:18
正規表現に通じている先輩は正に魔法のように正規表現を使ってあらゆるリクエストに解を提示している。
あんな人になるには一体どうすればいいんだろうか?

416 :デフォルトの名無しさん:2008/11/14(金) 20:57:27
とりあえずふくろう本は読んだか?

417 :デフォルトの名無しさん:2008/11/14(金) 21:46:38
やっぱりあのそこそこ分厚い青い本に挑戦したほうがいいみたいですね。TODOリストの一番上に上げときます。

418 :デフォルトの名無しさん:2008/11/14(金) 23:15:54
正規表現って何なんだよ
表現に正規も糞もあるか!

419 :デフォルトの名無しさん:2008/11/14(金) 23:20:45
正則表現という訳も、あるにはある。

420 :デフォルトの名無しさん:2008/11/15(土) 00:25:47
「正規表現」という表現は、確かに適切でない。
では何が良いかといわれると、判らない。
明治時代の人々は、偉大だった。

421 :デフォルトの名無しさん:2008/11/15(土) 02:38:54
regular expression を無理やり「正規表現」と訳しただけ。
アテ字と言って過言ではない。意味を深く考える必要は無い。

422 :デフォルトの名無しさん:2008/11/15(土) 02:39:30
「帝王切開」 みたいなもんだな。

423 :デフォルトの名無しさん:2008/11/15(土) 02:53:00
は?

424 :デフォルトの名無しさん:2008/11/15(土) 02:54:53
洗濯を選択だな

425 :デフォルトの名無しさん:2008/11/15(土) 13:49:35
何それ気になる

426 :デフォルトの名無しさん:2008/11/15(土) 17:37:48
形式言語理論の分野では正則表現ともいう

まあ今時の言語で使えるような正規表現はもはや正則言語で表現できる範囲を
越えてたりするんだけどね

427 :デフォルトの名無しさん:2008/11/15(土) 19:05:57
性器表現

428 :デフォルトの名無しさん:2008/11/15(土) 22:00:13
モザイクやハレーションか。
「♪ヤッホー FORTRANランラン」並みに手垢が付いたネタだな。

429 :デフォルトの名無しさん:2008/11/15(土) 22:07:24
>性器表現
>手垢が付いたネタ
つまりエロ本のことだな

430 :デフォルトの名無しさん:2008/11/16(日) 14:47:16
よろしければ、お知恵をおかしいただきたいです。

"あるマックなどPCがあり、マックなどのコンピュータ"

の文字列から、/マックなどの?(.+)/のような正規表現で、「PCがあり、」「コンピュータ」の文字列を
取得したいのですが、うまくいきません。この場合、どのようにするのがよいのでしょうか?
よろしくお願いいたします。

431 :デフォルトの名無しさん:2008/11/16(日) 18:58:39
>>430
環境を書け

432 :デフォルトの名無しさん:2008/11/16(日) 19:46:20
環境を書けば答えられるの?

433 :デフォルトの名無しさん:2008/11/16(日) 19:51:09
出来ない、というのも答えの一つだしな

434 :デフォルトの名無しさん:2008/11/16(日) 20:14:40
>>431
430です。
Ruby 1.8.6、UTF8です。
お願いします。

435 :デフォルトの名無しさん:2008/11/16(日) 20:18:42
>>431
ほら、質問者が環境書いたぜ。
「出来ない」 って答えろよ。

436 :デフォルトの名無しさん:2008/11/16(日) 20:21:20
文字列を切り取りたいわけだろ?
文字列を切り取るには、何が必要だ?
どこから、どこまで。スタートとエンドだ。

/マックなどの?(.+)/

これにはスタートはあるが、エンドが無い。
どこまで切り取ればいいのか不明なんだよ。

どこから・・・マックなどの?
どこまで・・・    ←これを決めろ。

437 :デフォルトの名無しさん:2008/11/16(日) 20:46:51
>>435
何なんお前
建設的なレスできないなら無駄なレスすんなよ

438 :デフォルトの名無しさん:2008/11/16(日) 20:49:37
で?環境書けば出来るの?

439 :デフォルトの名無しさん:2008/11/16(日) 20:51:20
うん

440 :デフォルトの名無しさん:2008/11/16(日) 21:02:54
>>430
str = "あるマックなどPCがあり、マックなどのコンピュータ"
re = /あるマックなど(PCがあり)、マックなどの(コンピュータ)/
puts re.match(str).to_a[1..2]

441 :デフォルトの名無しさん:2008/11/16(日) 21:13:42
↑↑
氏ね

442 :デフォルトの名無しさん:2008/11/17(月) 08:23:20
次の マックなどの?(.+) もしくは行末までなんじゃないかな。


443 :デフォルトの名無しさん:2008/11/17(月) 09:34:46
片仮名と平仮名の境目で切るのかな。
状態を持つ物なら、何らかのプログラミング言語を使わないと。

444 :デフォルトの名無しさん:2008/11/17(月) 13:32:29
他人が勝手に仕様を決めていいのかよ

445 :デフォルトの名無しさん:2008/11/17(月) 15:33:30
>>421
最初に訳した人が誰かは知らないが、regularの捉え方を間違えている。
正しいではなく、普通のと言う意味あいで(例:レギュラーガソリン)
汎則式とでもしておけば、初学者の違和感も起きないものを…

446 :デフォルトの名無しさん:2008/11/17(月) 15:43:21
どうでもいいですよ

447 :デフォルトの名無しさん:2008/11/17(月) 17:07:42
みんなチョムスキーが悪い

448 :デフォルトの名無しさん:2008/11/18(火) 00:23:42
すみません。教えてください。

●正規表現の使用環境
サクラエディタ ver.1.6.2.0

●検索か置換か?
置換

●説明
フルパスが記述されたテキストファイルをとあるソフト(画像ビューアのHamana)のリストファイルにしたい

●対象データ
C:\Program Files\Windows Media Player\wmplayer.exe

●希望する結果
D=C:\Program Files\Windows Media Player\
F=wmplayer.exe

行末の直前の\を置換すればいいのかな?と思ったのですが
指定の仕方がわかりませんでした・・・

449 :デフォルトの名無しさん:2008/11/18(火) 00:40:18
とりあえず
置換前:^(.*\\)(.*?)$
置換後:D=\1\r\nF=\2

450 :デフォルトの名無しさん:2008/11/18(火) 01:03:03
>>449
ありがとうございました

451 :デフォルトの名無しさん:2008/11/18(火) 12:09:47
<img width="120" height="180">
</img width="120" height="180">
<img width="120" height="180"/>

という文字列をすべて
width="120" height="180"
width="120" height="180"
width="120" height="180"

にしたいのですが秀丸の置換で
検索→.* (.*)[/>].*$
置換→\1

とやってるのですが

width="120" height="180"
width="120" height="180"
width="120" height="180"/

と、さいごのスラッシュが消えません。
是非助言をください!・・・もう何時間もやってるんです(汗

452 :デフォルトの名無しさん:2008/11/18(火) 12:14:47
.* (.*?)[/>].*$
でいけました!お手数おかけしました!

453 :デフォルトの名無しさん:2008/11/20(木) 09:31:33
とても大変だと思うのですが、よろしくお願いします。

●正規表現の使用環境
Windows上で動く「Perl5の正規表現と互換性のある」とマニュアルに書いてある
フリーの(今はシェアになっています)クリップボード拡張ソフト

マニュアルには、参考事例として
・複数行のテキストに含まれている空白記号をすべて削除する
[@ s/[ ¥t ]//gmk]
・複数行のテキストに引用記号をつける
[@ s/^/> /gmk]
などが書かれています。

●検索か置換か?
置き換え です。

●説明
窓の杜などからソフトウェアのファイルをダウンロードするときに、
そのソフトをレビューした記事のタイトルをダウンロード先フォルダの名前にしています。
しかし、記事からタイトルをコピーして、フォルダ名としてペーストするだけでは
「ファイル名には次の文字は使えません。」という警告をWindowsから受けてしまうことが頻繁にあります。

Windowsでフォルダ名に使えない文字を削除しつつ、無意味な連続する空行を削除し、
ペーストしただけでフォルダ名として使える文字列へと変換できる正規表現を考えていただけないでしょうか?


454 :453:2008/11/20(木) 09:34:37
●対象データ1
「改行」
Moo0 オーディオ再生器「改行」
コンパクトで軽快に動作し、直感的に操作できるオーディオプレイヤー「改行」
「改行」
for Windows「改行」

●希望する結果1 (フォルダ名に改行を使えないので、全ての改行をアンダースコアに置き換えつつ1行の文字列へ)
_Moo0 オーディオ再生器_コンパクトで軽快に動作し、直感的に操作できるオーディオプレイヤー_for Windows
(先頭のアンダースコアはあってもなくても構いませんが、無い方がうれしいです)



●対象データ2
シンプルかつ高機能な音楽プレイヤー
foobar2000
バージョン【0.9.5.6】 

●希望する結果2 (ここまでの変換に加え、連続する空白、TABをひとつのアンダースコアに置き換えつつ、さらに末尾の空白を削除)
シンプルかつ高機能な音楽プレイヤー_foobar2000_バージョン【0.9.5.6】

●対象データ3 (○アールはregistration symbolと呼ぶらしい丸の中のRなのですが、打てませんでした。)
1.
Intel○アール Graphics Media Accelerator Driver for Windows* XP (exe) (20476KB)
14.36.4.5002 2008/10/24

●希望する結果3 (ここまでの変換に加え、registration symbolを(R)へ、フォルダ名に使えない文字/をハイフンへ)
1.Intel(R) Graphics Media Accelerator Driver for Windows* XP (exe) (20476KB)_14.36.4.5002_2008-10-24


455 :453:2008/11/20(木) 09:35:51
なお、Windowsでフォルダ名に使えない文字列は
\ / : , ; * ? " < > | および 改行
とのことなので、これらを含まない形へ整形できたらと思います。


これらを一度に処理することが、正規表現で可能なのかどうかも分からないのですが、
もし、できそうなら、どなたか編み出してもらえないでしょうか?
よろしくお願いします。

456 :デフォルトの名無しさん:2008/11/20(木) 13:49:38
とりあえず、

s/[\\\/:,;*?"<>|]/_/g

みたいな。細かい改良点は自分で考えなよ。

457 :デフォルトの名無しさん:2008/11/23(日) 00:32:05
………[2バイト文字][改行]
[2バイト文字]

↑このパターンを

………[2バイト文字][2バイト文字]

にするにはどう書けばよいでしょうか?

458 :デフォルトの名無しさん:2008/11/23(日) 02:19:43
s/\n//

459 :デフォルトの名無しさん:2008/11/23(日) 02:39:08
>>457
テンプレくらい読め。

それにそんだけじゃ情報が足りなすぎだ。
どうせ元データは何百行とあるんだろう?

どういう行とどういう行を連結したいのか位は明確にしろ。


460 :デフォルトの名無しさん:2008/11/26(水) 05:14:10
●正規表現の使用環境
Devas 3.4

●検索か置換か?
置換

●説明
各行先頭にある
空白4つと数字(1から85)、ピリオドを抜き出したい

例えば
1. 120.136.16.13:3128
2. 94.178.64.37:48018
79. pps.nntime.com:554
このようなIP+Portの前にある文字列のことです。

●対象データ
1.
85.

461 :デフォルトの名無しさん:2008/11/26(水) 05:28:19
^ *\d+\.

もし空白やドットが不要で通し番号だけ拾うのなら、
ツールにもよるけど ^ *(\d+)\. とか適当にアレンジして試しておくれ

462 :デフォルトの名無しさん:2008/11/26(水) 06:36:22
>>460
それ、置換なの?

463 :デフォルトの名無しさん:2008/11/26(水) 10:02:54
>>461
ありがとうございました!
^ *(\d+)\.
これでIPとPortだけに置換することができました。

464 :デフォルトの名無しさん:2008/11/27(木) 15:26:32
よろしくお願いします。

●正規表現の使用環境
Flexible Renamer(Perl5互換)

●検索か置換か?
置換

●説明

ファイル名の一部を別の位置へ移したい。

●対象データ
(日付)(場所)hogehoge というフォルダ名や (日付)(場所)hogehoge,jpgというファイル名

●希望する結果

(日付)hogehoge(場所)や(日付)hogehoge(場所),jpgというようにしたい。

465 :デフォルトの名無しさん:2008/11/27(木) 15:29:21
その日付や場所を特定するための法則は?

466 :デフォルトの名無しさん:2008/11/27(木) 15:41:40
それぞれ 「()」 でくくってあります。ともに一緒の括弧だとまずかったりしますか?

467 :デフォルトの名無しさん:2008/11/27(木) 15:56:36
ああ、その括弧は実際も括弧だったのねw

468 :デフォルトの名無しさん:2008/11/27(木) 16:03:16
>>464
s/^(\(.+?\))(\(.+?\))(.+)(\..+)?$/$1$3$2$4/

469 :デフォルトの名無しさん:2008/11/27(木) 16:43:45
ありがとうございます。
自分の悩んだ時間などウソのようにすっきり成功してしまいました。

今までも正規表現を使いたいと思って色々サイトを巡ったのですが
今回の答えも答えをもらって、見れば分かるぐらいの理解しかないのです。
良い学習サイトなどがあれば教えてくれませんか?それともオライリーの本を買うべき?


470 :デフォルトの名無しさん:2008/11/27(木) 16:45:58
>>469
俺はこのスレでROMって勉強してる

471 :デフォルトの名無しさん:2008/11/27(木) 16:47:49
とりあえずソフバンあたりで出してる入門書でもいいから
一冊読んだ方がその後が楽になる

472 :デフォルトの名無しさん:2008/11/27(木) 17:29:37
>>468が理解できるのなら、正規表現の基本はできてる気がする。
(カッコのエスケープ、最短マッチ、後方参照あたり)

もしプログラミングの経験がなければ、そっちを補ったほうがいいと思う。
正規表現も一緒に学べる『初めてのPerl』『たのしいRuby』あたりお勧め。
リネーマーも自分で作れるよ。

473 :デフォルトの名無しさん:2008/11/27(木) 17:49:46
おお、このスレの人は優しい人ばかりですね。
プログラムはPHPぐらいで、しかも正規表現がどうしても必要な場面に
遭遇した事がありません。

これからこのスレをROMったり、挙げてもらった本も入門書のようですので
探して見て勉強してみようと思います。
ありがとうございます。

474 :デフォルトの名無しさん:2008/11/29(土) 10:49:00
■質問
2ch のレスの
>>***
を、テキストエディタを用いて
#aa(){{{>>***}}}
に置換したいのですが、方法はありますでしょうか?

475 :デフォルトの名無しさん:2008/11/29(土) 10:56:30
>>*** のうち、どれが固定でどれが可変なのか区別がつかないと答えられない。
もし全部固定なら、そのままエディタの置換機能を使えば済む。
>>5を見て、対象データの例と希望する結果を書いてくれ。

476 :デフォルトの名無しさん:2008/11/29(土) 12:56:55
>>475
ありがとうございます。わかりにくい表現で申し訳ありません。
↓が対象データの例と希望する結果です。

●対象データ
>>123
>>456

●希望する結果
#aa(){{{>>123}}}
#aa(){{{>>456}}}

477 :デフォルトの名無しさん:2008/11/29(土) 13:01:41
>>476
検索 >>(\d+)
置換 #aa\(\)\{\{\{>>$1\}\}\}

478 :デフォルトの名無しさん:2008/11/29(土) 13:18:38
置換後の文字列が↓のようになってしまいました。
$1 のところを \d+ や (\d+)、$\d+、$(\d+) に変えて色々やってみましたが
ダメでした。置換には EmEditor Pro 7.02 を使っていますが、
何かやり方が誤っているでしょうか?

#aa(){{{>>$1}}}
#aa(){{{>>$1}}}

479 :デフォルトの名無しさん:2008/11/29(土) 13:37:14
それはソフトの使い方を読むか、サポートに聞け

480 :デフォルトの名無しさん:2008/11/29(土) 14:31:04
>>478
後方参照を $1 ではなく \1 で行う
置換 #aa\(\)\{\{\{>>\1\}\}\}

481 :デフォルトの名無しさん:2008/11/29(土) 14:49:18
>>480
お返事遅れました。
すっげwマジで出来たw 正規表現って本当にすごいですね。

自分は \t や \n 等、基本的なものしかわからなかったのですが、
今回の質問が非常に勉強になりました。

次に疑問が湧いた時には、正規表現でできないことはないという姿勢で
解決に望もうと思います。
ありがとうございました。

482 :デフォルトの名無しさん:2008/11/29(土) 14:49:51
>>480
その括弧のエスケープはなんかいみあるの?

483 :デフォルトの名無しさん:2008/11/29(土) 14:55:12
■追記
ちなみに、今回の置換の目的なのですが、
atwiki という wiki のページで
>
のような特殊文字を書くと、
適切に表示がされない不具合(?)があるので、
アスキーアート表示用のメソッド
#aa(){引数}
を用いて、> を囲みたいなと思ったのが目的でした。

初めは手動でやっていたのですが、あまりにも数が多いので
置換化できないかな、と思った次第です。

長文失礼いたしました。

484 :480:2008/11/29(土) 15:01:52
置換文字列なので無いw

置換 #aa(){{{>>\1}}}

こうだね。 吊ってくる

485 :デフォルトの名無しさん:2008/11/29(土) 16:21:23
>>482,484
小かっこ () って、正規表現モードでも \ をつける必要ないんですか。
勉強になりました

486 :デフォルトの名無しさん:2008/11/29(土) 16:29:35
>>485
置換文字列は正規表現じゃないというだけ。
正規表現で書かなきゃいけないところで()そのものを書くには
エスケープする必要がある。

487 :デフォルトの名無しさん:2008/11/30(日) 13:46:28
●正規表現の使用環境
.NET FrameworkのRegexクラス。
ですが、Perlなどの正規表現でもかまいません。

●検索か置換か?
検索です

●説明
エスケープ記号(\)がついていない括弧で囲まれた文字列の検索が目的です。
[^\\]\((?<content>[^\(]+[^\\])\)という正規表現で試したところ、
入力文字列"a(b)"で正しくマッチし"a\(b)"や"\(b)"で正しくマッチしないのですが、
"(b)"では本来マッチしてほしいのにできなくなります。

●対象データ
エスケープ文字がついてないカッコで囲まれた文字列

●希望する結果
マッチ:  "a(b)", "(b)"
非マッチ: "\(b)", "a\(b\)", "a(b\)"


488 :487:2008/11/30(日) 14:12:51
申し訳ありません。(^\(|[^\\]\()(?<content>[^\(]*[^\\])\)
で解決しました。

489 :デフォルトの名無しさん:2008/11/30(日) 14:16:29
/(?<!\\)\((?<content>.*)?(?<!\\)\)/

490 :デフォルトの名無しさん:2008/12/03(水) 17:36:22
aaa777 あああああ
aaa778ああああ
aaa7
aaa7あああ
aaa7aaa8
aaa7 aaa8

目的はaaa7をbbb7に置き換えたい。
しかしマッチ方法で苦しんでいます お助けを・・

/aaa7/ これでは全部置き換わる
/aaa7[^\d]/これでは 下の3つが余計な部分含めてマッチしてしまう。。

下から4つ、aaa7のみマッチさせる方法はあるでしょうか。

http://www.rider-n.sakura.ne.jp/regexp/regexp.php 
ここで簡単に調べられるのですが宜しくお願いします。
Perl互換の正規表現にチェックをいれていただけるといい感じです。


491 :デフォルトの名無しさん:2008/12/03(水) 17:46:49
>>490
/aaa7(?=[^\d])/

次からは>>5でお願い。

492 :デフォルトの名無しさん:2008/12/03(水) 17:48:08
aaa7(?=[^\d]|\Z)

そのチェッカーとやらの使い方がよくわからんので試してないが。

(?=ほげ) で先読みが、\Z で改行または文字列末にマッチ、ができることを
前提としている。
何を使っているのかよくわからないが(PHPのPerl互換モード?)
先読みと改行と文字列末の扱いを確認してみること。

493 :デフォルトの名無しさん:2008/12/03(水) 17:50:47
よく考えたら /aaa7(?!\d)/ でよかった。

494 :490:2008/12/03(水) 18:28:57
>>491 
もうしわけないです次から気をつけます。
>>491-493
ふむふむ 先読みという事ができるのですね
結果うまくいきました!ありがとうございました。
先読みと改行と文字列末 これを詳しく勉強してみます。

495 :デフォルトの名無しさん:2008/12/03(水) 18:31:18
よくそれだけで答えられるな
こう読んだけど違うのかな
s/aaa(?=7)/bbb/
>>494が来てたのでもういいみたいだけど

496 :492:2008/12/03(水) 18:47:11
[^\d] は \D でよかったな。

>>495
aaa777 にもそれだとひっかかるよね?
それにはひっかけたくないらしかったから。

497 : :2008/12/05(金) 00:09:56
()()
[][]
{}{}

498 :デフォルトの名無しさん:2008/12/06(土) 21:09:48
ふらっとC#,C♯,C#(初心者用) Part34
ttp://pc11.2ch.net/test/read.cgi/tech/1227521785/607
から来ました

C#でRegexを使って正規表現を利用しています

if (Regex.Match(" Xxxxxxxxx.xxxxxxxxxxxxxx.xxxx", @"\s+((\w+\.?)+)$").Success)
{
Console.WriteLine("True!");
}
else
{
Console.WriteLine("False!");
}
Console.WriteLine("カンマあり");
if (Regex.Match(" Xxxxxxxxx.xxxxxxxxxxxxxx.xxxx,", @"\s+((\w+\.?)+)$").Success)
{
Console.WriteLine("True!");
}
else
{
Console.WriteLine("False!");
}


マッチする場合は後で ((\w+\.?)+)$ の部分について処理をして、マッチしない場合はそのまま次にいくようにしたいのですが
このパターン文字列だと上記のような文字列でカンマが末尾にある場合はfalseが返ってくるまで異常に時間がかかってしまいます
最終的に ((\w+\.?)+)$ 出マッチする場合とと同じ文字列が得られる、末尾にカンマが合っても処理が遅くならないパターンがあれば教えてください


499 :デフォルトの名無しさん:2008/12/06(土) 22:50:00
>>498
(\w+)+ みたいな感じになるから遅いんだろうねえ。

\s+\w+(\.\w+)*$

でどうか。


500 :デフォルトの名無しさん:2008/12/06(土) 22:50:51
キャプチャするから
\s+(\w+(\.\w+)*)$
こうか。



501 :498:2008/12/06(土) 23:56:46
>>499,500
ありがとうございます、見違えるように早くなりました
(\w+)*は良くても(\w+)+は遅くなるんですね

502 :デフォルトの名無しさん:2008/12/07(日) 03:52:21
>>501
> (\w+)*は良くても(\w+)+は遅くなるんですね

んー、そういうことではないぞ。
\.? は有っても無くてもいいけど、(\.\w+)* の \. は必要でしょ。
(\.?\w+)* にしたらやっぱり遅くなるはず。

(\w+\.?)+ は「.xxxxxx」だけにも何通りもマッチの仕方があるけど、
(\.\w+)*は1通りしかマッチできない。この違いだよ。


503 :498:2008/12/07(日) 10:07:49
>>502
? と +(もしくは*) の組み合わせが最悪だったわけですか
今度から注意します

504 :デフォルトの名無しさん:2008/12/07(日) 13:53:02
>>503
なんかまだ誤解してるっぽいな。
*)*
みたいに、カッコの内側の最後に繰り返し指定(*やら+やら)があって、
その外側すぐにも繰り返しがあるのが問題(になることが多い)。
498が最初に書いたようなマッチしないデータを食わせたときに、
バックトラック回数がとんでもなくでかくなって遅くなる(可能性がある)。


505 :498:2008/12/07(日) 15:05:16
>>504
理解が遅くてすみません、ようやく分かりました
丁寧にありがとうございました

506 :デフォルトの名無しさん:2008/12/07(日) 20:39:26
正規表現が手に入れた強力すぎる「構文理解(マッチ)能力」って、
外国語の翻訳に使えそうな気がするんだけど、その観点での研究って進んでないの?

507 :デフォルトの名無しさん:2008/12/07(日) 21:38:53
そりゃ無理でしょ。
yaccやbisonで実用になる翻訳ソフトが作れるって話は聞かないから。

508 :デフォルトの名無しさん:2008/12/07(日) 21:53:34
>>506
正則言語はそんなに広いクラスじゃないぞ

509 :デフォルトの名無しさん:2008/12/07(日) 21:56:51
>>506
一般の自然言語と正規言語では言語のクラスとして天と地ほどの差があるよ。
たとえば、多くの自然言語は無限回のネストを許容するが、これは正規文法で表せない。

510 :デフォルトの名無しさん:2008/12/08(月) 08:03:55
お前らちゃんと日本語話せよ何言ってるか分かんねぇよ

511 :デフォルトの名無しさん:2008/12/08(月) 11:28:01
お前が勉強不足なだけだ。

512 :デフォルトの名無しさん:2008/12/08(月) 11:45:24
なんて面白みの無い、むしろマイナスなレスなんだ

513 :デフォルトの名無しさん:2008/12/09(火) 18:38:31
●正規表現の使用環境
PHP4.4以降

●検索か置換か?
検索後、個々に置換

●説明
ユーザーが入力したhtmlデータ内に
特定の文字で囲まれたものを変換したい。
%test%や%nullpo%など。

●対象データ
フォームで送信されたhtmlデータ
<html>
<head>
</head>
<body>
%adv%
あいうえおかきくけこ<br>
%adv%
</bnody>
</html>

●希望する結果
%adv%を発見した位置を返し、それを指定された文字列で置換する。
%adv%は全て同じではなく、別の文字をそれぞれ割り当てたい。

よろしくお願いします。

514 :デフォルトの名無しさん:2008/12/09(火) 19:41:55
>>513
>%adv%は全て同じではなく、別の文字をそれぞれ割り当てたい。
この時点で、正規表現でやるのには無理がある。
状態を持つには何らかのプログラミング言語で。
HTMLならJavaScriptか。

515 :デフォルトの名無しさん:2008/12/09(火) 21:03:49
PHP使ってるからテンプレートエンジン使ったらどうだろうか

516 :デフォルトの名無しさん:2008/12/12(金) 02:35:21
よくわかんないけど、%date%→2008/12/12 %name%→田中みたいにして

%name%様への%date%のお知らせです。

田中様への2008/12/12のお知らせです。みたいになるようにしたいんじゃないの?
正規表現っていうか普通に置換すればいいだけじゃないの?%name%→%date%とかなると置換順序によってはおかしくなるから、
そこは%name%を%date%で置換したいなら%%date%%と入力しといて後で%%を%に(ryみたいにすればいいと思うけど。
>>514は何が言いたいのか良くわからない。
>>515に同意。Smartyとか使えば全部やってくれるから楽だけど…

517 :デフォルトの名無しさん:2008/12/12(金) 09:24:04
>>516
>%adv%は全て同じではなく、別の文字をそれぞれ割り当てたい。
この文章を素直に解釈すると、同じ「%adv%」でも状況に応じて
「こんにちは」にも「さようなら」にもなるって事じゃないのかな。
で、そういう状況依存的な内部状態を持つ操作は、
変数や条件判断文のあるプログラミング言語でないと不可能。
何か変?

518 :506:2008/12/13(土) 22:59:58
>>507-509
正規表現の(現時点での)限界があることはわかりました。
が、自然言語の「(ある種の)典型的な表現」を滑らかに翻訳するという狭いクラスのタスクに対しては
正規表現がその強力な威力を発揮できると今でも思っています。

519 :デフォルトの名無しさん:2008/12/14(日) 00:02:11
限界とか威力とか意味わかんね。
正規表現なんて正規文法を別の記号で書き直しただけじゃん。
数学的に厳密な定義のあるものなんだから、
明日になって威力が変わったりしないよ。

520 :デフォルトの名無しさん:2008/12/14(日) 02:58:28
正規表現を、どんな夢でもかなえてくれる魔法の呪文とでも勘違いしてないか?

521 :デフォルトの名無しさん:2008/12/14(日) 08:53:37
文法の表現力では
正規文法 < 文脈自由文法 < 文脈依存文法 < 解析表現文法

522 :デフォルトの名無しさん:2008/12/15(月) 00:24:39
ABCを含まない行にマッチさせたい場合

^(?!.*ABC)  ←OK
(?!.*ABC)  ←NG

となるのでしょうか?
上記の違いが分かりません


523 :デフォルトの名無しさん:2008/12/15(月) 00:38:48
>>522
.*がABCを食うから。

524 :デフォルトの名無しさん:2008/12/15(月) 00:49:37
^があるとなぜ食えないんですか?

525 :デフォルトの名無しさん:2008/12/15(月) 01:52:03
/^(?!.*ABC)/の場合、まず/^/が文字列の頭にマッチする。
そこから後ろ(即ち元の文字列全体)が、/^(.*ABC)/にマッチしなければ、全体としてマッチする。

/(?!.*ABC)/の場合は、どんな文字列であっても末尾にマッチする。
なぜなら文字列の末尾から後ろ(即ち空文字列)は/^(.*ABC)/にマッチしないから。

526 :デフォルトの名無しさん:2008/12/15(月) 15:17:08
>>517
あーなるほどね。1回目の%adv%では「こんにちは」、2回目の%adv%では「さようなら」にしたい、とかか。
そりゃ正規表現じゃ無理だわ。いや、限定的な状況ならいけるかもしれないけど。

527 :デフォルトの名無しさん:2008/12/16(火) 12:11:49
含まない行、のような指定は、できるなら -v オプションとか
正規表現より上のレイヤでやったほうがよい。

528 :デフォルトの名無しさん:2008/12/16(火) 12:32:43
それはスレ違い

529 :デフォルトの名無しさん:2008/12/16(火) 19:58:47
いいんじゃない?
正規表現だけでは何もできないんだから。
perl とか、テキストエディタとか、そのた言語と組み合わせないと。

530 :デフォルトの名無しさん:2008/12/16(火) 22:12:40
perlとかテキストエディタとかその他の言語のサポートまではしてられないってことだろ。よう知らんけど。

531 :デフォルトの名無しさん:2008/12/17(水) 01:43:09
>>527はどこまで正規表現を使うべきかという立派な正規表現ネタに見えた。
正規表現で実現可能なことは無理してでも正規表現を使え
なんていう愚かなスレでもないだろうw

532 :デフォルトの名無しさん:2008/12/17(水) 09:10:18
実用的な解と、パズル的な解か。

533 :デフォルトの名無しさん:2008/12/22(月) 14:32:23
例えば、 ABC と DEF という文字列があったとき、

ABCの場合
ABC (123)

DEFの場合
DEF (345)

という形に置き換えるのは可能でしょうか?
また、可能ならどのように書いたらいいでしょうか

534 :デフォルトの名無しさん:2008/12/22(月) 14:53:58
>>533
できる。正規表現は
/ABC/
/DEF/

意地悪はさておき、ABCやDEFを検出するのは正規表現だけど
置換をするのはそれぞれの「実装言語や処理系ソフトウェア」だから
>>5のテンプレ埋めてくれないと答えられない。

535 :533:2008/12/22(月) 15:54:12
すみません
訂正します

●正規表現の使用環境
Jane Style Version 3.01

●検索か置換か?
検索後に置換

●説明
文字列にマッチさせた後、マッチした文字列ごとに指定された文字列を後ろに
追加させて置換させたい

●対象データ
@ ABC
A DEF

●希望する結果
@ ABC (123)
A DEF (345)

536 :デフォルトの名無しさん:2008/12/22(月) 16:25:00
普通の置換でよくね?

537 :デフォルトの名無しさん:2008/12/22(月) 16:51:55
すみません、説明が足りませんでした

この二件だけの場合は二つ表現を書けばいいですが、
後ですぐに置換したい文字列を追加できるよう、(ABC|DEF)のように
orか何かでまとめて作りたいと思っています

それは可能でしょうか
それともやはり一つ一つ書いたほうがいいでしょうか

538 :デフォルトの名無しさん:2008/12/22(月) 17:24:29
>>537
まとめようにも法則性が無いが。

539 :デフォルトの名無しさん:2008/12/22(月) 17:27:44
てか、Jane Style って専ブラだよね?
どういう機能で何をしようとしてるのかがわからないとどうにもアドバイスのしようが...
(このスレは基本的には、grepやawkやPerlやPythonやJavaの正規表現のスレなので)

540 :デフォルトの名無しさん:2008/12/22(月) 17:41:12
<rx2>(?<=ABC)[TAB] (123)[TAB]msg
<rx2>(?<=DEF)[TAB] (345)[TAB]msg



541 :デフォルトの名無しさん:2008/12/22(月) 20:35:21
これですね。ちゃんと書いてあります。
http://www.monazilla.org/index.php?e=65

542 :デフォルトの名無しさん:2008/12/22(月) 21:36:27
>>538
あまり正規表現について詳しくないもので
やはりちょっと無理がありましたね・・・

>>539
すみません
少し勘違いをしていました

>>540
有難うございます!
すごくスッキリしていていいですね
参考にさせて頂きます

543 :デフォルトの名無しさん:2008/12/27(土) 19:09:30
perl で

abc-def-1234-ghi-jkl
これから
abc-def
を取りたい

1234は数字が4文字です
1234の前を取るのはどうすればいいですか?


544 :デフォルトの名無しさん:2008/12/27(土) 19:14:41
「取る」とは?

「抽出したい」 → 結果として abc-def が欲しい
「削除したい」 → 結果として -1234-ghi-jkl が欲しい
どっち?

できれば >>5 を参考に。

545 :デフォルトの名無しさん:2008/12/27(土) 19:31:16
もっと高級言語っぽい表記で書けるといいのになぁ。

546 :デフォルトの名無しさん:2008/12/27(土) 19:31:35
(ちょっと変えました)
prelで

●検索か置換か?
検索

●説明
12-34は数字が2文字ハイフン2文字です
(\d{2}-\d{2} こうかな?)

12-34の前を抽出するにはどうすればいいですか?
12-34の前の部分に数字が2文字は無いです。

●対象データ
abc3-d5ef-12-34-ghi-jkl
ho-1ge=+-e67-89+fuga++--jkl


●希望する結果
abc3-d5ef-
ho-1ge=+-e


547 :デフォルトの名無しさん:2008/12/27(土) 20:59:42
>>546

12-34でもその一般化したパターンでも使ってマッチングさせてから
特殊変数 $` や@- を参照するなり他の手段で抜き出すなりすればよろしかろ?


548 :デフォルトの名無しさん:2008/12/27(土) 23:26:09
>>546
カッコ ( ) をつかえばいいよ。

549 :デフォルトの名無しさん:2008/12/28(日) 11:20:42
>>546
print /(.*)(?=\d{2}-\d{2})/ ? "match:[$1]\n" : "unmatch.\n" for qw(
abc3-d5ef-12-34-ghi-jkl
ho-1ge=+-e67-89+fuga++--jkl
);

550 :デフォルトの名無しさん:2009/01/01(木) 12:55:59
単純にたくさんのテキストファイルから目当てのキーワードのある行を
正規表現で検索したい場合、Windows環境だとどのツールが便利・一般的なの?
秀丸かな?
Unixだとgrepコマンドがあるけど…

551 :デフォルトの名無しさん:2009/01/01(木) 13:29:08
>>550
一般がどうかはしらないけど自分は秀丸やxyzzyの機能を使ってる

552 :デフォルトの名無しさん:2009/01/01(木) 13:32:37
grepでいいよ

553 :デフォルトの名無しさん:2009/01/01(木) 13:44:45
XP以降だと標準でfindstrコマンドがあるね
Cygwinを入れるのもいいし、各種テキストエディタに頼るのもいい

でも一番の検索ツールは、



| 何について調べますか?
| ┌────────────┐
| |                   |
| |                    |
| └────────────┘
| [ オプション(O) ]   [ 検索(S) ]
|
`──────────┐ ┌───
           , '´l,  ..| ./
       , -─-'- 、i_  |/
    __, '´       ヽ、
   ',ー-- ●       ヽ、
    `"'ゝ、_          ',
      〈`'ー;==ヽ、〈ー- 、 !
       `ー´    ヽi`ヽ iノ
                ! /
              r'´、ヽ
              `´ヽノ

554 :デフォルトの名無しさん:2009/01/01(木) 13:51:57
| 何について調べますか?
| ┌────────────┐
| | おまいの消し方        |
| |                    |
| └────────────┘
| [ オプション(O) ]   [ 検索(S) ]
|
`──────────┐ ┌───
           , '´l,  ..| ./
       , -─-'- 、i_  |/
    __, '´       ヽ、
   ',ー-- ●       ヽ、
    `"'ゝ、_          ',
      〈`'ー;==ヽ、〈ー- 、 !
       `ー´    ヽi`ヽ iノ
                ! /
              r'´、ヽ
              `´ヽノ

555 :550:2009/01/01(木) 14:13:35
さんくす、やっぱりそのへんかぁ。

556 :551:2009/01/01(木) 14:17:19
このスレのせいで550がイルカの虜になってしまった
なんて親切なスレなんだ

557 :553:2009/01/01(木) 14:17:59
名前間違えた、>>556は553

558 :デフォルトの名無しさん:2009/01/02(金) 11:43:20
2007ではイルカ出なくなってるよね

559 :デフォルトの名無しさん:2009/01/02(金) 11:46:47
冴子先生がいい

560 :デフォルトの名無しさん:2009/01/02(金) 16:37:56
スターウォーズのジャージャービンクス
Office のイルカ

大ヒットメーカーが調子に乗りすぎて生み出してしまった
世界の2大うざキャラ。

561 :デフォルトの名無しさん:2009/01/02(金) 17:31:36
なんかわかるw

562 :デフォルトの名無しさん:2009/01/08(木) 11:11:00
perlで下のような場合にマッチさせたいのですが、どのようにすればいいのでしょうか?

<[a-z]+ lang="ja">.*?</[a-z]+>

最初の[a-z]+と最後の[a-z]+は同じタグを指定したいのですが、
このままだと、</a>や</b>といった終了タグが先に引っかかってしまい、
いびつな形でマッチしてしまいます。

563 :デフォルトの名無しさん:2009/01/08(木) 17:22:05
>>562
正規表現一発じゃキツい
スキャナを書くか、素直にHTMLパーザ使った方が

564 :デフォルトの名無しさん:2009/01/08(木) 17:36:17
>>562
バックリファレンスかな
<([a-z]+) lang="ja">.*?</\1>
こんな感じで

565 :デフォルトの名無しさん:2009/01/08(木) 17:36:39
単純にそういう条件だと\1使えばいいんじゃ? いろいろやるつもりなら
結局パーサ使った方が楽ってことになりそうだけどね。

$s = q{<hoge lang="ja"><a>hogehoge</a><b>hoge</b></hoge>};
print $& if $s =~ m{<([a-z]+) lang="ja">.*?</\1>};

566 :デフォルトの名無しさん:2009/01/08(木) 17:54:09
>>564-565
> <([a-z]+) lang="ja">.*?</\1>
でうまくいきました。

残念ながら、XMLパーサの使い方がわからない。勉強しないとなぁ…

目的は和英中が混在しているxmlから日本語の部分だけ抽出したかったので、
今回はこれで十分です。

XMLとHTMLタグが混在した形式だったんですが、何故か、HTMLタグにlang設定が
されていて途方にくれていました。

567 :デフォルトの名無しさん:2009/01/08(木) 18:39:02
たとえば <xxx lang="ja"><xxx>foobar</xxx></xxx> というときにちゃんと取り出せないねえ

本当にちゃんとやろうとしたら正規表現だと無理だな

568 :デフォルトの名無しさん:2009/01/10(土) 12:59:56
XMLは文脈自由文法だからPCREの拡張とか使わないと無理

569 :デフォルトの名無しさん:2009/01/14(水) 15:34:24
Perlなら再帰的なやつもイケる
ちゃんとチェックしとらんが

local our@A;
my$a="jjj<unko>an<unko>hoge</unko>gf</unko>";
local our$b=qr{(.*?(<unko>(??{$b})</unko>)(?{push@A,$2}))*.*?};

$a=~$b;

print join($/,@A),$/;


570 :デフォルトの名無しさん:2009/01/20(火) 13:53:47
正規表現のライブラリを自作してるのですが参考になるサイトはないでしょうか。
容易な拡張性を確保するためにオブジェクト指向を使って実装してます。

例えば
inputstr[k] == pattern[k] ?

ではなくて
pattern.can_eat(inputstr[k])

のようなpatternをレシーバ(インスタンス)としたかんじです。
現在はグループの中にグループがあるとどうやって解決するか悩んでいます。
(ab(cd|ef)gh)

などで、一応JAVAで実験してます。

571 :デフォルトの名無しさん:2009/01/20(火) 13:59:04
pattern.can_eat(inputstr[k]) ?
pattern.contains(inputstr[k]) ?

などでboolean関数です。
性能は速いかどうかではなく、コンパクト・コードサイズ小さいなど目指しています(機能拡張はオブジェクト指向と同じくプラグインしますんで)。
構文木を作るとかではなく容易にスクラッチから書ける程度のコードサイズで、かつ動的に実行時に機能追加できると言うのが条件で作っています。

572 :デフォルトの名無しさん:2009/01/20(火) 14:04:39
他の言語の正規表現APIは参考にしてる?
OOならJava, Ruby, Python, .NETとあると思うけど

573 :デフォルトの名無しさん:2009/01/21(水) 01:14:50
あれ?反応ないですね。
オブジェクト指向を使った実装だと構文木を使ったものよりもだいぶ簡単になる(見通しがよくなる)んですけど・・・
多少コード量(というかクラス・ファイル数)は多くなるんですけど、やっぱりインタプリタは旧来式の構文木を使った実装しかやらないんでしょうか。

574 :デフォルトの名無しさん:2009/01/21(水) 01:28:45
何をしたいのかが伝わってないんだろう。
読んで、正規表現ライブラリを利用者に見せるためのAPIの話ではないの
かも、という印象は持ったが、それ以上は考えるが面倒くさいのでス
ルー。


575 :デフォルトの名無しさん:2009/01/21(水) 02:07:17
もっぱら使う側が多いからじゃないのかな。特に不満もないし。。
鬼車のポジションを奪える可能性もあるからがんばって!

576 :デフォルトの名無しさん:2009/01/21(水) 02:37:56
参考になるサイトもないでどうやって頑張るんだよ!
3日ぐらい悩んで大体めどがたってきたから別にいいけど。

577 :デフォルトの名無しさん:2009/01/21(水) 07:29:45
要するにこういうことだろ。
いずれにしても、パターンの構文木()笑を作る必要はあるよ

/(ab(cd|ef)gh)/.match("xabefgh")
 /ab(cd|ef)gh/.match("xabefgh")
  /ab/.match("xabefgh")
  /(cd|ef)gh/.match("efgh")
  /(cd|ef)gh/.match("efgh")
   /(cd|ef)gh/.match("efgh")

578 :デフォルトの名無しさん:2009/01/21(水) 07:29:58
途中で書き込んでしもた。めんどくせ

579 :デフォルトの名無しさん:2009/01/22(木) 11:45:20
●正規表現の使用環境
prel

●検索か置換か?
置換

●説明
特定タグ間のHTMLタグを全て削除する
(<body>から</body>までのタグを全て削除)

●対象データ
<html>
<body>
テスト<BR>
<b>です。</b>
</body>
</html>


●希望する結果
<html>
<body>
テスト
です。
</body>
</html>

580 :デフォルトの名無しさん:2009/01/22(木) 13:41:18
>>579
$html =~ s{(?<=<body>).+(?=</body>)} {
  (my $body = $&) =~ s/<.+?>//gs;
  $body;
}es;

581 :デフォルトの名無しさん:2009/01/22(木) 14:08:55
>>579 のおかげで prel でぐぐっても perl が検索対象になることを知った

582 :581:2009/01/22(木) 14:11:05
ごめん、正確には
prel 正規表現
など prel と何か別のキーワードでぐぐったとき prel は perl とみなされるっぽい

583 :デフォルトの名無しさん:2009/01/22(木) 16:40:10
ワロタ

584 :デフォルトの名無しさん:2009/01/24(土) 10:40:12
余談になるけど、VBSの正規表現は、処理系の実務にも耐えられるくらいの機能は持ってるよ。
条件判定としての正規表現を使える事は、VBAユーザーにとってこれ以上無いほどのメリットだと思ってる。

俺もそんなに正規表現は詳しくはないけど、エクセルで使う目的を考えると、VBSの正規表現は非常に使い勝手が良い。
良くも悪くもシンプルなんだよね。

仕事で文字列操作やRDBみたいな使い方してる人ならば、絶対に覚えておいて損はないよ。
後方参照が表現できるようになって、世界が開けました。
どうでも良い話かもしれないけど、マジでお勧め。

585 :デフォルトの名無しさん:2009/01/24(土) 10:40:37
誤爆しました。すいません。

586 :デフォルトの名無しさん:2009/01/27(火) 23:36:14
文字列の中から名前を取り出したいのですがどうやって書けば良いでしょうか

587 :デフォルトの名無しさん:2009/01/28(水) 00:08:31
「名前」の定義は?
環境も。

588 :586:2009/01/28(水) 00:46:35
名前は人名です
環境はVB.NETです。


589 :デフォルトの名無しさん:2009/01/28(水) 00:51:34
人名の定義は?

590 :デフォルトの名無しさん:2009/01/28(水) 00:56:14
それを聞いてる

591 :479:2009/01/28(水) 03:07:22
形態素解析の領分だろうね。
どこまで固有人名を解析できるかは性能と元の文章次第だけど。

592 :デフォルトの名無しさん:2009/01/28(水) 03:07:56
すまん、名前消したつもりが残ってた

593 :デフォルトの名無しさん:2009/01/28(水) 06:56:44
辞書も必要だな

594 :デフォルトの名無しさん:2009/01/28(水) 10:19:24
形態素解析までしなくても、日本全国の苗字と名前のテーブルを作って
「苗字+名前」で引っこ抜けばいいと思う

595 :デフォルトの名無しさん:2009/01/28(水) 10:37:13
「あや」と「あやの」みたいのをどう
扱うかとか考え出すとなにげに難しい

596 :デフォルトの名無しさん:2009/01/28(水) 11:34:07
英語と違って日本語は「わかち書き」をしないから難しいやろね。

597 :デフォルトの名無しさん:2009/01/28(水) 18:51:36
(鈴木|佐藤|山田| ... )\s*(太郎|花子| ... )

598 :デフォルトの名無しさん:2009/01/28(水) 19:16:08
>>586よ、別に煽って遊んでる訳じゃないぞ。
コンピュータにとって、言うは易いが行うは難しい要求なんだ。

599 :586:2009/01/29(木) 01:12:20
レスありがとう
では郵便番号か都|道|府|県|市|区|町|村のある行から
5行以内にある行で、末尾に。や、のない7文字以内の行で
その行の中には、も。もない文字列
これを抜き取ったら名前の可能性が高そうなのですが
どうやって書けば良いでしょうか

600 :デフォルトの名無しさん:2009/01/29(木) 01:52:27
>>599
それは非常に喜ばしいけれど、名前じゃないものが抽出されたり、名前が抽出されなかった時に
どうするか考えてるの?
そのデータをどうやって作ってるのかよくわからんが、ごちゃごちゃしたテキストしか存在しないの?

601 :デフォルトの名無しさん:2009/01/29(木) 01:57:10
人名で7文字制限つけていいのかなぁ。外国人名なんか来た日にゃえらいことになりそうだが。

602 :デフォルトの名無しさん:2009/01/29(木) 09:57:27
>>599
正規表現ってのは、
人間が生活しながら身に付ける区別みたいに複雑な物じゃなく、
字面だけで機械的に振り分けする物。
それが可能なデータでないなら、正規表現での抽出は諦めた方がいい。
既存のデータなら仕方ないけど、何等かの方法で生成してる物なら、
その上流で手を打たないと難しい。

603 :586:2009/01/29(木) 22:51:11
レスどうもです
たくさんのデータを一気に処理をするという感じではないので
失敗したら手動で訂正するので大丈夫です。
ちょっと補助的に便利になればという感じで
100件やったら半分でも正常に抽出できればそれでもOKです。
今↓のように書いてみましたがこれだと

123-0001
東京都**区**町10-10
日本太郎
03-0000-0000

東京都**区**町10-10
03-0000-0000
日本太郎
123-0001

上の2つは大丈夫なのですが、

日本太郎
123-0001
東京都**区**町10-10
03-0000-0000

だと抽出できなかったのですが、どこを訂正したらいいでしょうか?

r = New Regex("((\d\d\d\-?\d\d\d\d|都|道|府|県)+?.+\n)*?(.*\n{1,5}?)(?<1>.{4,8})$\n.+?(\d\d\d\-?\d\d\d\d|都|道|府|県)*?\n?", _
RegexOptions.Multiline Or RegexOptions.IgnoreCase)

よろしくお願いします。


604 :デフォルトの名無しさん:2009/01/29(木) 23:15:33
うざいので他所言ってください

605 :デフォルトの名無しさん:2009/01/29(木) 23:33:20
>>603
パターンが一定ではないので無理。

606 :デフォルトの名無しさん:2009/01/29(木) 23:35:34
とりあえず、「住所は必ず数字で終わる」のなら、
^(\D+)\d
で引っ掛けられそうか。

607 :デフォルトの名無しさん:2009/01/29(木) 23:36:39
>>603
人名なんて住所より短いんだから、行頭から全角6文字以内+行末文字の抽出で十分じゃない。
はい終了。

608 :デフォルトの名無しさん:2009/01/29(木) 23:43:23
まあそれでも半分ぐらいは抽出できそうだわな

609 :586:2009/01/30(金) 00:02:42
こんにちは
とかが頭にある場合があるので郵便番号と都道府県のチェックは外せないです。

610 :デフォルトの名無しさん:2009/01/30(金) 00:07:35
ネタじゃないの?

611 :デフォルトの名無しさん:2009/01/30(金) 00:10:28
データごとの固まりは空行で区切られてたり
行数が決まってたりすんの?
それだったら名前候補を抽出するプログラムも結構簡単に作れそうだが
全部正規表現でやるのは逆にむずそう

612 :デフォルトの名無しさん:2009/01/30(金) 00:13:59
>>609
そのレベルになってくると、正規表現よりそれを扱うスクリプトの方でどうにかしたほうがいいのでは

そもそもどういう形式のデータかも想像できないし

613 :586:2009/01/30(金) 00:16:01
ネタじゃないです

データは一つはj一人のデータです。
複数の人の切り分けは考慮する必要なないです。
やっぱ難しいですかね

614 :デフォルトの名無しさん:2009/01/30(金) 00:25:56
>>613
いやもう本気で「日本語でおk」
どんなデータか説明してもらわないと、どうもこうも無いわ。

615 :586:2009/01/30(金) 00:44:15
わかりにくくてすみません。
自由なフォーマットで送られてくる住所氏名電話番号を
ListViewに登録するということをやっています。
文章は

こんにちは
私の住所は
123-0001
東京都**区**町10-10
日本太郎
03-0000-0000
です
お返事ください。

こんな感じの文章から名前を出来るだけ高確率で取り出したいです。
段階に分けて調べた方がいいですかね
上の例だとまず郵便番号と都道府県と電話番号の位置を正規表現で探して
それらに一番近い7文字の全角句読点なしを取るという感じでどうでしょうか
「です」が怪しいですね「になります」とか書いてあったら間違うし・・・




616 :デフォルトの名無しさん:2009/01/30(金) 01:00:30
>>615
> 自由なフォーマットで
って時点で、正規表現の領域じゃないと思うぞ。

617 :デフォルトの名無しさん:2009/01/30(金) 01:01:54
自由なフォーマットなのか、郵便番号に近いのと電話番号に近い奴が違った場合どっちを取る?
とか問題があるな。

ttp://www2s.biglobe.ne.jp/~suzakihp/index40.html
この辺から苗字のリスト拾ってきてそれが含まれてる行を抽出するとかでいんじゃね?


618 :デフォルトの名無しさん:2009/01/30(金) 01:08:18
人名辞書と突合せしないと絶対に無理だろ

619 :デフォルトの名無しさん:2009/01/30(金) 01:15:22
名前だけ抜き出すと考えるとまず無理
引っかからないのもNGだとすれば、全角と空白を一定以上含む行まで絞ってあとは目視しかない
フリーフォーマットを許さないといけない特段の理由がないのであれば、フォームにするべき

620 :デフォルトの名無しさん:2009/01/30(金) 01:30:30
出会い系?

621 :デフォルトの名無しさん:2009/01/30(金) 01:48:20
っつーか、“理系”の人間に任せろよ。

622 :デフォルトの名無しさん:2009/01/30(金) 03:59:14
つーかそこそこの確率でいいなら、漢字だけで構成されてる行を
抜き出すだけでよくね?

623 :デフォルトの名無しさん:2009/01/30(金) 04:18:16
「できない」 ってハッキリ言ってやれよ。その方が質問主に対して親切だ。
こんなに引っ張るような事じゃ無いだろ。

624 :デフォルトの名無しさん:2009/01/30(金) 05:24:29
だからネタでしょっていってんじゃん。
食いついたもん負け。

625 :デフォルトの名無しさん:2009/01/30(金) 07:44:05
>>623
すると馬鹿は「知らないなら黙っててください」と言い出す

626 :デフォルトの名無しさん:2009/01/30(金) 08:16:59
srud(>>625);

627 :デフォルトの名無しさん:2009/01/30(金) 19:17:21
>>625
人のことを馬鹿呼ばわりするあなたにはわかるんですか?

わかる方のみ回答お願いします

628 :586:2009/01/30(金) 20:15:38
レスどうもです。

漢字の数文字の行から取るというのはいいと思いますが
折角正規表現が使えるのだからそれと郵便番号と住所なんかを手がかりにしたい
(その分確率は上がるでしょうし)と思ったのでお力をお借りできないかと
このスレを訪れてみました。
ご指摘の無理というお話もわかりますがm住所、郵便番号...の条件について、
正規表現で書く書き方を教えて頂けると助かったのですが
範囲の指定とか除外とか色々あって難しくて・・・

ちょっとアプローチを変えて自分なりの方法でやってみました。
住所、郵便番号、電話番号の位置を調べて、それの平均値を出して
それに一番近い7文字の全角でかつ、。や、のない行
から文字を取るようにしたら結構良い確率で抽出するようです。
正規表現とは離れた手法になってきたのでこの件はこれで終わりにしたいと思います。
お騒がせしてすみませんでした。有意義な回答を下さった方ありがとうございました。



629 :デフォルトの名無しさん:2009/01/30(金) 20:42:45
>>628
確実に除外できるものを削除しなよ。
そうすれば全部の名前に少しのゴミを加えたものになるよ。

630 :デフォルトの名無しさん:2009/01/30(金) 21:40:39
まだ引っ張るつもりか

631 :デフォルトの名無しさん:2009/01/31(土) 11:13:49
<h1 class="title">
<a target="_self" class="id a "
href="http://英数字.html">
パターンマッチング1</a>
      ・
      ・
     


$pattern = "/

(
<h1.\s.class=\"title\">
<a.\s.target=\"\_self\".\s.class="id\s.a\s\"
href=\"[0-9|a-zA-Z|\-|\:|\.|\?|\/|\_]+.\">
)
(.*?)(<\/a>)

/";


こんなので全然マッチングできませんでした
どこがまちがっているのか、おしえてください


632 :デフォルトの名無しさん:2009/01/31(土) 11:30:33
>.\s.
任意の一文字+空白文字一文字+任意の一文字=計三文字
つまり"h1 class"とか"h1! ?class"とかじゃないと引っかからない。
h1とclassの間とかは「空白文字一文字以上」だから\s+でおk

633 :デフォルトの名無しさん:2009/01/31(土) 11:31:19
>"h1 class"
2chの仕様でスペース一つに見えるけど、半角スペース三つね。

634 :デフォルトの名無しさん:2009/01/31(土) 12:21:07
[ ]に | は使えないよ

635 :デフォルトの名無しさん:2009/01/31(土) 13:38:00
質問なんですが、4桁の数字の頭にAという文字を付けたい場合、
[0-9][0-9][0-9][0-9]をどうやって置換すればいいんですか?

636 :デフォルトの名無しさん:2009/01/31(土) 13:53:10
$str ='123b2345';
echo preg_replace('/[0-9]{4}/','A$0',$str);

-- 出力結果 --
123bA2345

637 :デフォルトの名無しさん:2009/01/31(土) 14:04:13
正規表現関係ないじゃん…

638 :デフォルトの名無しさん:2009/01/31(土) 14:38:44
>>632-633
助言ありがとうございます、.を取り除き進歩しました

今度は
$Pattern = "/([^<]h1*>[^a\s]*>)(.*?)(<\/a>)/";

のようにしてみたんですが、全然上手くいきませんでした


639 :デフォルトの名無しさん:2009/01/31(土) 14:43:53
>>638
完全にスレ違いなので、お使いの言語のスレへいってくだしあ

640 :635:2009/01/31(土) 15:09:36
教えろ

641 :デフォルトの名無しさん:2009/01/31(土) 16:37:42
>>640
>>1

642 :デフォルトの名無しさん:2009/01/31(土) 16:42:28
>>641
おまえ教えろ

643 :デフォルトの名無しさん:2009/01/31(土) 16:53:04
>>642
>>1
>>636

644 :デフォルトの名無しさん:2009/01/31(土) 17:31:16
教えられてもそれが答えと気づかなかったでござるの巻

645 :デフォルトの名無しさん:2009/01/31(土) 17:38:44
ござる教えろ

646 :デフォルトの名無しさん:2009/02/01(日) 00:07:27
http://www.pururu.co.jp/goods/item/430-0168/

647 :デフォルトの名無しさん:2009/02/01(日) 00:42:14
>>646
つ それ「こざる」

648 :デフォルトの名無しさん:2009/02/01(日) 01:09:08
答えを教えられていることを伝えたら答えを教えろと言われたでござるの巻

649 :デフォルトの名無しさん:2009/02/01(日) 05:12:34
おしえろ教えろ

650 :デフォルトの名無しさん:2009/02/02(月) 04:33:30
教えろおしえろオシエロ、、、エロ!?

651 :デフォルトの名無しさん:2009/02/02(月) 07:54:44
そこでこざるの出番でござるよ

652 :デフォルトの名無しさん:2009/02/03(火) 17:05:09
Perlの質問です。

.......<code>.......</code>......
....<code>...........</code>......

こんな感じのドキュメントを、<code>または</code>の前で区切ってsplitで分けようとして
書きましたがうまくいきません。何が悪いのでしょうか。

@content = split( /(?=<(|\/)code>)/, $content);

653 :デフォルトの名無しさん:2009/02/03(火) 17:17:00
>>652
たぶん空文字列や'/'が混じるのが御気に召さないのだろうと
思うがそれは君が (|\/) でキャプチャーしているからだよ。
いらなければ (?:|\/) とか \/? とかにするといい。

654 :デフォルトの名無しさん:2009/02/03(火) 17:26:39
>>653
迅速かつ的確なアドバイス、ありがとうございます。上手くいきました。
意味はこれから勉強していきます。

655 :デフォルトの名無しさん:2009/02/04(水) 19:03:45
お願いします( ゚ω゚ ) 言語はC#を用いています。

正規表現にて
 [ok] 100
 [ng] 01 → 1
 [ok] 0.001
 [ng] 00 → 0
 [ok] 0.1000

前ゼロ入力をReplaceで""に置き換えたいのですが、正規表現が上手く書けませぬ
教えてくださいエロい人

656 :デフォルトの名無しさん:2009/02/04(水) 19:29:16
関口宏「ベジータさん、今までいろいろな敵と戦ってきましたね?」

ベジータ「ふん、ゴミに興味などない」

関口、リーダー『ゴミに興味などない』

ベジータ「な……なんだ貴様ら!?」

リーダー「そんなベジータさんにはこんな問題!」

関口宏「ベジータさんが戦った、ギニュー特選隊のメンバー、五人全員お答え下さいスタート!」

リーダー「走って!まだよまだよまだよどうぞ!」

ベジータ「ギニュー! グルド! えー……バータ! ……待てよ、ギニュー、グルド、バー……くそ、わからん! あっ、ザーボン! なにっ!? ドドリア! くそったれ! ギニュー! グル」

ブッブー!

ベジータ「はぁ……はぁ……」

関口宏「リクーム、ジース」

ベジータ「あーリクーム……」

657 :デフォルトの名無しさん:2009/02/04(水) 21:19:39
new Regex( @"^0+(?!\.)" )
でString.Emptyに置き換えてみたら

でもこれだと000は""になっちゃうけど

658 :デフォルトの名無しさん:2009/02/04(水) 21:22:25
>>655

C#の構文は知らないのですが、

/^0+(\d)/$1/

に相当する正規表現でどうでしょうか

659 :デフォルトの名無しさん:2009/02/05(木) 10:33:34
>>657
>>658
ありがとう(・ω・)
でもダメですた(;´Д`)

^0+(?!\.) 開始0の入力が不可ですた
/^0+(\d)/$1/  $1がサポられてないですた

お騒がせして申し訳ありませんでした。
もう少しイジくり回してみます。

660 :デフォルトの名無しさん:2009/02/05(木) 11:13:55
秀丸エディタでの正規表現です。

abcdefghijxyz
abcdefg
xyzdefabc

から1行の中にabcとxyzの両方を含む行(1と3行目)を検索したいのですがどのように書いたらいいですか?

(.*abc.*xyz.*\n)|(.*xyz.*abc.*\n)
上のように書くとできるのですが含む文字列を増やした場合大変そうです。
本来はどのように書くのでしょうか教えてください。
簡単に&のような文字があるんでしょうか。

661 :659:2009/02/05(木) 12:04:30
お騒がせしました(・ω・)出来まスタ スタ
解:System.Text.RegularExpressions.Regex(@"(^|(?=\.))0(?=[0-9])");
ありがとう御座いました。

662 :デフォルトの名無しさん:2009/02/05(木) 13:24:20
>>660
http://www.din.or.jp/~ohzaki/regex.htm#And

663 :デフォルトの名無しさん:2009/02/05(木) 14:27:14
>>660
^(?=.*abc)(?=.*xyz).*$

664 :デフォルトの名無しさん:2009/02/05(木) 15:37:08
テキストファイルの検索でファイル内に複数の単語があるかどうか検索するときには
どういった感じにすればいいんでしょうか?


665 :デフォルトの名無しさん:2009/02/05(木) 15:46:23
>>664
ttp://www.pururu.co.jp/goods/item/430-0168/

666 :デフォルトの名無しさん:2009/02/06(金) 10:30:49
クラスの中でグループを使いたい場合はどうしたらいいですか?

[123(456)]
とした場合1/2/3/456にマッチする。

667 :デフォルトの名無しさん:2009/02/06(金) 10:32:36
中じゃなく外でやれ。
([123]|456)

668 :デフォルトの名無しさん:2009/02/06(金) 11:17:30
なるほろろ

669 :デフォルトの名無しさん:2009/02/06(金) 13:05:59
いやん。中に出して!

670 :659:2009/02/06(金) 18:08:08
>>667 悔しいけど感じちゃう ビクンッビクンッ

671 :デフォルトの名無しさん:2009/02/06(金) 20:46:31
janeviewでwsh使用してますが、
2000にマッチして、DATE: 2000にはマッチしないようにしたいのですが
どうしたらいいですか?

672 :デフォルトの名無しさん:2009/02/06(金) 22:10:55
(?<!DATE:)2000

かな。たぶん・・・
>>2
http://www.kt.rim.or.jp/~kbk/regex/regex.html#NEGATIVELOOKBEHIND
を読んで。

673 :デフォルトの名無しさん:2009/02/06(金) 22:14:47
おっと、WSH か・・・ダメかもしれないね。
if文で2重チェックすればいいんじゃない?

674 :デフォルトの名無しさん:2009/02/06(金) 22:22:42
>>2
.NET Framework 正規表現言語要素
http://msdn.microsoft.com/library/ja/cpgenref/html/cpconregularexpressionslanguageelements.asp
にちゃんと書いてあった。
.NET なら (?<!・・・・) が使えるみたいだけど、WSH はよくわからん。どこに書いてるんだろう・・・

675 :デフォルトの名無しさん:2009/02/06(金) 22:28:02
WSH(JScript)の正規表現は↓でおk
http://msdn.microsoft.com/ja-jp/library/28hw3sce.aspx

676 :デフォルトの名無しさん:2009/02/06(金) 22:29:02
ググったら出てきた。

正規表現による Visual Basic Scripting Edition (VBScript) の機能強化
http://msdn.microsoft.com/ja-jp/library/ms974570.aspx

ここには (?<!・・・) は書いてない。
書いてないから出来ない、と考えるべきか、メンドクサイから書かなかったのか。
出来ることは書くが、出来ないことは書かない。フツウ、そうだよな・・・
ちなみに文書の日付は May 10, 1999 だ。
自分で実験してたしかめろや。

677 :デフォルトの名無しさん:2009/02/06(金) 22:32:59
>>675 そっちのが新しい文書やね。やっぱり (?<!・・・) は書いてない。

678 :デフォルトの名無しさん:2009/02/06(金) 22:42:20
鬼車使えばいいじゃん

679 :デフォルトの名無しさん:2009/02/07(土) 03:54:02
>>672-678皆さんありがとうございます。

>>678さん
いつのまにか鬼車ってやつに変わってたんですね
ヘルプの更新してなかったので気が付かなかったです。

鬼車にしたら>>672さんのやり方で出来そうだったんですけど、
なぜか、「正規検索のテスト」のウィンドウ上だとうまく出来てるみたいなんですが、
実際に「ログから検索」にかけるとDATE: 2000が掛かってしまうみたいです。(でもハイライトされない)

結局、検索を本文のみに絞るオプションを発見して一応望む結果は出せたのですが、
何故そうなるのか、どうもしっくり来ないです…

逆に(?<=DATE: )2000でログ検索かけてみると今度は全くマッチしない状態になります。
でもテストウィンドウ上ではちゃんとマッチするんですよね…。
なんかおかしい気がします。Janeのバグなんでしょうかね?

680 :デフォルトの名無しさん:2009/02/07(土) 20:12:26
http://hoge.net/dir/image/3桁の数字/3桁の数字.jpgというURLがあります
最後の「3桁の数字.jpg」を抜き出した意のですが、どのようにやったら綺麗にかけますか?
ヒントをください

681 :デフォルトの名無しさん:2009/02/07(土) 20:16:20
/[0-9][0-9][0-9].jpg$/

682 :デフォルトの名無しさん:2009/02/07(土) 20:41:09
/[0-9][0-9][0-9]\.jpg$/

683 :680:2009/02/07(土) 20:52:29
わかりました感謝します

684 :デフォルトの名無しさん:2009/02/07(土) 21:33:57
/\d{3}\.jpg$/

685 :デフォルトの名無しさん:2009/02/09(月) 19:35:31
gawkの質問です。
村にはヒットさせたいが、川村とか大村とか村の前に特定の文字がついた場合にはヒットしたくない場合、正規表現ではどう書けばいいでしょう?
/![川大]村/
とかでいいんでしょうか?


686 :デフォルトの名無しさん:2009/02/09(月) 21:35:40
/[^川大]村/

687 :デフォルトの名無しさん:2009/02/09(月) 21:52:07
ありがとうございました。

688 :デフォルトの名無しさん:2009/02/09(月) 22:03:09
これだとただの「村」にはマッチしないんだよな

689 :デフォルトの名無しさん:2009/02/09(月) 22:11:32
正規表現は難しいからね。これ自体が一つのプログラミング言語と同等だし。

690 :デフォルトの名無しさん:2009/02/09(月) 22:13:29
いや、それはない

691 :デフォルトの名無しさん:2009/02/10(火) 01:21:53
/[^川大]村|^村/

これはどうかね

692 :デフォルトの名無しさん:2009/02/10(火) 08:51:21
後方一致
/(?<![川大])村/

693 :デフォルトの名無しさん:2009/02/10(火) 09:55:50
gawkでって話だから戻り読みはなしだろう。


694 :デフォルトの名無しさん:2009/02/10(火) 23:02:24
●正規表現の使用環境
サクラエディタ v1.6.4.0

●検索か置換か?
置換

●説明
「 xml:space=preserve>」を検索のキーとして
キーを含む行末までの文を置換したい

●対象データ
<string1 xml:space=preserve> </string1>
<string2 xml:space=preserve>     </string2>

●希望する結果
<string1/>
<string2/>

よろしくお願いします

695 :デフォルトの名無しさん:2009/02/10(火) 23:27:10
s/<[^>]*xml:space=preserve>//g、でどうかな。

696 :デフォルトの名無しさん:2009/02/11(水) 01:01:41
* で貪欲マッチするとマズいか。
最初の文字が x だから、
s/<[^x]*xml:space=preserve>//g、でどうだ。

697 :デフォルトの名無しさん:2009/02/11(水) 13:40:25
>>694

s/<([^\s]+)\sxml:space=preserve>[^\n]+<\/\1>/<\1\/>/g

でどうでしょう。

698 :デフォルトの名無しさん:2009/02/11(水) 13:44:59
s/<([^\s]+)\sxml:space=preserve>[^\r\n]+<\/\1>/<\1\/>/g


改行コードが文字コードによっていろいろなので少し修正
XMLが複雑な入れ子構造だとうまく動作しない場合がありえますが
シンプルな構造で、閉じタグも同じ行にあるのなら大丈夫かも。
サクラエディタは持ってませんが()でのキャプチャは\数字で参照できるようですね。

699 :デフォルトの名無しさん:2009/02/11(水) 13:47:57
s/<([^\s]+)\sxml:space=preserve>[^\r\n]+<\/\1>/<$1\/>/g


こういう風にも書けるのかな

700 :デフォルトの名無しさん:2009/02/11(水) 15:55:48
Perl互換の正規表現に対応しているソフトで

ab
cd

を検索するのに /ab.cd/m と書いたのにヒットしません。
/ab.*cd/m も /ab\ncd/m もダメです。バグでしょうか?

701 :デフォルトの名無しさん:2009/02/11(水) 16:42:50
>>700
そのソフトの名前を出してくれないならどこまで互換性あるのかわからないし
作者かユーザーに聞けとしか。

702 :デフォルトの名無しさん:2009/02/11(水) 17:15:32
>>700
ほんとうにperl互換なら、s オプションをつければいいと思う。

/ab[\r\n]*cd/s

703 :デフォルトの名無しさん:2009/02/11(水) 18:09:38
>>701
このeDocArrangementというソフトです。業務用なので値段がすごいです。試用版で勉強中です。
OCR結果から顧客名を取り出す作業をしたいと思いまして。。。
http://www.technostyle.net/edocarrangement/
>>702
ありがとうございました。出来ました。
\nだけではダメなんですね。詳説正規表現を読み始めたところですが、そんなことは書いてないような気がします。
別の教科書を探すべきでしょうか?

704 :デフォルトの名無しさん:2009/02/11(水) 18:12:36
>>703
\r\nなのはWindows環境だからじゃないの?
それでもオープン時にテキストモード指定してれば\nでいいけど。

705 :デフォルトの名無しさん:2009/02/11(水) 18:18:46
>>704
はい。窓です。正規表現の世界では異端なんですねw


706 :デフォルトの名無しさん:2009/02/11(水) 18:28:21
そもそもそのデータはどうやって持ってきてるの?
もしもデータがファイルにあって、ファイルオープンのコードを自分で書いたのなら
そのパラメタが間違ってるよ。

707 :デフォルトの名無しさん:2009/02/11(水) 18:46:37
>>706
OCRデータから目的のテキストだけを抜き出す作業です。
xdwファイルにOCRデータがありまして

氏名
西村ひろゆき
生年月日


というデータから名前を抜き出す作業です。
/氏名\n(.*)\n生年月日/m で抜き出せると思って試行錯誤したんですが、うまくいかなくて泣きついた次第です。
ファイルオープンのコードをかくという作業はありません。というか、低レベルなのでそういう高度な作業はよくわからない状態です。。。

708 :デフォルトの名無しさん:2009/02/11(水) 18:52:31
>>703
もし、正規表現を使い始めたばかりなら、詳説正規表現はまだ読むべきじゃない。
読むならまず入門書から入るべきかと。

709 :デフォルトの名無しさん:2009/02/11(水) 18:56:53
>>708
ありがとうございます。たしかに自分には早いのではないかという気がしていました。
はっきりと断言していただきありがとうございます。初心者用の教科書をAmazonで探します。
もしもお勧めがあれば、ご教示いただけましたら幸いです。希望ばかりで大変心苦しいのですが。。。

710 :デフォルトの名無しさん:2009/02/11(水) 19:24:02
>>705
行の末尾がOSによって異なるんだよ。
 \n だけのOS(うにくす系)
 \r だけのOS(りんご系)
 \r\n 両方必要なOS(まど系)
(ここまでは、パソコンの基礎知識)

この3種類に共通に使えるように
[\r\n]*
って書くんだよ。
(これは正規表現の応用問題。よく使う慣用句みたいなもの)

711 :デフォルトの名無しさん:2009/02/11(水) 19:24:13
自分はPerl本から入ったクチだけど、>>709の場合、
Perlの処理部分については必要ないよね、おそらく。

特に正規表現に関して言うなら、試行錯誤して身につけたものの方が多い。
一番参考にしたのは秀丸のヘルプだったりする。

だから本を買う前に、Googleで正規表現を検索して、トップ30ぐらいまでの
ページを順に読むほうがよいかと。

テキストエディタでの正規表現の利用方法を記載しているものもあるけど、
それらも基本は同じだから、まずそこでイメージを掴むべきかと。

本を買うのは、その後。、少しでも自分のイメージができた後で書店で中身を
確認して買うべきだと思う。

最近のテキストエディタは検索結果に一致する箇所にマーカーをするものもあるから、
それで勉強するのもベストかと。

自分が知っている分では秀丸とSakuraエディタ。それ以外にもあるとは思う。

712 :デフォルトの名無しさん:2009/02/11(水) 20:34:50
俺のオススメは >>2 のいちばん最初に書いてある
 正規表現メモ
 http://www.kt.rim.or.jp/~kbk/regex/regex.html
だな。

713 :694:2009/02/11(水) 21:33:37
>>695-699
お答えいただき、ありがとうございました
早速試してみたのですが、検索に引っかかりませんでした…

714 :デフォルトの名無しさん:2009/02/11(水) 22:57:49
>>713

サクラエディタを使ったことないので、サクラエディタでの置換方法は分からないのですが

<(\S+)\sxml:space=preserve>[^\r\n]*<\/\1>

で検索にヒットしないでしょうか?
あとは、それを

<$1\/>

に換えるだけですむのですが・・

715 :デフォルトの名無しさん:2009/02/11(水) 22:59:51
714では、

 [^\r\n]+



 [^\r\n]*

にしました

716 :デフォルトの名無しさん:2009/02/11(水) 23:28:16
っつーか、>>695のsed式での回答ってどうなんだろう?
個人的には、環境に左右されないからアリだと思うんだけど。
スラッシュで囲むっていう知識は前提にしていいのかな?

717 :694:2009/02/12(木) 01:29:13
>>714
出来ました!ありがとうございます!
しばらく頑張ってたのですが、どうにもうまくいかず参ってたところでした
本当にありがとうございました!

718 :デフォルトの名無しさん:2009/02/12(木) 02:18:07
>>716

まあ正規表現だってのをはっきりさせるのはいいと思うけど、
スラッシュ以外も区切りにできる(できないのもあるけど)というのを
知らない人がさらに増えるようなきがするのはやだなあ。


719 :デフォルトの名無しさん:2009/02/12(木) 08:50:34
>>718
なんか論点が違う気も。

720 :デフォルトの名無しさん:2009/02/13(金) 02:32:08
Firefoxのjavascriptを使って、

<div class="mori">
<h2>てすと</h2>
<img src="./test.gif">
</div>
<div>わわわ</div>

のようなHTMLからclassがmoriの上四行の部分を抜き出したいのですが、正規表現を

<div class="mori">(.|\n)*<\/div>

とすると最後の<div>わわわ</div>まで入ってしまいます。
次に

<div class="mori">[^(</div>)]*<\/div>

を試してみたのですが、これもうまくいきません。
角カッコの中は丸カッコで囲んでも無視されて一文字ずつに分解されてしまうようです。
どうすればいいんでしょうか?

721 :デフォルトの名無しさん:2009/02/13(金) 03:26:11
>>720
*や+は最も長く貪欲にマッチしようとするから、最後の</div>にマッチする。
*や+の直後に?を付ければ最小マッチになってできる限り短くしようとするから
望むような結果になるはず。


722 :デフォルトの名無しさん:2009/02/13(金) 10:14:34
JavaScriptならDOMで操作しないさいよ…


723 :デフォルトの名無しさん:2009/02/13(金) 20:04:39
>>721
おおおおお!まさにこれを求めていました!
いろんな場面で使えそうでとても助かります。どうもありがとうございます。

>>722
それがGM_xmlhttpRequestで得る値なので、全部テキスト形式になってしまうのです。

724 :デフォルトの名無しさん:2009/02/14(土) 12:09:33
phpで正規表現を使うかプログラムでゴリゴリ書くか迷ってます
やりたい事は、見出し語:[発音,][定義1][,"例文1","例文2",...][ *注記][; 定義2...]みたいな
テキストを分解して各(配列)変数に設定する、みたいな事なのですがpreg_match_allみたいな関数で
この程度なら実現可能そうでしょうか?
既に結構時間を使ってるので見込みが無さそうならサッサと見切りを付けたいのですが…


725 :デフォルトの名無しさん:2009/02/14(土) 12:51:03
全部ちゃんと分割できるよ

726 :デフォルトの名無しさん:2009/02/14(土) 13:28:57
うっ…出来るんですか。(まだ定義の分割すら碌に出来てない…)
もう少し頑張ってみます

727 :デフォルトの名無しさん:2009/02/14(土) 20:45:00
[*]の[]を普通の文字として扱いたいときどうすればいいんですか?

\[*\]だと無理ですよね

728 :デフォルトの名無しさん:2009/02/14(土) 20:49:38
ふつうは \[*\] でいいんだよ。ふつうは。

729 :デフォルトの名無しさん:2009/02/14(土) 20:59:08
そうですか・・・
\[*\]だと]しかクォートされないので・・・

730 :デフォルトの名無しさん:2009/02/14(土) 21:21:17
[[]*\]

731 :デフォルトの名無しさん:2009/02/14(土) 21:40:27
やはり]だけでした

732 :デフォルトの名無しさん:2009/02/14(土) 21:45:24
それをどうやって確かめてるんだ

733 :デフォルトの名無しさん:2009/02/14(土) 21:53:05
アナログ放送をIEPGで登録すると[S]や[字]といった文字が名前に付きこれが邪魔なのでリネームしたいんです
たとえばファイル名[S][字].avi
s/\[S\]//
してやるとファイル名[字].avi
となりますが
s/\[*\]//
とするとファイル名[S[字].avi
といった感じになります


734 :デフォルトの名無しさん:2009/02/14(土) 21:57:33
>>733
頭悪いのに勝手に自分で問題を切り分けずに、最初からそれをいえよw

*の使い方しらべとけ

735 :デフォルトの名無しさん:2009/02/14(土) 22:00:07
わからないんですね
すいません

736 :デフォルトの名無しさん:2009/02/14(土) 22:00:43
「頭悪い」なんていきなり何様ですか
わからないならわからないと言えばいいじゃないですか

737 :デフォルトの名無しさん:2009/02/14(土) 22:17:22
どっからどう見ても最初に質問した奴と途中の奴が別人w

738 :デフォルトの名無しさん:2009/02/14(土) 22:19:09
s/\[*m9(^Д^)\]//

739 :デフォルトの名無しさん:2009/02/14(土) 22:28:42
s/\[..*\]//

740 :デフォルトの名無しさん:2009/02/14(土) 23:26:05
>733

横レス失礼します。

s/\[[^\]]*\]//g

これでどうでしょうか?

741 :デフォルトの名無しさん:2009/02/14(土) 23:33:42
>>733

s/\[.*?\]//g


これでも大丈夫でしょう。
最短マッチに対応している正規表現エンジンの場合は。

*や+は条件に合致しつつできるだけ多くの文字を消費するような選択をします。
*?、+?は最短マッチといって、その条件を満たす最短の場合が選ばれます。
想定される用途では否定の文字クラス [^いろいろな文字] を使うか
最短マッチの .*? を使われると良いとおもいます。
別の表現なら否定先読み (?!文字列) をつかっても長くなりそうですが書けます。
ご参考になれば幸いです。

742 :デフォルトの名無しさん:2009/02/15(日) 10:10:19
>>733
最初からそれを書け。
コミュニケーション能力不足。
人間相手にコミュニケーションできないで
コンピュータ相手のコミュニケーションが出来ると思うのか?

s/\[[S字]\]//

743 :デフォルトの名無しさん:2009/02/15(日) 15:20:54
補足です。
>>741の正規表現は*の前に見づらいかもしれませんがピリオド.があるのでご注意ください。


>>733の正規表現 /\[*\]/ にヒットする文字列はたとえば

]
[]
[[]
[[[]
[[[[]
[[[[[]

になります。

744 :デフォルトの名無しさん:2009/02/15(日) 17:02:57
いくらなんでも初歩で躓きすぎだろ
質問に無関係な知識押し付けてる方もひどいが

745 :デフォルトの名無しさん:2009/02/16(月) 00:02:06
>>742が一番馬鹿に見える

746 :デフォルトの名無しさん:2009/02/16(月) 00:17:40
キラーパスだな

747 :デフォルトの名無しさん:2009/02/16(月) 03:22:04
>>742はネタだろJK

748 :デフォルトの名無しさん:2009/02/18(水) 14:12:37
++とか(?>)とかのpossessive quantifierってどういうときに使ったっけ?
あれば便利そうは気はするし、実際なんかで使った記憶はあるんだけど思い出せない

749 :デフォルトの名無しさん:2009/02/18(水) 18:05:15
わからないから聞いてるならまだしも、忘れたから聞いてるってのはそれこそググレば?

750 :デフォルトの名無しさん:2009/02/19(木) 20:45:50
すいません質問させてください

@/home/test/hoge/test/test.txt
A/home/test/hoge/test/document.txt
↑のパスがありまして、そこからtestで検索をすると
@のtext.txtのみが該当する正規表現ってうまく出来ないものでしょうか?
ファイルまでの途中のパスは含めないで最後のスラッシュ後のファイル名のみ
検索対象としたいのですが悩みまくりです・・・
イメージ的にはエディターでの正規表現で@のみ該当させる感じです。
どなたかご教授願えないでしょうか?

751 :デフォルトの名無しさん:2009/02/19(木) 20:58:11
C#を使っています
string か strin か stri か str か st か s
にマッチするパターンを今は↓のように書いているんですが
^s(t(r(i(n(g)?)?)?)?)?$
もっと分かりやすい書き方ってありますか?

752 :デフォルトの名無しさん:2009/02/19(木) 22:42:23
>>750
検索キー 「test.txt」

753 :デフォルトの名無しさん:2009/02/19(木) 22:44:47
>>750
/([^\/]+\/)*(.*)/ で、\1がパス、\2がファイル名。

754 :デフォルトの名無しさん:2009/02/19(木) 22:54:31
>>750
秀丸エディタなら↓これでいけた。他は知らん
(?<=.+/)test

755 :デフォルトの名無しさん:2009/02/19(木) 22:57:56
>>750

test\.txt$

でどうでしょう

756 :デフォルトの名無しさん:2009/02/19(木) 22:59:13
>>750

少し修正

test\.txt[\r\n$]

757 :デフォルトの名無しさん:2009/02/19(木) 23:00:16
ひどくなってるYO

758 :デフォルトの名無しさん:2009/02/20(金) 00:01:43
test\.txt(?=$|\b|[\r\n])

759 :デフォルトの名無しさん:2009/02/20(金) 02:53:45
YoutubeをダウンロードするFirefoxのuserchrome.jsスクリプトの一部なんだけど
var[ \r\n\t]+swfArgs[ \r\n\t]*=[ \r\n\t]*\{(.*,|)[ \r\n\t]*(t|'t'|"t")[ \r\n\t]*\:[ \r\n\t]*['"]([a-zA-Z\-_0-9]+=)['"].*\}
の(.*,|)の意味するところがわからない。    ↑
|って○○か××を意味するメタ文字じゃないの?なんで)の直前にあるんだろう?

760 :デフォルトの名無しさん:2009/02/20(金) 03:00:42
(foo|) は (foo)? と同じ意味では。

761 :デフォルトの名無しさん:2009/02/20(金) 03:13:23
.*0か1個以上ある?じゃあ.+と同じ?

762 :デフォルトの名無しさん:2009/02/20(金) 08:04:22
はあ?

763 :750:2009/02/20(金) 08:57:02
みなさんレスありがとうございます
例えが悪かったですが実現したいのはデスクトップの検索エンジンでのファイル名検索でファイル名のみで検索したいのです。
みなさんのレスを参考に思考錯誤してみます

764 :デフォルトの名無しさん:2009/02/20(金) 20:27:44
>>759
"t": "([^"]+)"
俺は、これで済ませてるw

765 :デフォルトの名無しさん:2009/02/20(金) 21:39:41
すみません(foo)?の意味がわかりません教えてください

>>764
それでいけるよねw

766 :デフォルトの名無しさん:2009/02/21(土) 21:02:25
>>751
C#なら
s.Length > 0 && "string".StartsWith(s)
のようにやればいいのに。

767 :デフォルトの名無しさん:2009/02/23(月) 19:43:45
女のコの性器表現てどれくらいの種類があるんだろう


768 :デフォルトの名無しさん:2009/02/23(月) 19:56:18
単語だけならともかく、そんなのは文脈によって変わるし、
『×××』だけでもそれを表すことができる上に、『大事なところ』などボカした表現までスコープを広げると
とても現代の正規表現で賄いきれるものではない。
言語学の分野で議論してくるがいい。

769 :デフォルトの名無しさん:2009/02/24(火) 18:45:51
C#でWBCかワールド・ベースボール・クラシックのどちらかを含み、かつイチローか松坂のどちらかを含むline、と正規表現で
if (Regex.Match(line,"(WBC|ワールド・ベースボール・クラシック) && (イチロー|松坂)").Success)
と書いてみたのですが、いまいちうまくヒットしないです。アドバイスお願いします。


770 :デフォルトの名無しさん:2009/02/24(火) 20:15:33
正規表現の中に && とか画期的すぎるだろ・・・
テンプレの正規表現講座でも見ておいで

771 :751:2009/02/24(火) 22:56:03
>>766
確かにその方がわかりやすいですね
ありがとうございます

772 :デフォルトの名無しさん:2009/02/25(水) 10:58:18
if (Regex.Match(line, "(WBC|ワールド・ベースボール・クラシック)").Success && Regex.Match(line, "(イチロー|松坂)").Success)
でいいんじゃね?C#知らないけど。
AND増えるなら条件を配列に入れてループで。

773 :デフォルトの名無しさん:2009/02/25(水) 12:46:56
line = "ぽにょワールド・ベースボール・クラシックぽにょイチローぽにょ"

Set RegExp1 = new RegExp
Set RegExp2 = new RegExp
RegExp1.Pattern = "WBC|ワールド・ベースボール・クラシック"
RegExp2.Pattern = "イチロー|松坂"

If RegExp1.Test(line) And RegExp2.Test(line) Then
Wscript.Echo "うんこ"
End If


774 :デフォルトの名無しさん:2009/02/25(水) 12:49:30
>>772
Regex.Match の使い方が間違ってる。ちゃんと説明書読んだ?

775 :デフォルトの名無しさん:2009/02/25(水) 14:22:03
C#知らないと言っている人にそんな指摘してもなあ

776 :デフォルトの名無しさん:2009/02/25(水) 15:22:22
C# カンケーない。Regex.Match の使い方が間違ってる。

777 :デフォルトの名無しさん:2009/02/25(水) 15:42:59
>>769>>772

if (Regex.Match(line, "WBC|ワールド・ベースボール・クラシック").Success && Regex.Match(line, "イチロー|松坂").Success)

で良いが、IsMatchのほうが良さげ。

if (Regex.IsMatch(line, "WBC|ワールド・ベースボール・クラシック") && Regex.IsMatch(line, "イチロー|松坂"))

778 :デフォルトの名無しさん:2009/02/27(金) 19:33:25
少しお聞きします。

1hage(100禿)
1hage(10毛)
1hage

という文字列があった場合に、1hage(100禿)以外をマッチさせたいのですが、
なかなかうまくいきません。
どのように正規表現を書いたものでしょうか?


779 :778:2009/02/27(金) 19:34:25
>>778
すいません。追記です。
具体的には、"hage"をヒットさせたいのですが、"禿"を含むもののみマッチさせないようにしたいのです。

780 :デフォルトの名無しさん:2009/02/27(金) 19:36:03
1hage にマッチしたものから 1hage(100禿) にマッチするものを取り除く、
じゃダメなのか? どうしても1個の正規表現でやんないとダメ?

781 :デフォルトの名無しさん:2009/02/27(金) 20:30:52
>>780
うん、やっぱりそれの方がスマートでよいですよね・・・
わかりました。

無理に正規表現だけでやらないとことにします。
ありがとうございました。

782 :デフォルトの名無しさん:2009/02/28(土) 14:16:03
文章中に「A」と「AA」が混在していて、
1文字だけの「A」を2文字の「AA」にします。
2文字以上連続していない、1文字だけの「A」は
どうやったら探せますか?
/A{1}/ でも駄目ですし、/A[^A]/ だと
行の中に A しかない物が引っ掛かりません。

783 :デフォルトの名無しさん:2009/02/28(土) 16:40:50
D:\jspsh>jspsh.exe
js> "A AA AAA".replace(/(^|[^A])A([^A]|$)/g, "$1AA$2")
AA AA AAA
js> :q
Leaving "JScript Power Shell"

784 :デフォルトの名無しさん:2009/02/28(土) 21:51:49
タイ━━━━||Φ|(|´|Д|`|)|Φ||━━━━ホ

785 :デフォルトの名無しさん:2009/02/28(土) 23:10:33
>>783
ありがとう、試してみます。

786 :デフォルトの名無しさん:2009/03/02(月) 20:45:20
/(?<!A)A(?!A)/

787 :デフォルトの名無しさん:2009/03/07(土) 00:28:35
<A href="○○○○○○○">●●●●●</a>

<A href="○○○○○○○"><hogehogetag>●●●●●</hogehogetag></a>
という文字列から●●●●●を取り出したいのですが
どうやって書いたら良いか教えてケロ
決まってるのは<A href="○○○○○○○">の次の<>の外の文字列ということです。

788 :デフォルトの名無しさん:2009/03/07(土) 01:14:08
>>5みたいに書けばいいよ

789 :デフォルトの名無しさん:2009/03/12(木) 17:29:29
「から最初の」までってどうやって抜き出すんですか?教えてください

790 :デフォルトの名無しさん:2009/03/12(木) 17:40:07
「[^」]*」

791 :デフォルトの名無しさん:2009/03/12(木) 17:53:29
ありがとうございました

792 :デフォルトの名無しさん:2009/03/13(金) 00:14:55
SQL(SELECT、UPDATE、INSERT、DELETEが不明)から、
テーブル名をマッチさせる正規表現が解る方、どなたかいらっしゃらないでしょうか?

ひとつの表現で不可能なら、複数でもいいのですが…(´・ω・`)

793 :デフォルトの名無しさん:2009/03/13(金) 00:25:51
SQLの構文解析は正規表現じゃ無理

794 :デフォルトの名無しさん:2009/03/13(金) 01:07:40
金額の文字にマッチするにはどう書けばよいですか?
123,456,789 ←こういうの

795 :デフォルトの名無しさん:2009/03/13(金) 01:20:24
\d{1,3}(,\d\d\d)* かな

796 :デフォルトの名無しさん:2009/03/13(金) 08:53:14
複雑な正規表現のテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。


797 :デフォルトの名無しさん:2009/03/13(金) 08:57:59
製品名を「鼻から悪魔」にしておけば何も問題は無い

798 :デフォルトの名無しさん:2009/03/13(金) 12:11:43
>>796
私も以前、このスレではない所で同様の質問をしたが、真面目な答えは
返ってこなかったよ。正規表現から見るとプログラムテストは鬼門かもね。


799 :デフォルトの名無しさん:2009/03/13(金) 12:21:24
複雑なC言語プログラムのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

複雑なjavaのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

複雑なPHPのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

複雑なバッチファイルのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

複雑なExcelマクロのテストってどうすればいいんだろうね。
自分に都合のいいデータだけ作ってやってるけど。
実際は何が起こっても仕方ない場合が多いのだが。

・・・正規表現に限った話ではない。

>自分に都合のいいデータだけ作ってやってるけど。
問題の原因がハッキリわかってるじゃないか。それを対処すればいいじゃないか?
自分に都合のいいデータを作ってしまうのが問題なら、他人にデータを作ってもらえばいい。

800 :デフォルトの名無しさん:2009/03/13(金) 12:42:08
>>796
やったことはないが、本気でやるなら、こんな感じになるんだろう。

1.マッチすべきパターンについて構文木を作る
2.構文木を元に直交表を作る
3.実験計画法でテストケースを作る
4.テストケースをテストプログラム化する


801 :デフォルトの名無しさん:2009/03/13(金) 14:59:43
>>799
プログラム言語の場合はステップごととか、プロセジャーや
関数に分割してテストするし、型も助けになる。
正規表現の対象としているのは文字列でここから先は構文解析
しかない。複雑な組み込みシステムの入口、出口でどんな
テストデータを用意すればよいかというのと類似した問題だ。

802 :デフォルトの名無しさん:2009/03/17(火) 13:26:09
http://www.honya-town.co.jp/hst/HTdispatch?isbn_cd=4062574993
上記のwebページから以下の「マンガホーキング入門」の部分を取り出したいのですがうまくいきません
<tr>
<td bgcolor="#efefef" width="15%" align="center" nowrap><small>
書  名 </small></td>
<td width="85%"><font color="#333399" size="+1"> <strong> マンガホーキング入門 </strong> </font></td>
</tr>

"<strong>(.+?)</strong>"だとここ以外の強調部分もマッチしてしまうので
"書.*?名.+?<strong>(.+?)</strong>"のようにしたのですがこれだとひとつもマッチしてくれません
どのようにするべきなのでしょうか?

803 :デフォルトの名無しさん:2009/03/17(火) 13:28:20
あれ、書 名 の部分は実際は書&nbsp;&nbsp;名です(&=>&)

804 :デフォルトの名無しさん:2009/03/17(火) 13:36:57
自己解決しました
「.」は\nを含まないのでだめだったようです
"書.*?名.+?\n.+?<strong>(.+?)</strong>"でいけました
スレ汚しすみませんでした

805 :デフォルトの名無しさん:2009/03/20(金) 21:51:43
JavaやC#に正規表現のコンパイル機能があるけど、あれって意味あるのかな?
いつも可読性を優先してRegex.Match(data,pattern)みたいに直接使ってるんだけど、
コンパイルが必要になるほど性能が必要な正規表現ってどんなのがあるん?

806 :デフォルトの名無しさん:2009/03/20(金) 22:00:44
>>805
一般論的に正規表現のコンパイルというと、何度も同じ正規表現を
使うときに差が出る。
それが有意な差になるかはプロファイル取ってみないとわからないけど。

ところで可読性なら生の正規表現よりも定数とかに入れて
名付けた方がいいんじゃない?めんどくさいけど。

807 :デフォルトの名無しさん:2009/03/20(金) 22:06:30
>>805
perlでo使ったらうれしいときと同じだよ。

808 :デフォルトの名無しさん:2009/03/20(金) 22:09:58
>>806
>ところで可読性なら生の正規表現よりも定数とかに入れて
>名付けた方がいいんじゃない?めんどくさいけど。

コード体系とかのパースの場合は定数化してるよ。
"Key: Value"なデータのパースとかはハードコードかな。
わざわざファイル移動で確認させる価値もないし。

809 :デフォルトの名無しさん:2009/03/21(土) 02:47:41
ルールを変更可能にするため外部化、ってのもよくあるパターンだと思うけど。

195 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)