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

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

正規表現 Part6

1 :デフォルトの名無しさん:2009/05/06(水) 00:36:04
正規表現(Regular Expression)スレです。

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

【 前スレ 】 正規表現 Part5
http://pc12.2ch.net/test/read.cgi/tech/1212498448/

2 :デフォルトの名無しさん:2009/05/06(水) 00:37:38
◆関連サイト
正規表現メモ
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
【 初心者 】 正規表現 【 入門 】
http://funcchan.blog16.fc2.com/

3 :デフォルトの名無しさん:2009/05/06(水) 00:40:40
◆関連スレ
[UNIX板] 正規表現
http://pc12.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/
[5] http://pc12.2ch.net/test/read.cgi/tech/1212498448/

4 :デフォルトの名無しさん:2009/05/06(水) 00:42:02
スルーされにくい質問のテンプレと例

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

●検索か置換か?
検索

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

●対象データ
ABCA
BCAA
CABA

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

5 :デフォルトの名無しさん:2009/05/07(木) 22:55:29
すいません、質問です。
(a{3}|b{3}|c{3})

[abc]{3}
は等しいですか?

6 :トーマス:2009/05/07(木) 23:32:33
>>5
ちょっと違います

前者は aaa、bbb、ccc の3種類の文字列にしかマッチしませんが
後者は abc、cba、aab などにもマッチします

後者は3文字の文字列であれば1文字ごとに文字が変わってもいいのです


7 :デフォルトの名無しさん:2009/05/08(金) 01:41:34
>>6
なるほどぉ
理解できました、ありがとうございました!

8 :デフォルトの名無しさん:2009/05/08(金) 19:09:29
http://pc12.2ch.net/test/read.cgi/software/1236203046/396-397n
より誘導されてきました。

X-Finderは内部関連付けに正規表現を使えるのですが

foo.gz や foo.tar.gz その他の *.gz にマッチするが
foo.xcf.gz にマッチしないものはどう書けば良いかわからず困っています。

http://www.din.or.jp/~ohzaki/regex.htm#WithoutXYZ
ここを参考に

*.([^x]|x(c?x)*([^xc]|c[^xf]))*(x(c?x)*x?)?.gz

と書いてみましたが動きませんでした。
希望通りの動作にするにはどう書けば良いのでしょうか?

9 :デフォルトの名無しさん:2009/05/08(金) 19:14:17
>>8
(?<!xcf).gz

10 :デフォルトの名無しさん:2009/05/08(金) 19:52:11
>>9
レスどもです。
でも (?<!xcf).gz と *.(?<!xcf).gz と *(?<!xcf).gz を試してみましたがダメでした。

x-finderがどの正規表現に対応してるかわかれば良かったんですが
検索しても見つからなかったんですよね…。

11 :8:2009/05/08(金) 20:22:04
x-finderの機能で別の指定方法があり
そちらで希望の動作ができましたので
質問を下げさせていただきます。お騒がせしました。

12 :デフォルトの名無しさん:2009/05/08(金) 21:55:38
スレ違いでなければいいのですが…

●正規表現の使用環境
PHP4.3

●検索か置換か?
置換

●説明
html内のテキストから特定のタグ(特定のurlへのリンク)のみを削除したい

●対象データ
…テキスト<a href="a.php?id=○○">「aへのリンク」</a>テキスト<a href="b.php?id=△△">「bへのリンク」</a>テキスト<a href="c.php?id=□□">「cへのリンク」</a>テキスト…

●希望する結果
…テキスト<a href="a.php?id=○○">「aへのリンク」</a>テキスト「bへのリンク」テキスト「cへのリンク」テキスト…


このようなことは可能でしょうか?
aへのリンクのみを残して、bとcへのリンクを削除したいのですがタグとタグの間の文字は残したいのです
また動的ファイルのためパラメータがその都度変化します

13 :デフォルトの名無しさん:2009/05/08(金) 23:26:26
(\<a href="[^a].+\>)「.+?」(\<\/a\>)
これで$1と$2を空白に置換でどうだろ。
今、出先なんで確認取ってないです。

14 :トーマス:2009/05/09(土) 02:15:26
>>12
PHP4.3 で動くかどうかは分からないのですが、
以下の正規表現チェッカーで動いたものを貼っておきますね。

PHP正規表現チェッカー ver1.0.1
http://www.rider-n.sakura.ne.jp/regexp/regexp.php

検索表現
<a\s[^>]*href\s*=(?!\s*"?\s*a\.php\?id=)[^>]+>(.*?)</a>

置換表現
\1

何故か置換表現を $1 と書いても動かなかったので \1 にしました。
$1 で動くのであればこれを使って下さい。

15 :デフォルトの名無しさん:2009/05/09(土) 14:57:39
>>13
>>14
ありがとうございます
こちらも出先なので戻り次第確認してみようと思います

16 :デフォルトの名無しさん:2009/05/10(日) 01:19:30
909 :デフォルトの名無しさん:2009/04/17(金) 00:22:26
簡単な検証方法
<center><script> var x1, y1, x2, y2, x3, y3; var a, b, c, s, S; var S1,S2,M,N;
/*可変*/ N=1000;
document.write('<style>td,th{font-size:10;} </style><table border=1><tr>');
document.write('<th>x1 </th><th>y1 </th><th>x2 </th><th>y2 </th><th>x3 </th><th>y3 </th>');
document.write('<th>底辺x高さ÷2公式<br>による面積計算結果 </th>');
document.write('<th>ヘロン公式による<br>√を使った面積計算結果 </th>');
document.write('<th>問題となる誤差<br>倍率'+M+'倍 </th> </tr>');

for(i=-N;N>=i;i++){ // 数値を自動代入
x1=0; y1=i;
x2=-1; y2=0;
x3=1; y3=0;

a=Math.abs(x1-x2)*Math.abs(y1-y2); // 底辺x高さ÷2公式による面積の計算
b=Math.abs(x2-x3)*Math.abs(y2-y3);
c=Math.abs(x3-x1)*Math.abs(y3-y1);
s=(Math.max(Math.max(x1,x2),x3)-Math.min(Math.min(x1,x2),x3))
s*=(Math.max(Math.max(y1,y2),y3)-Math.min(Math.min(y1,y2),y3)); S=s-(a+b+c)/2; S1=S;

a = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); // ヘロン公式による√を使った面積の計算
b = Math.sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
c = Math.sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
s = (a + b + c) / 2.0; S = Math.sqrt(s * (s - a) * (s - b) * (s - c)); S2=S;

document.write('<tr><td> '+x1+' </td><td> '+y1+' </td>'); // 計算結果と誤差を表示
document.write('<td> '+x2+' </td><td> '+y2+' </td><td> '+x3+' </td><td> '+y3+' </td>');
document.write('<td> '+S1+' </td><td> '+S2+' </td><td> '+(S1-S2)+' </td> </tr>');
}document.write(' </table>');
</script>

17 :デフォルトの名無しさん:2009/05/10(日) 01:24:06
<center><script>varx1,y1,x2,y2,x3,y3;vara,b,c,s,S;varS1,S2,M,N;
/*倍率*/M=100000000;
/*回数*/N=1000;
document.write('<style>td,th{font-size:10;}</style><tableborder=1><tr>');
document.write('<th>x1</th><th>y1</th><th>x2</th><th>y2</th><th>x3</th><th>y3</th>');
document.write('<th>底辺x高さ÷2公式<br>による面積計算結果</th>');
document.write('<th>ヘロン公式による<br>√を使った面積計算結果</th>');
document.write('<th>問題となる誤差<br>倍率'+M+'倍</th></tr>');

for(i=0;N>i;i++){//数値を自動代入
x1=(Math.random()*2-1)*M;y1=(Math.random()*2-1)*M;
x2=(Math.random()*2-1)*M;y2=(Math.random()*2-1)*M;
x3=(Math.random()*2-1)*M;y3=(Math.random()*2-1)*M;

a=Math.abs(x1-x2)*Math.abs(y1-y2)/2;//底辺x高さ÷2公式による面積の計算
b=Math.abs(x2-x3)*Math.abs(y2-y3)/2;
c=Math.abs(x3-x1)*Math.abs(y3-y1)/2;
s=(Math.max(Math.max(x1,x2),x3)-Math.min(Math.min(x1,x2),x3))
s*=(Math.max(Math.max(y1,y2),y3)-Math.min(Math.min(y1,y2),y3));S=s-a-b-c;S1=S;

a=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));//ヘロン公式による√を使った面積の計算
b=Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
c=Math.sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
s=(a+b+c)/2.0;S=Math.sqrt(s*(s-a)*(s-b)*(s-c));S2=S;

document.write('<tr><td> '+x1+'</td><td> '+y1+'</td>');//計算結果と誤差を表示
document.write('<td> '+x2+'</td><td> '+y2+'</td><td> '+x3+'</td><td> '+y3+'</td>');
document.write('<td> '+S1+'</td><td> '+S2+'</td><td> '+(S1-S2)+'</td></tr>');
}document.write('</table>');
</script>

18 :デフォルトの名無しさん:2009/05/10(日) 01:31:29
<center><script>var x1,y1,x2,y2,x3,y3;var a,b,c,s,S;var S1,S2,M,N;
/*倍率*/M=100000000;
/*回数*/N=1000;
document.write('<style>td,th{font-size:10;}</style><table border=1><tr>');
document.write('<th>x1</th><th>y1</th><th>x2</th><th>y2</th><th>x3</th><th>y3</th>');
document.write('<th>底辺x高さ÷2公式<br>による面積計算結果</th>');
document.write('<th>ヘロン公式による<br>√を使った面積計算結果</th>');
document.write('<th>問題となる誤差<br>倍率'+M+'倍</th></tr>');

for(i=0;N>i;i++){//数値を自動代入
x1=(Math.random()*2-1)*M;y1=(Math.random()*2-1)*M;
x2=(Math.random()*2-1)*M;y2=(Math.random()*2-1)*M;
x3=(Math.random()*2-1)*M;y3=(Math.random()*2-1)*M;

a=Math.abs(x1-x2)*Math.abs(y1-y2)/2;//底辺x高さ÷2公式による面積の計算
b=Math.abs(x2-x3)*Math.abs(y2-y3)/2;
c=Math.abs(x3-x1)*Math.abs(y3-y1)/2;
s=(Math.max(Math.max(x1,x2),x3)-Math.min(Math.min(x1,x2),x3))
s*=(Math.max(Math.max(y1,y2),y3)-Math.min(Math.min(y1,y2),y3));S=s-a-b-c;S1=S;

a=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));//ヘロン公式による√を使った面積の計算
b=Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
c=Math.sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
s=(a+b+c)/2.0;S=Math.sqrt(s*(s-a)*(s-b)*(s-c));S2=S;

document.write('<tr><td> '+x1+'</td><td> '+y1+'</td>');//計算結果と誤差を表示
document.write('<td> '+x2+'</td><td> '+y2+'</td><td> '+x3+'</td><td> '+y3+'</td>');
document.write('<td> '+S1+'</td><td> '+S2+'</td><td> '+(S1-S2)+'</td></tr>');
}document.write('</table>');
</script>

19 :デフォルトの名無しさん:2009/05/10(日) 01:40:10
JavaScriptが動く HTML実験部屋
ttp://homepage2.nifty.com/tomoarai/java/exper.html


20 :デフォルトの名無しさん:2009/05/10(日) 13:46:16
<TAG xxxxxxxxxxxxxxxxxxxxx />
<TAG xxxxxxxxxxxxxxxxxxxxx >yyyyyyyyyyyyyyyyyyyyyy</TAG>

上記文字列から、x, y を一つの正規表現で抽出することは可能でしょうか?



21 :デフォルトの名無しさん:2009/05/10(日) 13:49:53
>>20 >>4

22 :デフォルトの名無しさん:2009/05/10(日) 14:07:14
>>20

残念ながら不可能です。


23 :デフォルトの名無しさん:2009/05/12(火) 09:24:09
質問お願いしいたます。

●正規表現の使用環境
XPですFlexible Renamerなどのリネームソフトでファイル名の文字化けした箇所のみ消したいのです

●検索か置換か?
置換

●説明
半角カタカナ ロシア文字 ハングル文字 中国語の漢字 特殊な記号 を全て置き換え

英数字以外全ての文字 を全て置き換え

日本語以外全ての文字 を全て置き換え

の方法があれば教えてください

●対象データ
File_鱈鯵D12345_xxハンカクカタカナ゙x@дЩ鱈賦xxx.jpg

●希望する結果
File_12345_xxxxxx.jpg

24 :デフォルトの名無しさん:2009/05/12(火) 21:13:05
半角英数と[-_.]ぐらいを残すとして、Flexible Renamerを使うなら
[^-_.a-zA-Z0-9]
を検索のところに入れて、置換を空白でリネームすればどうだろうか
\Wは\wが全角も拾うっぽくてうまくいかないな

25 :デフォルトの名無しさん:2009/05/12(火) 23:09:02
>>24
必要な文字の方を残して消せば良かったんですね、勘違いしてました・・・
理想的な方法が出来ましたありがとうございました!!!

[^-_.a-zA-Z0-9]
[^-_.a-zA-Z0-9a-zA-Z0-9ァ-ヶぁ-ん〜ー亜-煕一-龠]
[^-_.a-zA-Z0-9a-zA-Z0-9ァ-ヶぁ-ん〜ー亜-腕弌-熙]

26 :デフォルトの名無しさん:2009/05/15(金) 08:39:43
●正規表現の使用環境
php5

●検索か置換か?
検索

●説明
画像の中に連続した数字があるか調べたい

●対象データ
F1 00 00 00 00 00 00 00 00 00 EE
DS 00 12 47 36 11 66 00 00 11 FS

●希望する結果
match or not


単純な文字列は扱えるのですが16進数からどう取り出せば良いか分かりません。
まずfile_get_contentsでファイルを読み込んでおり、\x00 == $strなどは分かりますが正規表現でどうすれば良いのかが分かりません。
どなたかご教示願いますm(__)m

27 :デフォルトの名無しさん:2009/05/15(金) 09:25:50
>>26
php知らんけど、「画像の中に連続した数字」と言うのは単純に「バイト列中に特定の値が連続する」と解釈して宜しいか?
だとすれば、\x00\{2,\}でよさそうだが。

28 :デフォルトの名無しさん:2009/05/15(金) 09:32:12
(.)\1*


29 :デフォルトの名無しさん:2009/05/15(金) 09:33:49
同一文字の2個以上の連続は

(.)\1+



30 :デフォルトの名無しさん:2009/05/15(金) 15:04:59
画像が16進数ってどういうこと?>>26
画像は画像じゃん。

31 :デフォルトの名無しさん:2009/05/15(金) 15:46:03
画像「データ」つまりバイナリに対してマッチさせたいという話でしょ
一瞬、画像認識かとも思ったけど

32 :デフォルトの名無しさん:2009/05/16(土) 20:58:37
"連続した数字" とは何を指すんだろう。
バイナリの00も連続した数字と言えるし他の解釈の仕方も出来る。

自分の考えていることを相手に正確に伝えられない人はまず
日本語の勉強をするべき。

33 :デフォルトの名無しさん:2009/05/16(土) 22:32:48
連続した数字というと1,2,3,4,5を連想してしまう。
PHPって文字列とバイナリを区別しないんじゃない。

34 :デフォルトの名無しさん:2009/05/17(日) 13:34:43
テンプレの意味わかってんのかな
対象データと希望する結果がそれじゃわけわからん。

35 :デフォルトの名無しさん:2009/05/17(日) 16:12:54
質問主は 16進数 の意味がワカットランと思う。
もしかしたら 数字 の意味もワカットランと思う。
最近は学校でそゆこと教えないのか?

36 :デフォルトの名無しさん:2009/05/18(月) 01:27:32
unko123.com
unko784.com
unko962.com

これらを正規表現する時
unko\d\.com と unko\d+\.com どっちが正しい?

37 :デフォルトの名無しさん:2009/05/18(月) 01:31:00
\d{3}と迷うならともかく前者はありえん

38 :デフォルトの名無しさん:2009/05/18(月) 01:46:11
>>37
unko\d{3}+\.com ってこと?

39 :デフォルトの名無しさん:2009/05/18(月) 03:03:12
+余計だろ

40 :デフォルトの名無しさん:2009/05/18(月) 09:03:05
ん、+のない\dが複数桁の数字にマッチする実装があるって事?

41 :デフォルトの名無しさん:2009/05/18(月) 09:17:02
{n} で n 個の一致。 \d{3} は \d\d\d と等価。


42 :デフォルトの名無しさん:2009/05/18(月) 09:39:06
ああ、39は38に宛ててか。

43 :デフォルトの名無しさん:2009/05/18(月) 09:53:06
unko[0-9][0-9][0-9]\.com
unko[0-9]{3}\.com
unko[0-9]+\.com

unko.\d\d\d\.com
unko\d{3}\.com
unko\d+\.com

44 :デフォルトの名無しさん:2009/05/18(月) 10:08:35
いやいや、正しくは
unko[179][286][342]\.com
だろう。

45 :デフォルトの名無しさん:2009/05/18(月) 10:36:26
>>44
それなら
unko(123|784|962).com
の方が正しいだろう。

46 :デフォルトの名無しさん:2009/05/18(月) 10:45:49
おまいら楽しそうだなw

47 :デフォルトの名無しさん:2009/05/18(月) 16:50:19
$txt = aaa(’12165;

のような、固定文字列aaaの後ろに『(’nnnnn;』(nの部分は必ず半角数字で値と文字数は可変。’は全角)となる箇所がうじゃうじゃあり、
この文字列の数字を挟んでいる記号だけを全て削除したいのですが、しっくりくる正規表現が浮かびません
妙案ないでしょうか

php5 or 4

48 :デフォルトの名無しさん:2009/05/18(月) 18:54:48
PHPってこんなんだっけ?
mb_ereg_replace("(?!aaa\\()’(\\d+);", "\\1", "aaa(’12345;");

49 :デフォルトの名無しさん:2009/05/18(月) 22:22:53
8桁の10進数を文字列とみなしたとき、
下2桁が"00"でない文字列をヒットしたい。如何すればよいか?

50 :デフォルトの名無しさん:2009/05/18(月) 22:40:03
/\d{6}[1-9]{2}/

51 :デフォルトの名無しさん:2009/05/18(月) 22:40:57
いや、違うな。
/\d{6}(\d[1-9]|[1-9]\d)/

52 :デフォルトの名無しさん:2009/05/18(月) 22:51:45
>>47
マルチかよ

53 :49:2009/05/18(月) 23:29:28
>>51
ありがとう

54 :デフォルトの名無しさん:2009/05/20(水) 06:57:22
/\d{6}(?!00)\d\d/

55 :デフォルトの名無しさん:2009/05/22(金) 17:03:24
言語:Java

文字列:
$:hogeA;
$:hogeB;

これをpattern&matchさせるにはどうすればいいのでしょうか?

56 :55:2009/05/22(金) 17:23:55
質問内容を間違えました。

文字列:
${hogeA}
${hogeB}

これをpattern&matchさせるための正規表現は \\$\{.*.} でOK?
(Eclipse 3.2 JDK 1.6でエラーが出るorz )

57 :デフォルトの名無しさん:2009/05/22(金) 17:25:45
なんなのそのバックスラッシュ

58 :デフォルトの名無しさん:2009/05/22(金) 18:18:22
「pettern&match」とは何ぞや? アンド?

59 :55:2009/05/22(金) 18:23:06
>>58

Patternオブジェで正規表現コンパイルして、
Matcherのfindメソッドで一致を確認したいのです。

60 :デフォルトの名無しさん:2009/05/22(金) 18:27:04
$\{.+\}
javaはしらん

61 :55:2009/05/22(金) 18:56:03
自己解決しました。
Matcher#groupで取得するため
(\\$\\{.*.\\})でうまくいきました。
>>60 つ旦 ありがとう。

62 :デフォルトの名無しさん:2009/05/26(火) 17:18:21
<img src="./topimg_0905.gif" alt="テキスト" border="0" />

PHPで上のようなイメージタグからtopimag_に続く4桁の数字とalt=""の中身のテキスト(全半角マチマチ文字列)のみを
それぞれ$gifと$altに抽出したいのですがよい方法はないでしょうか

63 :デフォルトの名無しさん:2009/05/27(水) 04:14:06
そういうのはHTMLパーサ使った方がいいって言ってるだろうが。


64 :デフォルトの名無しさん:2009/05/27(水) 18:16:27
UNIXで、与えられたパスが絶対パスである条件って
$(|~\S*)?/\S*
でいいですか?
思いがけないパターンがありそうで怖いんですがどうでしょうか

65 :デフォルトの名無しさん:2009/05/28(木) 09:25:40
「先頭がスラッシュか」だけじゃ駄目?

66 :デフォルトの名無しさん:2009/05/28(木) 10:40:58
~ユーザ名/も絶対パスとみなしたいんだろ

67 :デフォルトの名無しさん:2009/05/29(金) 09:42:09
それだったら~/も含める必要がありそうな。

68 :デフォルトの名無しさん:2009/05/29(金) 10:03:33
知らないならレスしないでください

69 :デフォルトの名無しさん:2009/05/29(金) 18:15:39
>>67
~\S*だから入るんじゃないのか


70 :デフォルトの名無しさん:2009/05/29(金) 18:16:50
^[~/]でもよさそうな気もするな

71 :デフォルトの名無しさん:2009/05/29(金) 19:35:46
IMOX って空白を含むディレクトリ名ってだめだっけ?

72 :デフォルトの名無しさん:2009/05/29(金) 19:36:52
困ったことに、使えるねぇ。

73 :デフォルトの名無しさん:2009/05/29(金) 19:37:02
キーボードが1列ずれた。すまんw
IMOX じゃなくて UNIX って書きたかった

74 :デフォルトの名無しさん:2009/05/29(金) 23:31:42
何事もなく返答する>>72に萌えた

75 :デフォルトの名無しさん:2009/05/31(日) 17:18:03
よろしくお願いします。

現在Yahoo!pipes(ttp://pipes.yahoo.com/pipes/)を使っているのですが、
pipesの中でデータをURLエンコードしたいと思っています。
そのような機能はないので、正規表現(マニュアルによるとPerlライク)でやろうと思っているのですが、
Perlの関数を使えないのでunpackを使うやり方ができません。

純粋な正規表現のみでURLエンコードはできるものなのでしょうか。
修飾子として使えるのは「gsmi」のみです。


76 :デフォルトの名無しさん:2009/05/31(日) 17:32:16
>純粋な正規表現のみでURLエンコード
正規表現を利用してなら可能だろうだけど、正規表現のみじゃ無理
なんつーかノリも必要なペーパークラフトをハサミだけで作れって感じだ
URLっていう型紙からデータを切り抜くだけでどうやってURLエンコードを組み立てるよ

77 :デフォルトの名無しさん:2009/05/31(日) 17:34:11
/\x00/%00/g
/\x01/%01/g

/\xFF/%FF/g

78 :デフォルトの名無しさん:2009/05/31(日) 17:46:46
>>76
ですよね・・・

>>77
うおっ!

79 :デフォルトの名無しさん:2009/05/31(日) 18:05:44
>>77
それやると % と 0-F の文字が置換されないか?

80 :デフォルトの名無しさん:2009/05/31(日) 18:21:31
深く考えずに書いたネタにマジレスされても困るんだが、本気でこのアプローチを採用するなら、
0-9A-Fは置換する必要ないし、%を一番頭に持ってくればいい。

81 :デフォルトの名無しさん:2009/06/06(土) 19:31:17
行頭から6文字目までをマッチさせるにはどう記述したらよいでしょうか?

82 :デフォルトの名無しさん:2009/06/06(土) 20:29:36
^.{6}

83 :デフォルトの名無しさん:2009/06/06(土) 21:22:45
>>82
助かりましたありがとうございます

84 :デフォルトの名無しさん:2009/06/08(月) 23:24:52
FlashのActionScript3.0(WinXP-Pro)です。

文字列中で特定の文字列のみに色付けをしようとしていますが、目的の文字列
以外でも色が付き困っています。

例えば、『名無し』という文字列のみを青色にしようとすると、独立した文字列
 名無し
はOKなのですが、「デフォルトの名無しさん」でも『名無し』が青色になってしまい
ます。

A名無しB という場合(前または後ろに不要な文字がある場合、つまり他の文字列
に組み込まれた場合)は対象から外し、単独の場合のみを対象したく思っています。

これに適した正規表現はありますでしょうか?


85 :デフォルトの名無しさん:2009/06/08(月) 23:43:22
^名無し$

86 :デフォルトの名無しさん:2009/06/09(火) 00:22:19
>>85
有難うございます。しかしながら、質問が不十分でした。
確かに独立した文字列は許可したいのすが、それ以外に A名無しB で
AまたはBが
1) 半角のスペースの場合
2) 半角の左括弧 ( の場合
3) 改行の場合
4) ピリオドの場合

に名無しを青色にしたく思っています。
当初、キャラクターコードとif文で分岐しようとしましたが煩雑になったので
正規表現を利用しようと思いました。

こんな場合はどうでしょうか?


87 :デフォルトの名無しさん:2009/06/09(火) 12:48:17
不特定の半角英数字と半角記号でできている半角文字列の中から (' ') に挟まれた数列だけを残して他を削除したいのですが方法はないでしょうか

例)
234hbhkltgfokdlthL+POL+PL>?*|{?('54653');
の中から54653だけを取り出し他を削除

※不特定文字列内において、 (' や ') は取り出す予定の数列を挟む場所以外では現れません

PHP

88 :デフォルトの名無しさん:2009/06/09(火) 13:17:17
('...') は複数出現するのかな?一応それを考慮して

$a = preg_replace('/(?:(?!\(\').)*(?:\(\'(\d+)\'\))?/', '$1', $a);

89 :87:2009/06/09(火) 13:47:46
>>88
ありがとうございます
('nnn')は1カ所しか出てきません
自分で応用できないかやってみたんですがムリでしたw
1カ所しかでてこないバージョンを教えてくださいw

90 :デフォルトの名無しさん:2009/06/09(火) 15:43:57
PHPの書式は分からないけど、
\('(.+)'\)
で検索して、後方参照で\1だけ残せば良いんじゃない?

91 :デフォルトの名無しさん:2009/06/10(水) 10:57:23
>  \('(.+)'\)
Vサインしてるクマたんみたいでかわいい

92 :デフォルトの名無しさん:2009/06/10(水) 11:32:12
submatchでグループ化したものを抜き出せば良いんでない?

93 :デフォルトの名無しさん:2009/06/10(水) 13:39:54
(V)o¥o(V) フォッフォッフォ

94 :デフォルトの名無しさん:2009/06/13(土) 08:14:41
(a+b) - (b - c)

みたいな文字があって
()の中をそれぞれ取り出したい場合

(.*)ってやると
一番最初の(と最後の)でも一致してしまう
させたくないんだけどどうすればいいの?

環境はVB.NET

95 :デフォルトの名無しさん:2009/06/13(土) 09:05:24
>>94
特殊な意味を持つ文字は\でエスケープする

\([^)]*\) かな

96 :デフォルトの名無しさん:2009/06/13(土) 09:14:48
>>94
VB.NETはよく知らんが、大体「.*」ってやると「よくばり」モードになるぞ。
「よくばり」モードはその例の場合だと途中の括弧も飲み込んじゃって、
目一杯取ってくるから、「.*?」ってやるといい。
「?」をつけると「けちけち」モードになって、必要最小限しか取ってこない。

97 :デフォルトの名無しさん:2009/06/13(土) 09:55:28
>>94
最短一致でググるといいぜ

98 :デフォルトの名無しさん:2009/06/13(土) 11:46:17
非欲張り、という表現が一般的じゃないかと思うのだが。

99 :デフォルトの名無しさん:2009/06/13(土) 11:55:08
正しさはともかく一般的なのは「最短一致」

"最短一致" に一致する日本語のページ 約 2,610 件
"非欲張り" に一致する日本語のページ 約 373 件

100 :デフォルトの名無しさん:2009/06/13(土) 14:21:42
欲張りマッチの事、貪欲マッチと呼ばない?

101 :デフォルトの名無しさん:2009/06/14(日) 00:00:57
>>95で出来た
ついでにもう1つ
英数字の連続が5文字以上を一致させたい場合はどうすれば?

102 :デフォルトの名無しさん:2009/06/14(日) 00:38:39
礼の一つも言えんのか

103 :デフォルトの名無しさん:2009/06/14(日) 08:52:01
\w{5,}

104 :デフォルトの名無しさん:2009/06/14(日) 16:57:22
>>95さんありがとう
連続文字は自己解決した
{}の中身を{10}ってやると10文字以上という意味らしい
サンプルだと{10,20}みたいにしか書いてなかったから

105 :デフォルトの名無しさん:2009/06/14(日) 17:11:29
カンマ忘れてるぞ

106 :デフォルトの名無しさん:2009/06/14(日) 18:09:05
>>104
>>103さんが回答出してるのを無視して自己解決も何もなかろう。

107 :デフォルトの名無しさん:2009/06/14(日) 21:01:48
無視したからこそ自己解決なのではないかと。

という混ぜ返しはさておき、
"\w" は(一般的な実装だと)アンダースコアも拾うけどいいのかな。

108 :デフォルトの名無しさん:2009/06/15(月) 12:15:03
アンカ間違ってるだけで>>103を参考に解決したけど
全面採用じゃなかったから自己解決とかぬかしてるだけでは

109 :デフォルトの名無しさん:2009/06/15(月) 12:48:38
ちがうな、恐らくは>102を受けて、「ありがとう」と書いたのだろう。
好意的に解釈すれば、>103を見る前に自己解決したのかも知れん。

110 :デフォルトの名無しさん:2009/06/22(月) 11:09:00
C#です
Match match = new Regex("AAA.+?BBB").Match(html);
としてAAAとBBBの間の文字列を抽出したいのですがなぜかできません

Match match = new Regex("AAA").Match(html);
Match match = new Regex("BBB").Match(html);
この二つはうまくいくのですが正規表現の書き方おかしいですか?
ちなみにAAAとBBBはhtmlタグです

111 :デフォルトの名無しさん:2009/06/22(月) 11:28:41
.+? って、1回以上の繰り返しが、あるかないか、という意味を意図してると思うんだけど、
そういう複合はできない。
0回以上の繰り返し .* でマッチさせる。

112 :デフォルトの名無しさん:2009/06/22(月) 12:03:01
>>111
> .+? って、1回以上の繰り返しが、あるかないか、という意味を意図してると思う
じゃなくて最短一致だろ

113 :デフォルトの名無しさん:2009/06/22(月) 12:09:27
最短一致です
("AAA".+?"BBB")は実際には
(<div id=\"comments\" style=\"margin-left:6px;margin-top:6px;\">.+?<button id=\"load_comment_button\"")
こんな感じです

114 :デフォルトの名無しさん:2009/06/22(月) 12:09:34
それだと、 . が改行にマッチしない事は理解してる?

115 :デフォルトの名無しさん:2009/06/22(月) 12:11:26
>>113訂正

("AAA.+?BBB")
("<div id=\"comments\" style=\"margin-left:6px;margin-top:6px;\">.+?<button id=\"load_comment_button\"")
こうです

116 :デフォルトの名無しさん:2009/06/22(月) 12:15:40
>>114
そうなんですか!?
どう書き換えればよいでしょうか

117 :デフォルトの名無しさん:2009/06/22(月) 12:17:44
RegexOptions.Singleline

111はどういう環境を想定してるんだろうね。

118 :デフォルトの名無しさん:2009/06/22(月) 12:25:48
>>117
できました!ありがとうございました

119 :デフォルトの名無しさん:2009/06/24(水) 14:14:00
●正規表現の使用環境
AutoHotkey 1.0.48.03 (Perl 5互換のPCRE)
http://lukewarm.s101.xrea.com/RegEx.html

●検索か置換か?
置換

●説明
""で囲われている箇所以外の行末コメントを除去したい。

●対象データ
key = value ; ccomment
key = "val ;lue" ; comment

●希望する結果
key = value
key = "val ;lue"

m`n)[\t ]+;.*(?=$) で 無差別除去まではできたんですが後方参照とか条件分岐の方法ががわからず。
key value comment 部はそれぞれ日本語の文字が入る可能性もあるんですが
AutoHotkeyのPCRE自体は2バイト文字が考慮されません(なので[:word:]とかは使えない状態です)
よろしくお願いします。

120 :デフォルトの名無しさん:2009/06/26(金) 11:50:32
単純な正規表現は分かるのですが、これはどうすればよいでしょうか?

●正規表現の使用環境
PHP4

●検索か置換か?
置換

●説明
<del>タグにはさまれた任意の文字列を、文字数ぶん●で伏せ字にしたい。

●対象データ
昨日は<del>上戸さん</del>と飲みに行ったが、<del>17,000</del>円も奢らされてしまった。

●希望する結果
昨日は<del>●●●●</del>と飲みに行ったが、<del>●●●●●●</del>円も奢らされてしまった。

121 :デフォルトの名無しさん:2009/06/26(金) 12:04:54
>>120
preg_replace_callback使え。

122 :デフォルトの名無しさん:2009/06/26(金) 13:13:30
>>121
そんな便利な関数があったとは、、。
ありがとうございました!

function toFuseji($matches) {
return $matches[1] . preg_replace("/./u", '●', $matches[2]) . $matches[3];
}

preg_replace_callback("/(<del>)(.+)(</del>)/", 'toFuseji', $str);

123 :デフォルトの名無しさん:2009/06/26(金) 22:30:17
●正規表現の使用環境
C#2008 Regex.IsMatch

●検索か置換か?
一応検索

●説明
特定の文字列以外があるかをチェックしたい
SQLの話も混じりますが、要はSELECT文の後に
更新や変更するような命令があるかをチェックしたい
のです。
UPDATEとかそれぞれを書いていくのは漏れるかも
しれないのでSELECT、FROM、WHEREあたりを除いて
マッチさせるにはどう書いたらいいでしょうか。
試した文
^SELECT (?!.* [A-Z](?!ELECT |ROM |HERE ))

●対象データ と望する結果
マッチさせたい "SELECT * FROM AAA [UPDATE]"
マッチしたくない "SELECT * FROM AAA UPDATE"




124 :デフォルトの名無しさん:2009/06/26(金) 22:52:35
何らかの処理系なら、else節で処理しちゃう手もある。

125 :デフォルトの名無しさん:2009/06/28(日) 15:21:44
>>123
念のため聞くけど…
まさかこれってSQLインジェクションの対処のためにやってるんじゃないよね?



126 :デフォルトの名無しさん:2009/06/28(日) 19:03:21
『id059385,,』のように、固定文字列idの後にランダムな数列、その後ろにカンマがふたつ格納された変数から、最後のカンマをひとつだけ取り除きたいのですが、
for文で回ってる途中まれに同一変数に『,,,』のようにカンマが3つ連続して出てくることがあり、その場合は取り除きたくないので
原始的に(",,",",",$変数)のようなことができません
あくまで、固定文字列id、その後に数列、その後にカンマふたつという状況でのみカンマひとつ取り除く方法はないでしょうか

PHP5

127 :デフォルトの名無しさん:2009/06/28(日) 19:35:50
最後に2つある時だけ取りたいならこうするかな
preg_replace('/(?<!,),,$/', ',', 'id059385,,');

128 :デフォルトの名無しさん:2009/06/28(日) 19:43:04
>>119
これ難しいね。
excelなら、Instrrev使えばすぐだけど、正規表現だとどうやるんだろ。

129 :デフォルトの名無しさん:2009/06/29(月) 15:35:58
>>119
Perlならこれでいけるっぽいけど、どうかな。だめかな

s/((?:[^;]*?".*?")*[^;]*)(?:.*?$)?/$1/mg

130 :デフォルトの名無しさん:2009/06/29(月) 18:07:37
'"' 自体のエスケープはどうなっているのかと、 Shift_JIS への対応が気になるかな。

131 :デフォルトの名無しさん:2009/06/29(月) 22:27:07
使用環境 WSH 検索
対象データ ^AAA(BBB(CCC)(ddd)))(FFF)(GGG)$

文末の、括弧記号を含まず括弧で囲われたものが連続しているもの
を検索したいけど挙動が違います。

1) /(?:\([^(]+?\))+$/ 検索結果→ (CCC)(ddd)))(FFF)(GGG)
2) /(?:\([^)]+?\))+$/ 検索結果→ (FFF)(GGG)

欲しい結果は2の方です。
文末の$を指定した時は通常とは逆に文末から左へ一文字づつ検索していると考えていいんですか?

132 :デフォルトの名無しさん:2009/06/30(火) 11:23:57
>>131
そりゃ前から読んでもそうなるだろ

>\([^(]+?\)
「括弧の間に開き括弧を含まないもの」だから"(ddd)))"にもマッチする

>「括弧記号を含まず」「括弧で囲われたものが」「連続しているもの」
/(?:\([^()]+?\)){2,}/

133 :デフォルトの名無しさん:2009/06/30(火) 11:24:38
「文末の」を見落としたスマン

134 :デフォルトの名無しさん:2009/06/30(火) 11:51:09
> 文末の$を指定した時は通常とは逆に文末から左へ一文字づつ検索していると考えていいんですか?

そういう動作はしない。


135 :デフォルトの名無しさん:2009/06/30(火) 12:48:16
/unko$/

/unko\r\n/
と同等と考えればわかりやすいだろう
(厳密には違うけど)

136 :デフォルトの名無しさん:2009/06/30(火) 23:16:49
>>128-129
レスありがとうございます。
お礼が遅くてすみません。週末からリロードし忘れてました。

質問後自分なりに頭捻って、((".*?")|;.*(?=$)) , $2 とか無理やりやってたんですが
>129さんのでいけました。特に (?: )の使い方が参考になります。ありがとうございます。

今回の件とは直接関係ないんですが、除外文字列の表記がよくわからずいつも悩みます。
今回の例でいうと コメント文字列が「;」ではなく「 ;」(半角スペース+セミコロン)だった場合とか
(?:(".*?")|[\t ]+;.*(?=$)) , $1 みたいな方法で弾くしかないのかな。

137 :デフォルトの名無しさん:2009/07/01(水) 00:15:50
いや、普通にそっちのほうがシンプルでいいよ
なんであんなに複雑い書いたのかマジ俺イミフ。しにてえ

138 :デフォルトの名無しさん:2009/07/01(水) 23:41:47
.NETの話なんだけど
ttp://msdn.microsoft.com/ja-jp/library/bs2twtah(VS.80).aspx#BalancingGroupDefinitionExample
この例の正規表現がどうして <> の入れ子構造にマッチするのか上の解説読んでもよく分からないので誰か分かりやすく説明してください
「name2 グループと現在のグループの間隔をグループ name1 に格納します。」って文があるけど
この「name2 グループと現在のグループの間隔」っていうのはリンク先の例で言うとどこからどこまでなのかとか
格納するっていうのがつまりどういうことなのか、って言うレベルでさっぱり理解できてない・・・
最後の "(?(Open)(?!))$" にいたっては自分の中で暗号と化してるorz

139 :デフォルトの名無しさん:2009/07/02(木) 03:33:28
わかりやすくは多分無理だな。

Openでカウントが増える。
Close-Open でそのそのカウントが減る。

んで、開きと閉じのアングルブラケットの数がバランスしていれば カウントは0になるので

"(?(Open)(?!))$";

の条件が (?!) ではなくなる。
この(?!) というのは要するに何にもマッチしないもの。


140 :123:2009/07/03(金) 21:01:48
>>124
うまく書けなかったので要素に区切ってチェックすることにしました。
>>125
SQLインジェクションって知らなかったけど、悪意のある入力の
チェックって感じかな?
入力文字はSQL文が前提で、そこまで重い意味合いのチェック
ではありませんでした。
SQLインジェクション対策って普通Regex.Escapeを通すのかな?



141 :デフォルトの名無しさん:2009/07/03(金) 21:07:18
言語によるが、DB系のライブラリにバインディング機能があれば普通はそれを使う。
自作のお手製ライブラリはやめた方がいい。
DBによって攻撃の仕方が違うし、
よく知ってる人が作っていろんな人が使ってるやつの方がやっぱり圧倒的に安全。
詳しくはそれっぽいスレで聞いてくれ。

142 :デフォルトの名無しさん:2009/07/03(金) 21:16:14
>>140
何のためにそんなことをしたいのか分からないが、
ユーザにSQLクエリを入力させて実行させたい、とかいう話なら、
クエリ式に対してチェックをするのではなくて、
データベースの更新が出来ないような権限でクエリを実行すべき。

143 :123:2009/07/03(金) 21:16:15
>>141
そうなんですか。調べてそっちの方向に変えてみます。
よく考えたらSQL文にRegex.Escapeなんて
なんの関係もなかった・・・。

144 :123:2009/07/03(金) 21:20:04
>>143
権限で〜ってのは思ってたんですが、触れない事情がありまして。
普通はそうなんですね。
スレ違いになってきたのでこの辺で終わっときます。
ありがとう。


145 :デフォルトの名無しさん:2009/07/04(土) 21:44:21
●正規表現の使用環境
PHP ver 5.2

●検索か置換か?
置換

●説明
カッコ書きのある文章のカッコの中身を取得したい。
たとえば、
カッコ書き前(カッコ1(カッコ2(カッコ3)カッコ2後)カッコ1後)カッコ書き後
の文章に対して、後方参照で
arr[1] = カッコ書き前()カッコ書き後
arr[2] = カッコ1()カッコ1後
arr[3] = カッコ2()カッコ2後
arr[4] = カッコ3()カッコ3後
と言った感じで取得したい。

試した文
$preTxt = 'カッコ書き前(カッコ1(カッコ2(カッコ3)カッコ2後)カッコ1後)カッコ書き後';
$match = '/.*(\(.*\)).*/';
preg_match("$match",$preTxt,$arr);
結果
[0]= カッコ書き前(カッコ1(カッコ2(カッコ3)カッコ2後)カッコ1後)カッコ書き後
[1]= (カッコ3)カッコ2後)カッコ1後)

●対象データ と望する結果
上記記載

すみません。どなたかお願いします。

146 :デフォルトの名無しさん:2009/07/04(土) 22:10:12
HTMLタグの中身を抜き出すのに近いね。
別の自作関数を作っておいて、

arr[1] = \1 & \7
arr[2] = \2 & \6
arr[3] = \3 & \5
arr[4] = \4

なんてのはどうかな。
もっとスマートな方法もあるかもしれないけど、今でもこれ使って動かしてます。


147 :デフォルトの名無しさん:2009/07/04(土) 22:43:50
回答ありがとうございます。
でも、多分、俺って、あなたの思っている以上の馬鹿みたい。
全くもって、理解できないんですけど・・・・・・・。
もうちょっとわかりやすくしていただけると助かります。
って、馬鹿がわかりやすい解説って、わかってる人にはかなり難しいんだと思いますけど。
すみません。わがまま言って。

148 :デフォルトの名無しさん:2009/07/04(土) 23:28:20
外側から攻めていって、カッコがなくなるまでループするとか
function foo($text) {
$kekka = Array();
$match = '/^(.*?)\((.*)\)(.*)/';
while (preg_match($match, $text, $arr) > 0) {
array_push($kekka, $arr[1] . "()" . $arr[3]);
$text = $arr[2];
}
array_push($kekka, $text);
return $kekka;
}
$arr=foo('カッコ書き前(カッコ1(カッコ2(カッコ3)カッコ2後)カッコ1後)カッコ書き後');
print_r($arr);

149 :デフォルトの名無しさん:2009/07/05(日) 12:38:53
ありがとうございます。
完璧です。
ほんとにありがとうございました。!!

150 :デフォルトの名無しさん:2009/07/05(日) 12:56:11
なるほど、賢いなぁ

151 :デフォルトの名無しさん:2009/07/05(日) 14:24:31
147は138かな?

もうちょっと努力して説明してみるから少し待ってね。


152 :デフォルトの名無しさん:2009/07/05(日) 15:21:42
147は145 で PHP5、.NET の138とは別の人、だと思うけど。

153 :デフォルトの名無しさん:2009/07/05(日) 16:48:27
>>139,151
138です、レス遅れてすみません
自分で試しつつなんとか(?<name1>p1)+(.*)(?<name1-name2>p2)+ という表記なら
(p2にマッチした回数 - 1) 個だけ name1とname2のキャプチャを取り出して
(.*)の両端にくっ付けていく(ただし取り出すキャプチャの 最大数は (p1にマッチした回数-1) 個)のかな
という感じで理解し始めてますが・・・

それと?(Open) という書き方は ? と () までも含めて、Openを文字列リテラルとしてではなく
(既に同じパターンのより先頭部分で定義されている)Openという部分パターンの
グループ名だということを示すための表記法なんでしょうか?
こっちは試し方も良く分かりません・・・

154 :151:2009/07/06(月) 03:10:01
(?'Open'<)
というのは、named caputure でこの場合は < を Open という名前で捕獲するもの。
この場合は捕獲自体には意味はなくて裏で増やしているカウンタが重要。そして
(?'Close-Open'>)
この部分で Open のカウンタを1減らしている。< と > の数が同じであれば、
(?(Open)(?!))
まで来た時点で Openの値は0になっているはず。

で、この表現なんだけど (? (Open) (?!) ) が、? に続く部分正規表現が「真」であれば (?!) を
マッチの条件にするというプログラミング言語の if 〜 then 〜 みたいなもの。

解説は
http://msdn.microsoft.com/ja-jp/library/36xybswe(VS.80).aspx
にある。

そして Open が0でない==バランスが取れていなければ (?!) のチェックを
するのだけど、これは前回も書いたように絶対にマッチに失敗するというパターン
なので、全体を通してみるとバランスが取れていればマッチ成功。
そうでなければ失敗。という次第。



155 :デフォルトの名無しさん:2009/07/10(金) 10:33:02
オライリーの「詳説 正規表現 第3版」を読んで疑問に思ったので質問します。

5章にある「IPアドレスへのマッチ」で、0から255の数字にマッチする正規表現のサンプルがありますが
 [01]?\d\d?|2[0-4]\d|25[0-5]

これだと、最初の選択で [01]? がオプションなので、たとえば "999" が "99" に
マッチしてしまうような気がするのですが、問題はないのでしょうか。
よろしくお願いします。

156 :デフォルトの名無しさん:2009/07/10(金) 10:43:53
その後で、
 ^([01]?\d\d?|2[0-4]\d|25[0-5])\. (中略) \.([01]?\d\d?|2[0-4]\d|25[0-5])$
として前後の境界を指定して利用してるから問題ないんじゃないの?

数字だけを取り出したいのであれば、例えば、
 \b([01]?\d\d?|2[0-4]\d|25[0-5])\b
みたいに前後を指定する必要があるよね。

って、そういう話ではなくて?

157 :デフォルトの名無しさん:2009/07/10(金) 10:49:11
>>156
あぁ、すみません。
たしかに ^ $ で境界を指定すれば問題ありませんね。
部分式ばかり考えていて見えませんでした。

ありがとうございます。

158 :デフォルトの名無しさん:2009/07/22(水) 01:41:17
これ教えてーーーーー

●正規表現の使用環境
VB.NET

●検索か置換か?
検索

●説明
タグの外の文字列を順に取得したい

●対象データ
<html1><html2>AAA<html3>BBB<html4><html5>CCC<html6>DDD<html7>
だったり
<html1>AAA<html2>BBB<html3><html4><html5><html6>CCC<html7>DDD

●希望する結果

r = New Regex("(?<1>.+?)(?<2>.+?)(?<3>.+?)(?<4>.+?)" ←今こんな感じ

Console.WriteLine(m.Groups(1).Value)
で結果 AAA
Console.WriteLine(m.Groups(2).Value)
で結果 BBB
Console.WriteLine(m.Groups(3).Value)
で結果 CCC
Console.WriteLine(m.Groups(4).Value)
で結果 DDD


159 :デフォルトの名無しさん:2009/07/22(水) 02:48:28
>>158
Match()一発じゃなくてMatches()で地道にいっこずつ切り出してみた。もっといい方法はあるかもしれん

Dim r As Regex = New Regex("(?:<.*?>)+(.+?)(?=<|$)")
Dim s As String = "<html1><html2>AAA<html3>BBB<html4><html5>CCC<html6>DDD<html7>"
For Each m As Match In r.Matches(s)
  Console.WriteLine("{0}", m.Groups(1).Value)
Next

160 :デフォルトの名無しさん:2009/07/26(日) 09:55:51
正規表現、特にNFAって計算量が大きいので
実用上、30〜40文字ぐらいが限界だったように記憶してるのですが
NFAとDFAでの計算量ってO表記でどのぐらいでしたっけ?
wikiにそういう情報のせといて欲しい・・

161 :デフォルトの名無しさん:2009/07/26(日) 10:56:30
PHPのpreg(perl互換)の話なのですけど、
/(?<=<div>)(.*?)(?=<\/div>)/is
はエラーにならなくて
/(?<=<div[^>]*>)(.*?)(?=<\/div>)/is
がエラーになる理由が分からないのですが、
なぜなのでしょうか

162 :デフォルトの名無しさん:2009/07/26(日) 10:59:13
なぜと言われても・・・そう設計してあるから、としか言いようがないな

163 :デフォルトの名無しさん:2009/07/26(日) 11:01:24
>>2 の「正規表現メモ」の (?<=pattern) の解説には

  固定長の文字列に対してのみ働きます(処理系による。可変長の文字列を許可する処理系もあります

と書いてある。つまりそういうことだ。

164 :デフォルトの名無しさん:2009/07/26(日) 11:06:41
なるほど。これは固定長のみでしたか。
ありがとうございます。
別のルートから正規表現の方法を探す事にします。

165 :デフォルトの名無しさん:2009/07/26(日) 17:28:23

/(?<=<div[^>]{0,99}>)(.*?)(?=<\/div>)/is

可変長は無理でもこの書き方({0,99})がOKな処理系もあるから試してみろ


166 :デフォルトの名無しさん:2009/07/27(月) 09:08:56
>>160
DFAの計算量は自明でしょ。
NFAはパターンとテキストによって違うから一概には言えないんじゃないかな。


167 :デフォルトの名無しさん:2009/07/27(月) 12:33:41
適当なことばっかり言うのはやめてください

168 :デフォルトの名無しさん:2009/07/27(月) 13:29:38
セルフでコンプリートすればパーフェクトですよ

169 :デフォルトの名無しさん:2009/07/28(火) 16:26:27
マッチする判定じゃなくて
正規表現書いたらそれを満たす全ての文字列を生成する
プログラムを書くのは難しいですか?

170 :デフォルトの名無しさん:2009/07/28(火) 16:33:47
^.*$

171 :デフォルトの名無しさん:2009/07/28(火) 16:35:25
正規表現によっては終わらない可能性があるわけだな

172 :デフォルトの名無しさん:2009/07/28(火) 16:37:23
>>170
それをやると遅延評価的に必要な分だけ垂れ流すんです

173 :デフォルトの名無しさん:2009/07/28(火) 16:37:58
文字数限定すればできることはできる
指定字数の全ての組み合わせの文字列をその正規表現にマッチさせて
成功したものだけをリストアップすればいい

速度的にどれだけ実用になるかは不明
最適化するとなると論文レベル

174 :デフォルトの名無しさん:2009/07/28(火) 16:40:11
フィルターにかけるのではなく
初めから有効な物しか生成しないものとします

175 :デフォルトの名無しさん:2009/07/28(火) 16:42:08
>>174
よし、正規表現をパースすることから始めよう。

176 :デフォルトの名無しさん:2009/07/28(火) 16:42:44
等価な有限オートマトンをバックトラックしながらしらみつぶしに探索するような
プログラムを書けばできそうだな。

177 :デフォルトの名無しさん:2009/07/28(火) 16:56:58
数学的に可能ですか?
僕が心配してるのは5次以上のn次方程式の一般解
を探そうとしていやしないかという事です

178 :デフォルトの名無しさん:2009/07/28(火) 17:00:53
取り敢えずオートマトンを学ぶに適した良書を紹介して下さい

179 :デフォルトの名無しさん:2009/07/28(火) 17:12:42
> 正規表現書いたらそれを満たす全ての文字列を生成する

> それをやると遅延評価的に必要な分だけ垂れ流すんです

> 初めから有効な物しか生成しないものとします

> 取り敢えずオートマトンを学ぶに適した良書を紹介して下さい


何をしたいんだよ?お前は。
とりあえず学校の宿題なら自分でやれ。それか自分で調べろ


180 :デフォルトの名無しさん:2009/07/28(火) 17:33:48
ごめんなさい><

181 :デフォルトの名無しさん:2009/07/28(火) 17:46:04
>>179
とりあえずかの有名なこれでいいんじゃねーの?

ttp://www.saiensu.co.jp/?page=book_details&ISBN=ISBN978-4-7819-1026-0&YEAR=2003
ttp://www.saiensu.co.jp/?page=book_details&ISBN=ISBN978-4-7819-1027-7&YEAR=2003

182 :デフォルトの名無しさん:2009/07/28(火) 17:52:14
>>181
あり^^

183 ::2009/07/29(水) 13:06:01
聞くのもどうかと思ったんですが調べても解決しなかったので、聞きたいのですが
『正規表現の定義』ってなんですか?

184 :デフォルトの名無しさん:2009/07/29(水) 13:11:58
ほんとに調べたのか?

185 :デフォルトの名無しさん:2009/07/29(水) 13:18:50
文字列一致確認用プログラミング言語

186 :デフォルトの名無しさん:2009/07/29(水) 13:19:32
>>183
アルファベットΣ上の正規表現とは、
- 空集合 0
- Σ の要素 c
- r, s が正規表現のとき r + s
- r, s が正規表現のとき rs
- r が正規表現のとき r*
のいずれか。

187 :デフォルトの名無しさん:2009/07/29(水) 13:23:42
>>186
宿題は自分でやらせろよ。

188 :末吉:2009/07/29(水) 14:16:10
>>186
183は定義を聞いてるんだろ??

189 :デフォルトの名無しさん:2009/07/29(水) 15:17:02
定義じゃん

190 :デフォルトの名無しさん:2009/07/29(水) 15:56:14
>>188

ここの「形式言語理論における正規表現」を見ろ

ttp://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE



191 :デフォルトの名無しさん:2009/07/29(水) 16:05:59
見るなら正規言語だろう。
http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A8%80%E8%AA%9E

192 :デフォルトの名無しさん:2009/07/29(水) 16:46:52
正規言語と正規表現は本質的には同じだけど違うものだし

193 :デフォルトの名無しさん:2009/07/29(水) 17:11:51
>>181は激しく良書なので啓蒙しとく

大学のオートマトンのテキストがひどかったので
この本は難しいだろうと思ってずっと敬遠してたが
これはとてもわかりやすかった
予備知識もほとんどいらない
(最初のほうは背理法だとか数学的帰納法のレベルから解説)

厳密な定義がちゃんと書いてあるが
それに先だって具体例をあげて説明がある

ただ、この本を読んでも>>169の実装に直接には役立たないかもしれない
(0+1)*1(0+1)+(0+1)*1(0+1)(0+1)のような正規表現を簡約して
より計算しやすい正規表現に変換する
といった最適化なら正規表現の代数的性質の章でちょろっと学べる

194 :169:2009/07/29(水) 19:37:54
直接役には立たなくても正規表ゲニストを目指す僕は
正規表ゲニスト名乗っててオートマトンも知らんのかと
馬鹿にされるのは嫌なので オートマトニストにもなります><

195 :デフォルトの名無しさん:2009/07/29(水) 19:59:04
もういいから消えろよ

196 :デフォルトの名無しさん:2009/07/29(水) 23:55:35
aaa/bbb/ccc
aaa/bbb/ddd
aaa/ccc/eee
  ・
  ・
  ・

上のような文字列があって正規表現での検索時間(grepとか)を速くしたいと思っていますが、
高速化するために正規表現の合成?みたいなことができるようなライブラリってありますでしょうか?

検索したい文字列のリストはだいたい1行が30〜40文字程度で100行〜200行ほど
検索対象はファイルサイズで400Mbyte〜6Gbyteぐらいです。


197 :デフォルトの名無しさん:2009/07/30(木) 00:09:32
質問をもっと推敲しろ

198 :デフォルトの名無しさん:2009/07/30(木) 00:10:30
必要ない行はgrepで飛ばして読めばおk

199 :デフォルトの名無しさん:2009/07/30(木) 00:13:49
grepパイプでつなげば十分なんじゃね?

200 :デフォルトの名無しさん:2009/07/30(木) 00:46:05
パイプって言いたかっただけやんwww

201 :デフォルトの名無しさん:2009/07/30(木) 03:14:06
>>199
せめて -e を並べるか -f だろー。

202 :デフォルトの名無しさん:2009/07/30(木) 09:14:17
fgrep使うのが正解

203 :デフォルトの名無しさん:2009/07/30(木) 12:45:55
いつから言葉遊びをするスレになったのですか?

204 :デフォルトの名無しさん:2009/07/30(木) 14:47:20
正規表現は秀丸でちょこっと\n\n\nとか^[a-z]くらいをいじっただけの初心者なのに、
Javaで、JavaのDecimalFormat用文字列を
Excelの数値フォーマット定義文字列に変換するフィルターを作ってます。
『他の人にやらせりゃいいのに…まあ調べればわかるやろ…』と思って始めましたが、
案の定、いきなり引っかかりました。www

1)引用符'を引用符"に変換する正規表現(ただし連続''は'自体を表すので"にしない)
2)''に囲まれていない浮動小数点EをE+に ([0#])(E)([0#])を\1E+\3に

なお、変換は単一の正規表現で行う必要はなく、
順序依存のある複数の置換をかけてもOKです。
ただしできれば、各フィルターは常に全文に適用したいと思います。
(不要なフィルターも通過させる)

最悪、一部の変換結果を絶対にユーザが使わない予約語に変換して避けておく…
ということも可能だと思いますが…

正直、いきなり1)で引っかかったのにはガックリきました。
フィルター文字列定義をpropertiesで外出しにして
出荷後もサポートで変更・追加できるようにしないとマズイな…

205 :204:2009/07/30(木) 14:56:08
作成中ソースの一部ですが、何をやりたいかは見当つくと思います。
これが論理的にダメダメと言うことはわかってます。

//////////////////////////////////
//シングルクォート囲みをダブルクォート囲みに

//'"'→\"
//まず引用符の中の"自体をエスケープする。\"
filter = new RegFilter("'\"'","\\\"");
filterlist.add(filter);

//シングルクォート囲みをダブルクォート囲みにする前に、
//連続''は'1個をあらわすので、"'"に変換してやる。
filter = new RegFilter("''","'");
filterlist.add(filter);

//シングルクォートをダブルクォートに変換してやる。
//ただしさっきのを除く必要がある。
filter = new RegFilter("[^']'","\"");
filterlist.add(filter);

//全フィルターを通す変換実行
sResult = executeFilters(sFormat, filterlist);


206 :デフォルトの名無しさん:2009/07/30(木) 15:49:13
うん、わかるね

207 :204:2009/07/30(木) 15:56:54
http://msdn.microsoft.com/ja-jp/library/2k3te2cs.aspxにいいのがありますた。
1)は
(')([^']+)(')→\"\2\"
''→'
の2つでいけるかなぁ…


208 :204:2009/07/30(木) 16:24:35
2)の浮動小数点EをE+にするのは、

引用符の中のEだけをEEに退避
([^']+)(')([^']+)(E)([^']+)(')([^']+)→\1\2\3EE\5\6\7
浮動小数点のEをE+に
(*.)([#0])(E)([#0])(*.)→\1\2E\+\4\5
退避したEEをEに戻す
(*.)(EE)(*.)→\1E\3

の3つで97%くらいは出来てるかなあ。
変換対象の最後が引用符のときに落としちゃうけど、まあ…

209 :204:2009/07/30(木) 16:27:22
*と.が逆だった。

引用符の中のEだけをEEに退避
([^']+)(')([^']+)(E)([^']+)(')([^']+)→\1\2\3EE\5\6\7
浮動小数点のEをE+に
(.*)([#0])(E)([#0])(.*)→\1\2E\+\4\5
退避したEEをEに戻す
(.*)(EE)(.*)→\1E\3


210 :204:2009/07/30(木) 16:40:36
最初から地にEEがあるとEになっちゃうか。
横着せずに引用符の中のEEだけをもどさないとだめだな。

211 :デフォルトの名無しさん:2009/07/30(木) 19:06:52
ダブルクォートの中にカンマを含むフィールドのことを考えると
正規表現よりは文脈自由言語でパースしたほうが絶対にいい

212 :204:2009/07/31(金) 10:43:27
かも知れないけど、開発の立ち上げ工数と、今後のメンテを考えるとなー。
(あまり入出力仕様は変わらないと思うが、日付フォーマット変換の追加がありうる)
正規表現ならそれなりに触れるエンジニアはいくらでもいるわけで。

また、必ずしも完璧に作る必要はなくて、
ユーザが業務で使うごく一般的なフォーマット文字列を通せれば後は制限事項でもいいし。
それをいえば、想定顧客に、浮動小数点使ってる人なんていないんじゃないかと思うけどね。。。

213 :デフォルトの名無しさん:2009/07/31(金) 11:31:23
>>212
> 正規表現ならそれなりに触れるエンジニアはいくらでもいるわけで。

いねーだろ。どの口が言ってんだ?あん?

214 :デフォルトの名無しさん:2009/07/31(金) 11:58:34
ていうかここって日記スレなのか?

215 :デフォルトの名無しさん:2009/07/31(金) 12:16:24
正規表現はフィットする目的には早く書けるけど、保守性は悪いし実行
速度は遅いしで、まともなプロジェクトには使わないよ。


216 :デフォルトの名無しさん:2009/07/31(金) 12:21:08
まともでないプログラマ乙

217 :デフォルトの名無しさん:2009/07/31(金) 12:24:55
>>216
>>204 に回答してから言えよ。

218 :デフォルトの名無しさん:2009/07/31(金) 12:27:31
言うほど保守性が悪いとも思わないし、実行速度も
用途に十分なら別にかまわんしなぁ。

むしろ正規表現使わずにだらだら書かれたほうが
見通しが悪くて遅い場合も多い。適材適所。

219 :デフォルトの名無しさん:2009/07/31(金) 12:28:28
>>218
>>204 に回答してから言えよ。

220 :デフォルトの名無しさん:2009/07/31(金) 12:33:32
>>219
問題がよくわかんないし、javaとexcelだしスルー。

221 :デフォルトの名無しさん:2009/07/31(金) 12:37:46
そもそも便所の落書きに仕事を持ち込まれても知らんし。

222 :デフォルトの名無しさん:2009/07/31(金) 13:14:57
>>212
正規表現で書かれたフィルタのバグ取りなんてぞっとする
ちゃんとした技術者なら、RFCにCSVのBNFがそのまま載ってるんだから
BNFの通りにコーディングすりゃ
テスト含めて1日で終わるよ

223 :204:2009/07/31(金) 13:15:56
>>213
おっと確かに! 居ないからこそ、漏れがやる羽目になっとるわけだがwww
(出来る人に空きが無いという理由もある)
しかしま、コトは相対比較で十分なんで。

>>221
まあねえ。ML探して加入して自己紹介して
過去ログ検索して質問投げるってのが本来なんだろうが。
でもhttp://www.rubular.com/とかでちょこちょこやるうちに
何とかなりそうな気がしてきた。

224 :デフォルトの名無しさん:2009/07/31(金) 13:26:42
>>207
'''hoge' みたいなパターンがダメなのでは。

>>205 がよくわからんのだが、正規表現の変換処理のリスト (filterlist) を積んで、
executeFilters() でそれらを順番に逐次処理して適用する、ということ?
そんなん絶対うまくいかんと思うが。

225 :デフォルトの名無しさん:2009/07/31(金) 13:43:19
絶対入力するなよ!絶対だぞ!絶対入れるなよ!
で切り抜けるんだろう

226 :デフォルトの名無しさん:2009/07/31(金) 13:56:39
>>211
だよねー。

Java は良く知らないんだが、 JavaCC とか使えばスッキリ書けないのかね?

227 :デフォルトの名無しさん:2009/07/31(金) 14:17:27
CSV扱うライブラリぐらいjavaにもありそうなもんだけどな。

228 :デフォルトの名無しさん:2009/07/31(金) 16:40:25
Javaでも20行未満で書けるレベルの処理だろうに。


229 :デフォルトの名無しさん:2009/07/31(金) 16:50:34
>>228
お前がそれをさっさと書かないからこのネタが延々と終わらんだろうが。

230 :デフォルトの名無しさん:2009/07/31(金) 16:56:53
ライブラリあるの?

231 :デフォルトの名無しさん:2009/07/31(金) 16:57:34
SuperCSVオススメ

232 :デフォルトの名無しさん:2009/07/31(金) 18:02:03
>>228
期待age

233 :デフォルトの名無しさん:2009/08/01(土) 04:17:10
それをここでやるのはスレ違い。

234 :デフォルトの名無しさん:2009/08/01(土) 08:51:21
逃げる気か?

235 :デフォルトの名無しさん:2009/08/01(土) 10:11:53
>>234
あんた馬鹿?

236 :デフォルトの名無しさん:2009/08/01(土) 12:43:12
逃げやがったな。口だけ達者で、ほんとは何も出来ないヤツw

237 :デフォルトの名無しさん:2009/08/01(土) 12:45:19
>>236
あんた馬鹿?

238 :デフォルトの名無しさん:2009/08/01(土) 13:24:30
負け犬めガッ!一生逃げ回ってろ

239 :デフォルトの名無しさん:2009/08/01(土) 13:29:08
なにこの粘着質

240 :デフォルトの名無しさん:2009/08/01(土) 13:30:20
質問者でしょ。それ以外に利益のある人はいない

241 :デフォルトの名無しさん:2009/08/01(土) 13:33:21
人生の敗北者!

242 :デフォルトの名無しさん:2009/08/01(土) 13:44:54
質問者はもっと回答者に敬意を持って接しろ

243 :デフォルトの名無しさん:2009/08/01(土) 14:01:48
愉快犯の荒らしだろ。放置推奨

244 :デフォルトの名無しさん:2009/08/01(土) 23:44:50
228 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/31(金) 16:40:25
  Javaでも20行未満で書けるレベルの処理だろうに。

     ↑
できもしないことを、いい加減に書くのは、質問者に対して失礼。
第三者も見ていて不愉快。
おまいこそ最悪の荒らし!

245 :デフォルトの名無しさん:2009/08/02(日) 00:07:19
そんなに粘着する必要あるのかと。

>>228が無知で、何も知らずに発言しちゃっただけかも知れないんだぜ?
くだらないプライドを守っている暇があったら、勉強して技術向上して
人生をエンジョイした方が、オタク(というかハッカー精神)的に
意味のあるものになるんじゃないのかね?

246 :デフォルトの名無しさん:2009/08/02(日) 00:26:43
なにしにきたんだよ もう帰れよ

247 :デフォルトの名無しさん:2009/08/02(日) 06:43:38
Javacに一行の文字数制限があったかどうかが
気になってしようがないわけだが。

248 :デフォルトの名無しさん:2009/08/02(日) 11:29:02
無知で、何も知らないならレスしないでください。

249 :デフォルトの名無しさん:2009/08/02(日) 11:42:35
そもそも 204って質問だったのか?
アドバイスが欲しいらしいのはわかるが、お願いします的なセリフは何も書いてないだろ
ウゼー独り言延々書き込んでるやつがいるなぁ位の認識だったんだが。

250 :デフォルトの名無しさん:2009/08/02(日) 16:12:46
珍しく伸びていると思えばこれか


251 :デフォルトの名無しさん:2009/08/02(日) 16:38:58
喧嘩嫌

252 :デフォルトの名無しさん:2009/08/02(日) 16:54:39
>お願いします的なセリフは何も書いてないだろ

www
苦しい言い訳。
「お願いします」口調なら、「Javaでも20行未満で書けるレベルの処理」になるのかい?

253 :デフォルトの名無しさん:2009/08/02(日) 16:59:48
まあ書いてやってもいいかな、くらいだけどな

254 :デフォルトの名無しさん:2009/08/02(日) 23:12:00
>>253
中学生2年生かおまいは

255 :デフォルトの名無しさん:2009/08/03(月) 05:00:11
中学生はジャポニカ学習帳でも焼いて食ってろ

256 :デフォルトの名無しさん:2009/08/03(月) 07:08:27
中学二年生にだって天才はいるかもだろ
ニヤニヤと見守るのがベター

257 :デフォルトの名無しさん:2009/08/03(月) 13:34:29
おっと〜!自称「天才」中学2年生現る!

・・・で?20行で書けないの?天才さんw

258 :デフォルトの名無しさん:2009/08/03(月) 13:35:10
今なら30行に負けてあげてもいいんだけど

259 :デフォルトの名無しさん:2009/08/03(月) 19:18:18
マジキチ

260 :デフォルトの名無しさん:2009/08/03(月) 19:21:17
土日は遊んでたので見てなかったがまだやってんのか。ヒマだね〜

261 :デフォルトの名無しさん:2009/08/03(月) 20:25:05
どうした?30行でも不足か?
そっちが20行と言ったから20行なわけで。
べつに、40行でも50行でも構わんのだがな。

262 :デフォルトの名無しさん:2009/08/03(月) 20:27:15
マジキチ

263 :デフォルトの名無しさん:2009/08/03(月) 20:37:57
>Javaでも20行未満で書けるレベルの処理だろうに。

こいつ、恥ずかしくなって逃げたのか。布団かぶって泣いてるのか?

264 :デフォルトの名無しさん:2009/08/03(月) 20:43:09
マジキチ

265 :デフォルトの名無しさん:2009/08/03(月) 23:36:06
なんだこの流れ
Javaよくわからんから20行が無茶ぶりなのかどうか知らんけど
一体何が夏厨の琴線に触れちゃったの?
質問者不在で誰も求めてないコード請求してもしょーがなくね?

266 :デフォルトの名無しさん:2009/08/03(月) 23:43:39
生理の日かアレな人かどちらか

267 :デフォルトの名無しさん:2009/08/03(月) 23:49:27
javaで20行書くのに、いったい何日かかってんだよ。
速いとこコードを晒せ。それですべて解決する話だろ?

268 :デフォルトの名無しさん:2009/08/03(月) 23:55:01
マジキチ

269 :デフォルトの名無しさん:2009/08/04(火) 07:15:52
おはよう!10行くらい書けた?まだかな?

270 :デフォルトの名無しさん:2009/08/04(火) 07:38:06
酔っぱらいに絡まれた感じってこんなんだよな

271 :デフォルトの名無しさん:2009/08/04(火) 08:03:12
schemeでCSVパーサを書いた
BNF通りのCSVの定義が19行、呼び出し8行、コンビネータパーサ80行

しかしよ、実はCSVのパースなんか全く関係なくて
問題はDecimalFormatのパースじゃねーか

ttp://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/text/DecimalFormat.html
ここにBNFライクな仕様が載ってるから
これをパース後数値にして、コンマ/改行で区切って出力すりゃいい
楽をするならJParsec

272 :デフォルトの名無しさん:2009/08/04(火) 08:29:37
Javaなら20行で書ける!

273 :デフォルトの名無しさん:2009/08/04(火) 09:08:46
そもそも大抵の言語は1行にいくらでもつめられるからできて当たり前ww
pythonだと難しいかもな。

274 :デフォルトの名無しさん:2009/08/04(火) 09:17:44

世間を知らない井の中の蛙

275 :204:2009/08/04(火) 09:41:26
土日は自宅プロバイダの書込制限ですまそ。現状はこんな感じ。網羅的テストはまだ。
エスケープ処理が多重にかかるのでちとわかりにくいかも。

引用符の外側を一撃で取れないので、
内側の退避と復旧手順が入って無駄に複雑になってます。
引用符のパースはjavaでかけるべきだったかな…


/**
* 正規表現パターン文字列と、置換文字列で1セット。上から順に解釈適用する。
*/
public static final String[][] FORMAT_FILTER_ARRAY = {
//////////////////////
//浮動小数点対応
//引用符の中のEだけをEEに退避
{"([^']+)(')([^']+)(E)([^']+)(')([^']+)", "$1$2$3EE$5$6$7"},
//浮動小数点のEをE+に
{"(.*)([#0])(E)([#0])(.*)", "$1$2E\\+$4$5"},
//退避したEEをEに戻す
{"([^']+)(')([^']+)(EE)([^']+)(')([^']+)", "$1$2$3E$5$6$7"},
//////////////////////
// シングルクォート囲みをダブルクォート囲みに
{"(')([^']+)(')", "\"$2\""},
{"''", "'"},
//////////////////////////////
//多重エスケープ対応
//
//多重にエスケープ処理が走るため。\1個でも\を出せるように倍にしておく。
{"\\\\", "\\\\\\\\"}
};


276 :204:2009/08/04(火) 09:43:17
あと、変換対象データが整数の場合だけの処理も入れざるを得なくなった。
小数点を最後に残すExcelの仕様のせい。

/**
* 整数値の後ろの余分な小数点を削除する。
* ここでは引用符は"に、浮動小数点はE+に変換後なので注意。
*/
public static final String[][] DOT_FILTER_ARRAY = {
//////////////////////
//整数の場合の余分な小数点対応(浮動小数点で無い場合)
//引用符の中の.#を..#に退避
//{"([^\"]+)(\")([^\"]+)(\\.#+)([^\"]+)(\")([^\"]+)",
{"([^\"]*)(\")([^\"]*)(\\.#+)([^\"]*)(\")([^\"]*)",
"$1$2$3\\.$4$5$6$7"},
//浮動小数点の#.#E#を#..#E#に退避 上の変換とは重ならない。
{"(.*)([0#])(\\.#+E\\+[0#])(.*)", "$1$2\\.$3$4"},
//上記変換対象にならなかった-つまり..#でない.#+を削除
{"(.*)([^\\.])(\\.#+)(.*)", "$1$2$4"},
//浮動小数点の#..#E#を#.#E#に復旧。引用符の中の外し方がわからない。
{"(.*)([0#])(\\.)(\\.#+E\\+[0#])(.*)", "$1$2$4$5"},
//引用符の中の..#を.#に復旧
//引用符の中にもともと..#があっても、...#になって..#に戻るはず。
{"([^\"]*)(\")([^\"]*)(\\.)(\\.#+)([^\"]*)(\")([^\"]*)",
"$1$2$3$5$6$7$8"}
};

277 :デフォルトの名無しさん:2009/08/04(火) 09:49:56
これ見たら >>218 とかブン殴りたくなってきたんだが。

278 :204:2009/08/04(火) 09:51:49
20行の成否はどうでもいいんだけど、もし可能であれば教示していただけるとうれしい。
仕事はともかく、美しいコードには感動があるのでね。
(とはいえ、他人が見てわからないコードはよろしくないので、
無理に圧縮した20行より、読みやすい100行の方がいいけど。)

>>224
n回フィルターすると、フィルター相互の矛盾衝突のチェックがn(n-1)必要になるから、
フィルターが増えるほど加速的に困難になる…という趣旨ですよね。
しかし、3行1セットで1個の処理をするフィルターを作成し、
そのセットが他には絶対に影響を与えない堅固なものであれば、
必ずしもn(n-1)にはならないのではないか…と思って手をつけたわけですが…
しかし実際やってみるとそうはなってませんな…引用符処理が誤算でした。

279 :デフォルトの名無しさん:2009/08/04(火) 09:56:00
おい、ここはニートのスレですか?

280 :デフォルトの名無しさん:2009/08/04(火) 09:59:41
なんだなんだ、また日記が始まるのか

281 :204:2009/08/04(火) 10:05:11
いやいや、みなさんオチがついてないと気持ち悪いでしょ。サービスのつもりだったんだけど。
もう一区切りついたんで書き込みやめとくよ。(何が出来て何が出来ないかはわかったという趣旨)
あと>>224さんの'''hoge' 難問ですわ…ご指摘ありがとうございました。

282 :デフォルトの名無しさん:2009/08/04(火) 10:48:27
あーウザかった

283 :デフォルトの名無しさん:2009/08/04(火) 11:00:43
マジキチ

284 :デフォルトの名無しさん:2009/08/04(火) 12:21:32
Javaでも20行未満で書けるレベルの処理だろうに。

285 :デフォルトの名無しさん:2009/08/04(火) 12:31:48
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

286 :デフォルトの名無しさん:2009/08/04(火) 21:43:50
マジキチ

287 :デフォルトの名無しさん:2009/08/04(火) 21:52:53
    /:::::::ヽ____/::::::::ヽ、
   丿 ::.__  .:::::::::::::  __  ::::ヽ_       ,. 、       /   /
  / /。 ヽ_ヽv /: /。ヽ  ::::::ヽ    ,.〃´ヾ.、  /  /
 / / ̄ ̄√___丶  ̄ ̄\  ::::| / |l     ',  / /
 | .:::::::::: / / tーーー|ヽ     ..::::: ::|r'´  ||--‐r、 ',   javaなら20行で書ける!!
 | .:::::.  ..: |    |ヽ   .,..ィ'´     l',  '.j '.    javaなら20行で書ける!!
 | :::    | |⊂ニヽ| |  'r '´         ',.r '´ !|  \
 | :    | |  |:::T::::| !  l!     ....:.:.:.:.:.:ヽ、   ,l    \
 \:    ト--^^^^^┤   ゝ、.,_ ---‐‐‐----ゝ、ノ

288 :デフォルトの名無しさん:2009/08/04(火) 22:34:41
マジキチ

289 :デフォルトの名無しさん:2009/08/05(水) 15:37:17
>>Javaなら20行でできる
専用スレ立ててやれ

290 :デフォルトの名無しさん:2009/08/05(水) 16:35:23
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

291 :デフォルトの名無しさん:2009/08/05(水) 17:57:53
>>289
もう終わった話に一人で何言ってんの?

292 :デフォルトの名無しさん:2009/08/05(水) 18:09:20
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

293 :デフォルトの名無しさん:2009/08/05(水) 23:40:59
perlで7行スレは盛り上がったのになんだこの流れ

294 :デフォルトの名無しさん:2009/08/05(水) 23:51:53
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |

295 :デフォルトの名無しさん:2009/08/06(木) 09:14:15
正規表現使うんならperlかpythonあたりいくだろ。javaはないわ。

296 :デフォルトの名無しさん:2009/08/06(木) 09:36:03
正規表現使うのが目的ならな。

297 :デフォルトの名無しさん:2009/08/06(木) 10:22:39
正規表現使わなくてもjavaなら20行未満で書けるよ。

298 :デフォルトの名無しさん:2009/08/06(木) 10:53:47
>>297
おい!できるならとっとと書いてみろよ。
逃げんじゃねーぞこの口だけ野郎が!

299 :デフォルトの名無しさん:2009/08/06(木) 14:40:55
>>297
あ?どうしたコラ!
はやくしろよ。
また逃げたのかなw 布団被って泣いているのかな?w

300 :デフォルトの名無しさん:2009/08/06(木) 15:07:24
人にものを頼む態度じゃないな

301 :デフォルトの名無しさん:2009/08/06(木) 15:25:36
ああん?

 「書ける」 とは言ったが 「書く」 とは言ってない。
 書いて欲しかったら頭を下げてお願いしろ。
 それが礼儀だろ。

・・・って言いたいのか?中学生か、おまいは!

302 :デフォルトの名無しさん:2009/08/06(木) 15:41:38
と、小学生みたいな発言している人がいますね

303 :デフォルトの名無しさん:2009/08/06(木) 17:35:45
で、いつになったら発表してくれるの?>> 20行クン
今なら30行に負けてあげてもいいと言ってるんだし、
そもそも、こっちは行数なんて問題にしてないから
100行だろうが1000行だろうが好きなだけ費やしてもいいんだよ。
早く書いてごらんよ。どうせ書けないんでしょ?
書けもしないのにテキトーなことを言ったんでしょ?

304 :デフォルトの名無しさん:2009/08/06(木) 18:28:46
怒ってもいいことなんてひとつもない。

305 :デフォルトの名無しさん:2009/08/06(木) 20:07:09
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

306 :デフォルトの名無しさん:2009/08/06(木) 20:11:55
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

307 :デフォルトの名無しさん:2009/08/06(木) 22:54:49

   /         ドッカン
  / /    ,,_     ドッカン
 ━━━━━'), )=         ☆ゴガギーン
      ∧_∧ヽ\         /          / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     (   ) 〉 〉_ _ ____      ∧_∧ ∠  おらっ!20行で書いてみろ
     / ⌒ ̄ / "'''"'|    ||     (`∀´ )  \___________
      |   | ̄l    |    |/      /     \
.      |    |  |     |    ||      | |   /\ヽ
       |   |  .|     |    |     へ//|  |  | |
      (   |  .|   ロ|ロ   ゙!l''ヽ/,へ \|_  |   | |
       | .lヽ \ |    |   ヽ\/  \_ / ( )
      | .|  〉 .〉    |    |        | |
     / / / / |     |    〈|      | |
     / / / / |     |    ||      | |
    / /  / / └──┴──┘       | |

308 :デフォルトの名無しさん:2009/08/07(金) 02:26:58
ウケるのは最初の一回だけだぞ。


309 :デフォルトの名無しさん:2009/08/07(金) 10:12:05
夏休みが終わるまではこんな調子が続くだろうからいくら言っても無駄だろうね。

310 :デフォルトの名無しさん:2009/08/13(木) 17:30:46
なスレ汚し奉りそ

311 :デフォルトの名無しさん:2009/08/13(木) 22:48:37
置き換えや検索を希望する訳ではないのですが、
[!#-'*-;=?-~]
が一体どういう動きをしているか知りたいです
一応説明では「URL文字にマッチ」となっているのですが、
どこがどのようにしてそれらの文字にマッチするよう働いているのか分かりません
環境は鬼車です

312 :311:2009/08/14(金) 00:06:06
すみません自己解決しました
しばらく調べていたら範囲指定がらみで動いていたということが分かりました
どうもすみません

313 :デフォルトの名無しさん:2009/08/17(月) 19:35:58
●正規表現の使用環境
鬼車

●検索か置換か?
置換

●説明
( から ) までの文字列にマッチ
マッチした文字列中に ABC が含まれている場合は
置換時に ABC を \1 で参照できる正規表現

●対象データ
smp("桁数:" + strABC.length);
smp("行数:" + cnt);

●希望する結果
smp(ABC);
smp();


検索文字列
\([^\)]*?(ABC)?[^\)]*?\)
置換文字列
(\1)
で試してみたのですが、ABCがある行も無い行も全て
smp(); になってしまいました。

どのように記述すればABCを取り出せるのか教えてください。

314 :デフォルトの名無しさん:2009/08/17(月) 20:48:23
? 付け過ぎ

315 :デフォルトの名無しさん:2009/08/17(月) 21:25:22
*?(ABC)? の部分が、"何もない" 状態にいきなりマッチするからじゃね?
場合分けの部分を親言語に任せる方が、文字列の否定を使うより楽かもしれない。

316 :デフォルトの名無しさん:2009/08/17(月) 21:54:46
エディタの置換機能で実現したいので、こうなってます。
.*?の?は、付けておかないと(ABC)?.*?の部分に入ってくれないかと思い付けました。
結果的にマッチしていないので無意味ですが。。。

何か方法はありませんか?

317 :デフォルトの名無しさん:2009/08/17(月) 22:13:33
3ステップに分ければ簡単だが
(1) smp\(.*(ABC).*\) → xxxxxxxxxxx(\1)
(2) smp\(.*\) → smp()
(3) xxxxxxxxxxx\((.*)\) → smp(\1)

318 :デフォルトの名無しさん:2009/08/17(月) 22:30:30
ABCがマッチする場合|ABCがマッチしない場合

319 :デフォルトの名無しさん:2009/08/17(月) 22:59:43
Javaでも20行未満で書けるレベルの処理だろうに。

320 :デフォルトの名無しさん:2009/08/17(月) 23:02:20
正規表現は魔法じゃ無い!

321 :デフォルトの名無しさん:2009/08/17(月) 23:16:18
>>319
またお前か。
エディタ上で使うって言ってるだろ。
何調子乗ってんだ?

322 :デフォルトの名無しさん:2009/08/17(月) 23:18:12
>>319
と言うかその前に、JavaでCSV処理の話はどうなったんだ?
逃げたと思ったらコレだよ。
とっとと書いてみなよ20行君。

いや30行でも100行でもいいからさ。

323 :デフォルトの名無しさん:2009/08/18(火) 07:48:03
この余白はそれを書くには狭すぎる

324 :デフォルトの名無しさん:2009/08/18(火) 13:13:17
鬼車ってなんかエロい

325 :デフォルトの名無しさん:2009/08/18(火) 14:03:04
>>324
kwsk


326 :デフォルトの名無しさん:2009/08/18(火) 14:56:49
>>321
>>322

おいおい、釣りで書いてるだけだろ
なにヒートアップしてんだ


327 :デフォルトの名無しさん:2009/08/18(火) 15:00:43
  /\___/\
/ /    ヽ ::: \
| (●), 、(●)、 |    / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  ,,ノ(、_, )ヽ、,,   |  < まーたはじまった
|   ,;‐=‐ヽ   .:::::|    \_______
\  `ニニ´  .:::/
/`ー‐--‐‐―´´\

328 :デフォルトの名無しさん:2009/08/18(火) 21:57:51
マジキチ

329 :デフォルトの名無しさん:2009/08/18(火) 23:01:57
お願いします。

●正規表現の使用環境
bash(grepかegrepでお願いします。)

●検索か置換か?
置き換え

●説明
2行を1行にまとめたい。

●対象データ
>
(hogehoge.pampam)

●希望する結果
>(hogehoge.pampam)

ワガママ逝って申し訳ないのですが、
できればgrepだけで出来れば最高です。

330 :デフォルトの名無しさん:2009/08/18(火) 23:19:33
>>329
grepに置換機能はないからムリ。

2行毎につなげるだけだったら、
#!/bin/sh
while read line
do
read line2
echo "$line$line2"
done

でよくない?


331 :デフォルトの名無しさん:2009/08/19(水) 00:16:07
grepで置き換えとか無理だろ。
Javaなら20行未満で書けるレベルの処理だが。

332 :デフォルトの名無しさん:2009/08/19(水) 00:35:11
>>331
は? 置換だけならJavaでも10行未満でいけるだろ。
それより20行未満でCSV処理はどうなったのかな?
布団被って泣いてるのかな?w

333 :デフォルトの名無しさん:2009/08/19(水) 04:12:55
まー落ち着けよ。

Javaなら20行未満で書けるレベルの処理で大人気ないな

334 :デフォルトの名無しさん:2009/08/19(水) 04:21:09
とりあえず落ち着きませんか?

Javaなら20秒未満で書けるレベルの処理で大人気ないと思いますよ

335 :デフォルトの名無しさん:2009/08/19(水) 07:14:09
これは落ち着いたほうがいいかもわからんね

Javaなら20%未満のやる気で書けるレベルの処理で大人気ないっていう感想を持つ人もいるだろうし

336 :デフォルトの名無しさん:2009/08/19(水) 08:05:54
以上、正規表現もJavaも全く解らない人たちが大喜びの映像をお届けいたしました。

337 :デフォルトの名無しさん:2009/08/19(水) 08:22:25
Javaなら20行未満で書けるレベルの処理で勝利宣言されてもなあ…

338 :デフォルトの名無しさん:2009/08/19(水) 10:51:23
sedでいいじゃない

339 :デフォルトの名無しさん:2009/08/19(水) 10:58:45
javaでいいじゃない

340 :デフォルトの名無しさん:2009/08/20(木) 08:01:32
viで

341 :デフォルトの名無しさん:2009/08/20(木) 10:41:35
javaで書ける、って言うけど
どうせ javaで正規表現を書くんだろ?

 pattern = Pattern.compile("\\([^\\)]*?(ABC)[^\\)]*?\\)");

みたいな。やたら \ が増えまくって、かえって見にくい。
ディレクトリの区切り文字の \ にマッチさせるのに

 pattern = Pattern.compile("\\\\");

って \ を4回も書かなきゃならん。 \ 地獄だ。武○士だ!

342 :デフォルトの名無しさん:2009/08/20(木) 12:05:04
Emacs Lisp の正規表現に比べたら別に大したことない。

343 :デフォルトの名無しさん:2009/08/20(木) 18:33:59
>>341
ん?
\xがエスケープシーケンスになる言語はみんなそうなんじゃないの?

>>342
うむ。


344 :デフォルトの名無しさん:2009/08/20(木) 19:41:20
>>343
文字列から生成する場合に限ればな
正規表現リテラルが存在する言語ならそれに付き合う必要はない

345 :デフォルトの名無しさん:2009/08/20(木) 21:01:57
あーそうだった。忘れてた。thx


346 :デフォルトの名無しさん:2009/08/20(木) 21:19:05
> pattern = Pattern.compile("\\\\");

ワロス
アホすぎるwww

347 :デフォルトの名無しさん:2009/08/20(木) 21:43:56
よし、夏休み最後の一週間はJavaを勉強しちゃうゾ! ><

348 :デフォルトの名無しさん:2009/08/21(金) 20:54:36
>>347
20行係を任ず

349 :デフォルトの名無しさん:2009/08/23(日) 19:53:56
正規表現を使いこなしてる人でも、間違った正規表現を書いちゃうことってよくあるの?

350 :デフォルトの名無しさん:2009/08/23(日) 19:57:39
間違った正規表現すら使いこなすよ

351 :デフォルトの名無しさん:2009/08/23(日) 21:52:56
間違ってる事がわからないから、全部正解

352 :デフォルトの名無しさん:2009/08/23(日) 23:10:06
想定したパターンが間違ってたってことは割とある
単語の文字列にハイフンが含まれることを考慮してなかったり

353 :デフォルトの名無しさん:2009/08/24(月) 22:19:40
>>330
すんません、ありがとうございます。
シェルよくわからんのでしたが、すんごい参考になりました。

おかげでなんとか出来ました。
ありがとうございます。

354 :デフォルトの名無しさん:2009/08/25(火) 00:05:17
日本語版でないですかね

Regular Expressions Cookbook
http://oreilly.com/catalog/9780596520687/
http://www.amazon.com/dp/0596520689/

355 :デフォルトの名無しさん:2009/08/25(火) 16:48:49
色々試してみたのですがうまく動かないので教えてください。

●正規表現の使用環境
PHP 5.2.5

●検索か置換か?
検索 & 置換

●説明
絵文字用の文字列変換を考えています。
フォームのテキストエリアに入力された文字列から
##で囲まれた文字列を検索し置換したい。

●対象データ
いい天気ですね##A0F1##!!
(AF01は固定ではないです)

●希望する結果
##AF01##にヒットし、さらにAF01のみに置換したい。

自分が考えた正規表現は /#[2][A-F|0-9]{4}#[2]$/u
ですが、うまく動きません・・どなたかお願いします。

356 :デフォルトの名無しさん:2009/08/25(火) 17:16:28
PHPはよう知らんが

s/##([A-F0-9]{4})##/$1/g

じゃないのか?



357 :デフォルトの名無しさん:2009/08/26(水) 01:11:44
>じゃないのか?
って。
そうして質問を質問で返すんだろ。
よっぽど自信がないのか。
なんかバカっぽい。

358 :デフォルトの名無しさん:2009/08/26(水) 01:12:25
>じゃないのか?
って。
どうして質問を質問で返すんだろ。
よっぽど自信がないのか。
なんかバカっぽい。

359 :デフォルトの名無しさん:2009/08/26(水) 10:11:15
いま、ものすごくバカっぽいレスを目にした気がした。

360 :デフォルトの名無しさん:2009/08/26(水) 11:21:38
>どうして質問を質問で返すんだろ。
「質問を質問で返すな」と言い切る自信はないらしい。

361 :355:2009/08/26(水) 11:28:27
>>356
ご返信ありがとうございます。
試してみたのですが、期待した動作にならなかったです。


362 :デフォルトの名無しさん:2009/08/26(水) 12:28:28
>>357
ろくに回答もせず、人のレスに難癖付けるだけ、か…

哀れだな


363 :355:2009/08/26(水) 14:10:51
あれから、色々自分で試行錯誤して

/#{2}([A-F|0-9]{4}#{2})/

でヒットするところまでは持っていけました。
後はなんとかなりそうなので、がんばってみます。
なんだかスレが荒れてしまったみたいで申し訳ありません。

364 :デフォルトの名無しさん:2009/08/26(水) 14:19:43
おかしいのがはりついてるせいだから、あんま気にせず。

365 :デフォルトの名無しさん:2009/08/26(水) 14:26:40
PHPはよう知らんが >>356 のでいけたよ。
# s/.../.../g とかは Perl 特有な演算子なのでそこらへんはよしなに

$str = preg_replace('/##([A-F0-9]{4})##/', '$1', $str);

これでどうですか?

366 :デフォルトの名無しさん:2009/08/26(水) 14:55:40
>これでどうですか?
って。
どうして質問を質問で返すんだろ。
よっぽど自信がないのか。
なんかバカっぽい。

367 :デフォルトの名無しさん:2009/08/26(水) 15:17:15
マジレスすると

(?:^|[^#])
##([A-F0-9]{4})##
(?:$|[^#])

368 :デフォルトの名無しさん:2009/08/26(水) 15:28:42
「これでどうですか?」は質問じゃないだろ。

369 :367:2009/08/26(水) 15:54:37
ん?
「####AF01##」のような文字列も置換していいのか。
条件反射してすまなかった。

370 :デフォルトの名無しさん:2009/08/26(水) 16:36:03
/#{2}([A-F|0-9]{4}#{2})/ の縦棒(|)は多分こういう意味では?と予想。

/#{2}([A-F]{2}[0-9]{2})#{2}/

371 :デフォルトの名無しさん:2009/08/26(水) 17:08:01
>>370
「対象データ」の「##A0F1##」にマッチしなさそう、とか。

372 :デフォルトの名無しさん:2009/08/26(水) 17:40:08
>>370
文字クラスの連結のつもりだったとエスパー。


373 :デフォルトの名無しさん:2009/08/26(水) 17:46:50
355です。

>>365
ありがとう!まさにこれが期待した動作です。
Perlに詳しくなかったのでPHP風に直せなかった自分の力不足で
動かなかったなどと言ってすみませんでした。

>>367
####AF01##は##「##AF01##」の部分だけ置換したいと思っています。
##は意味もなく使わせないようにしたいのですが、ユーザーがどういう意図で
使うかはわからない部分もあるのでそうしています。

後は答えていただいた方法をうまく組み込んでみます、ありがとうございました。



374 :デフォルトの名無しさん:2009/08/26(水) 17:51:36
>>372
A-F|0-9はうまい方法が思いつかなかったのでこうしてます。

要するにA-Fまでと0-9までの半角英数字4文字が続いている場合となります。
0CAFの場合もありますし、DA16など4文字は確定で入り乱れている状態です。

これをうまく表現する方法がわからなかったので
調べながら書いてみたら動いたのでとりあえずこれでやってました。

375 :デフォルトの名無しさん:2009/08/26(水) 18:01:24
>>374
[A-F|0-9]は、A-Fか0-9か'|'という意味だ。
つまり[|A-F0-9]や[A-F0-9|]も同じ意味になる。

おまえがやりたいことは[A-F0-9]で出来る。

まだ正規表現に慣れていないみたいだが、
Webアプリ開発では必須のスキルなので
これから勉強していくといい。

まずはフクロウ本を買うところから始めるべし。


376 :デフォルトの名無しさん:2009/08/26(水) 19:23:33
| は ( ) の中で使うときと { } で使うときでは意味が違う。
最近のガキは前後の文脈で判断せずに
ピンポイントだけ見て反応する。
悪いクセだ。

377 :誤字った:2009/08/26(水) 19:24:20
| は ( ) の中で使うときと [ ] で使うときでは意味が違う。
最近のガキは前後の文脈で判断せずに
ピンポイントだけ見て反応する。
悪いクセだ。

378 :デフォルトの名無しさん:2009/08/26(水) 19:38:26
>>377
自己紹介?

379 :デフォルトの名無しさん:2009/08/26(水) 19:40:23
( ) の中ってなに。。

380 :デフォルトの名無しさん:2009/08/26(水) 20:38:26
{}かな。

381 :デフォルトの名無しさん:2009/08/26(水) 23:33:37
拗音の「ぁぃぅぇぉゃゅょァィゥェォャュョ」と促音の「っ」が複数個連続した場合にSAPI5を使うソフトウェアがハングアップします。
ところが「うわぁぁぁぁ」のような表現は日常的に存在しているためにそのたびにハングアップして閉口してます。
正規表現で小さい文字を大きくすることは可能ですか?


382 :デフォルトの名無しさん:2009/08/26(水) 23:40:53
ょぅι゛ょ

383 :デフォルトの名無しさん:2009/08/26(水) 23:54:43
s/ょぅι゛ょ/ 妖女/

384 :デフォルトの名無しさん:2009/08/26(水) 23:57:31
こすると大きくなるよ

385 :デフォルトの名無しさん:2009/08/27(木) 00:04:25
こすったら膿出てきた

386 :デフォルトの名無しさん:2009/08/27(木) 00:18:54
淋しい病気ですか

387 :デフォルトの名無しさん:2009/08/27(木) 00:32:52
>>386
下手糞なツッコミ
もっと激しく!!

388 :デフォルトの名無しさん:2009/08/27(木) 10:57:46
>>381
s/ぁぃぅぇぉゃゅょゎァィゥェォヶャュョヮ/あいうえおやゆよわアイウエオケヤユヨワ/g

389 :デフォルトの名無しさん:2009/08/27(木) 11:01:29
性器表現だけじゃできなそうだな。

390 :デフォルトの名無しさん:2009/08/27(木) 11:20:00
tr/ぁぃぅぇぉゃゅょゎァィゥェォヶャュョヮ/あいうえおやゆよわアイウエオケヤユヨワ/

s/ぁ/あ/g
s/ぃ/い/g
s/ぅ/う/g
s/ぇ/え/g
s/ぉ/お/g
s/ゃ/や/g
s/ゅ/ゆ/g
s/ょ/よ/g
s/ゎ/わ/g
s/ァ/ア/g
s/ィ/イ/g
s/ゥ/ウ/g
s/ェ/エ/g
s/ォ/オ/g
s/ヶ/ケ/g
s/ャ/ヤ/g
s/ュ/ユ/g
s/ョ/ヨ/g
s/ヮ/ワ/g

391 :デフォルトの名無しさん:2009/08/27(木) 18:29:07
どうでもいいけどそれは SAPI5 とやらを直すべきではないのか?

392 :デフォルトの名無しさん:2009/08/27(木) 19:12:10
マッチするなら電子メールアドレスである事が保証できる
正規表現を教えて下さい

393 :デフォルトの名無しさん:2009/08/27(木) 19:24:33
完全にやるのはひどくおおごとで、
かつルール違反のアドレスが結構ある。

とりあえず使えればいいのであれば、メールアドレス 正規表現 で検索

394 :デフォルトの名無しさん:2009/08/27(木) 19:44:38
DoCoMoもauも、ちょっと前までは連続ドット(RFC違反)の
メールアドレスが普通に作れちゃったから困ったもんだ。

395 :デフォルトの名無しさん:2009/08/27(木) 19:52:12
>>392

まずググる、という発想すらできない君にはこれがお似合いだよ

.+@.+



396 :デフォルトの名無しさん:2009/08/27(木) 21:16:55
>>391
「暗いと不平を言うよりも、すすんで明かりをつけましょう」

397 :デフォルトの名無しさん:2009/08/27(木) 22:41:53
>>395
それじゃあ
> マッチするなら電子メールアドレスである事が保証できる
を満たしてないだろ。

これなら条件を満たすだろ。

[a-z]{6,30}@gmail.com

398 :デフォルトの名無しさん:2009/08/27(木) 23:53:56
こっちの方がいい

[^@]+@gmail.com

399 :デフォルトの名無しさん:2009/08/27(木) 23:58:02
>>397-398
やりがちだよなぁ、\.comとかのエスケープ忘れ
しかもそうそう異常判定が起きないから潜在的なバグになりやすい

400 :397:2009/08/28(金) 00:26:28
>>399
ごめんなさい。反省します。

>>398
それだと「マッチするなら電子メールアドレスであることが保証できる」が満たせないよね。

401 :デフォルトの名無しさん:2009/08/28(金) 00:57:19
命題トリックだな

402 :デフォルトの名無しさん:2009/08/28(金) 01:02:24
連. はイケないとか
"に囲まれてるなら@も連.もおkとか
イカレてるわ

403 :デフォルトの名無しさん:2009/08/28(金) 01:22:04
正規表現だけでなんとかしようって方がイカレてるわ

404 :デフォルトの名無しさん:2009/08/28(金) 09:38:08
到達できないアドレスは電子メールアドレスとして保証されていると言えるの?

405 :デフォルトの名無しさん:2009/08/28(金) 12:21:25
一般的には言えないかもしれないけど、
そこはこのスレのお題の範疇を超えるんで、気にしなくて良いんじゃないかと思う。

406 :デフォルトの名無しさん:2009/08/28(金) 12:30:48
俺はKENT氏が使っているこれを利用してるけど

/[\w.-]+@[\w.-]+\.[a-zA-Z]{2,6}$/

407 :デフォルトの名無しさん:2009/08/28(金) 13:25:52
KENT氏(笑)

408 :デフォルトの名無しさん:2009/08/28(金) 13:30:29
KENT氏()笑

409 :デフォルトの名無しさん:2009/08/28(金) 13:39:48
はいどうぞ ttp://www.din.or.jp/~ohzaki/mail_regex.htm

410 :デフォルトの名無しさん:2009/08/28(金) 13:43:16
>>409
うんざりしたw

これはRFCが悪い。

411 :デフォルトの名無しさん:2009/08/28(金) 14:27:48
>>406
これはひどい。
local-partの記号類をまったく受け付けないじゃん。
Gmailの拡張アドレスが弾かれちゃうね。


412 :デフォルトの名無しさん:2009/08/28(金) 14:29:02
>>411
「マッチするなら電子メールアドレスである事が保証できる 」
を満たせばおkなんじゃないの?

413 :デフォルトの名無しさん:2009/08/28(金) 14:37:11
極端な話だけど/foo@example\.com/も条件を満たすよ
>>397はそういうジョークだろう


414 :デフォルトの名無しさん:2009/08/28(金) 15:24:14
>>412
そういう意味ならなおさら >>406 はまるでダメでしょ。
電子メールアドレスでないものも余裕でマッチする。

415 :デフォルトの名無しさん:2009/08/28(金) 15:27:38
これはどうなん?

http://search.cpan.org/~rgarcia/perl-5.10.0-RC1/pod/perlfaq9.pod#How_do_I_check_a_valid_mail_address?

416 :デフォルトの名無しさん:2009/08/28(金) 15:33:15
>>415
ああ、俺もそれ使ってるわ。

日本語の解説はこれな。
ttp://blog.livedoor.jp/dankogai/archives/51189905.html


417 :デフォルトの名無しさん:2009/08/28(金) 15:40:45
>>416
そのページにあるリンク先見てて思ったんだが
[.] とか [@] って何の意味があるんだろ。

ときどき目にするんだが。。

418 :デフォルトの名無しさん:2009/08/28(金) 16:04:50
>>417
[@]はあんまり意味がないと思うけど、[.]は\.を使うよりいい(見やすい?)と、Damian Conway先生が
言ってたような気がする。

419 :デフォルトの名無しさん:2009/08/28(金) 16:16:48
>>415
そこに書いてある、このモジュールを使えばいいんかな?

RFC::RFC822::Address -- RFC 822 style address validation. - search.cpan.org
http://search.cpan.org/~abigail/RFC-RFC822-Address-2009040601/lib/RFC/RFC822/Address.pm

420 :デフォルトの名無しさん:2009/08/28(金) 16:43:24
>>417
[@] は配列が展開されるのを防ぐのかな?

421 :デフォルトの名無しさん:2009/08/28(金) 16:47:38
>>409
ジョークか?

422 :デフォルトの名無しさん:2009/08/28(金) 21:11:37
Javaでも20行未満で書けるレベルの処理だろうに。

423 :デフォルトの名無しさん:2009/08/28(金) 21:23:59
>>422
それもう面白くないよ。

424 :デフォルトの名無しさん:2009/08/28(金) 22:58:46
    /:::::::ヽ____/::::::::ヽ、
   丿 ::.__  .:::::::::::::  __  ::::ヽ_       ,. 、       /   /
  / /。 ヽ_ヽv /: /。ヽ  ::::::ヽ    ,.〃´ヾ.、  /  /
 / / ̄ ̄√___丶  ̄ ̄\  ::::| / |l     ',  / /
 | .:::::::::: / / tーーー|ヽ     ..::::: ::|r'´  ||--‐r、 ',   javaなら20行で書ける!!
 | .:::::.  ..: |    |ヽ   .,..ィ'´     l',  '.j '.    javaなら20行で書ける!!
 | :::    | |⊂ニヽ| |  'r '´         ',.r '´ !|  \
 | :    | |  |:::T::::| !  l!     ....:.:.:.:.:.:ヽ、   ,l    \
 \:    ト--^^^^^┤   ゝ、.,_ ---‐‐‐----ゝ、ノ

425 :デフォルトの名無しさん:2009/08/29(土) 02:27:04
ちなみにJavaなら20行未満で書けるぞ

426 :デフォルトの名無しさん:2009/08/29(土) 07:51:01
\ 地獄ですね

427 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 09:40:01
「全然」が現れてから次の「。」までに「ない」「なく」「なかった」「ません」が来ない文にマッチさせるには?

428 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 12:41:16
/全然(?!ない|なく|なかった|ません).*。/

429 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 13:23:45
松来未祐と金田朋子のRADIOデコピンないと、ひぐらしのなく頃に、本当にすまなかったと思っている、うちのタマ知りませんか
等もマッチしなくなるよ

430 :名無しさん@そうだ選挙に行こう:2009/08/30(日) 14:01:20
>>429
字面だけで処理しようってんだから、そこまで気にしてやる必要は無いんではないか

431 :デフォルトの名無しさん:2009/08/30(日) 22:57:51
>>428
"全然勝負にならない。" にマッチしちゃうよ。

432 :デフォルトの名無しさん:2009/08/31(月) 01:06:53
全然問題ない
全然なくならない

433 :デフォルトの名無しさん:2009/08/31(月) 01:21:30
>>428
正規表現メモ
http://www.kt.rim.or.jp/~kbk/regex/regex.html#POSITIVELOOKAHEAD

「よくある勘違い」

434 :デフォルトの名無しさん:2009/08/31(月) 01:32:27
ツッコまれること前提で片手間に書いたのに、やっとツッコんでもらえたw

/全然(?!.*?(?:ない|なく|なかった|ません)).*?。/
これでどうだ

435 :デフォルトの名無しさん:2009/08/31(月) 02:32:07
キュウリを突っ込んで欲しいのか?
魚肉ソーセージを突っ込んで欲しいのか?

436 :デフォルトの名無しさん:2009/09/01(火) 10:08:55
全然((?!ない|なく|なかった|ません).)*。

437 :デフォルトの名無しさん:2009/09/01(火) 21:27:07
>>434 >>436
検索してみたら「全然参考にならないんだ、悪いけど。」にマッチしてる。

438 :デフォルトの名無しさん:2009/09/01(火) 22:13:55
>>437
Perl と Ruby で試してマッチしないんだけど、どんな正規表現エンジン使ってるの?

439 :デフォルトの名無しさん:2009/09/01(火) 22:25:44
>>437
お前のレス全然参考にならないんだ、悪いけど。

440 :デフォルトの名無しさん:2009/09/01(火) 22:30:23
>>438
これ。内部エンジンがどうなっているのかよく分かんない。
ttp://www.kotonoha.gr.jp/cgi-bin//search_form.cgi?viaTopPage=1

441 :デフォルトの名無しさん:2009/09/01(火) 23:00:44
>>427 = >>440 なのか?
>>1 をよく読んで出直せ。

442 :441:2009/09/01(火) 23:09:11
まあいいや。 >>427 = >>440 と仮定して。

>>440 のをちょっと試してみたけど、
「前後文脈の指定について」の後文脈の例を見るとわかるように、
「検索文字列」の直後のパターンを指定したい場合は、
文字列先頭のアンカを指定する必要があるみたい。
例えば >>436 のを参考にこんなんでいけるかと。

^((?!ない|なく|なかった|ません).)*。

443 :デフォルトの名無しさん:2009/09/01(火) 23:16:52
>>441
ごめんなさい。

>>442
おおお、できた。ありがとう。

444 :デフォルトの名無しさん:2009/09/04(金) 13:45:50
お時間あればよろしくおねがいします

●正規表現の使用環境
.NET Framework 2.0
●検索か置換か?
置き換え
●説明
ランダムな文字列内に繰り返す言葉を1つにまとめたい
●対象データ
abcdddddde
こんにちちちちちちわ
!+++**!
●希望する結果
abcde
こんにちわ
!+*!

445 :デフォルトの名無しさん:2009/09/04(金) 14:20:02
>>444
s/(.+?)\1+/$1/g

ドトネトだとこんな感じか

Regex re = new Regex( @"(.+?)\1+" );
Console.WriteLine( re.Replace( "abcdddddde", "$1" ) );

446 :デフォルトの名無しさん:2009/09/04(金) 14:23:20
s/(.)\1+/$1/g
でもいいな

447 :デフォルトの名無しさん:2009/09/04(金) 23:46:35
>>445
ありがとうございます、なるほど・・・
PHPだけで他の言語や正規表現はサッパリで、助かりました

448 :デフォルトの名無しさん:2009/09/04(金) 23:55:59
Javaでもやれ

449 :デフォルトの名無しさん:2009/09/05(土) 00:56:44
20行で書けるからな

450 :デフォルトの名無しさん:2009/09/05(土) 09:38:25
PHPでも20行で書けるな

451 :デフォルトの名無しさん:2009/09/06(日) 15:33:57
●正規表現の使用環境
PCRE7

●検索か置換か?
検索

●説明
HTMLマーク付けされていないURLを探したい

●対象データ
http://example1.com/ <a href="http://example2.com/">http://example2.com/</a> http://example3.com/

●希望する結果
http://example1.com/
http://example3.com/

452 :デフォルトの名無しさん:2009/09/12(土) 19:55:22
「けちなマッチング」ってもっと他の言い方ないの?

453 :デフォルトの名無しさん:2009/09/12(土) 20:54:51
けちなマッチング、という言い方は知らないのだけど、
非欲張りな繰り返しのこと? それとも逆に強欲な繰り返しのこと?

454 :デフォルトの名無しさん:2009/09/15(火) 23:24:21
最短一致とかいろいろな言い方あるね

455 :デフォルトの名無しさん:2009/09/17(木) 13:12:34
●正規表現の使用環境
VBScript

●検索か置換か?
置換

●説明
ソースコードの関数を置換したい

●対象データ
1 FuncA(1,2,3)
2 FuncA(1,FuncB(2,3),4)
3 FuncA(1,"string2,3",4)
4 FuncA(1,2,3):FuncD(1,2,3)

●希望する結果
1 FuncC(3,1,2)
2 FuncC(4,1,FuncB(2,3))
3 FuncC(4,1"string2,3")
4 FuncC(3,1,2):FuncD(1,2,3)
とりあえず対になる()の特定方法が知りたいです・・



456 :デフォルトの名無しさん:2009/09/17(木) 19:10:43
正規表現以前に、単語単位でFuncA->FuncCを置換したら済む話じゃね?

457 :デフォルトの名無しさん:2009/09/17(木) 19:59:50
関数の仕様というか引数の順番も変更になってるっぽいからダメそう。

カッコのネストの深さを限定すればあるいは。

458 :デフォルトの名無しさん:2009/09/17(木) 20:26:50
>>455
ネスト数を限定すれば書けるが汚くなるのは言うまでもない。

459 :デフォルトの名無しさん:2009/09/18(金) 09:51:28
perlの正規表現の(?PARNO)みたいに再帰を書けるように
拡張されたのを使えばなんとかなるけどあれを正規表現と
呼んでいいのか激しく疑問w

さらに全く正規表現じゃなくなるが頭に

#define FuncA(x,y,z) FuncD(z,x,y)

を追加してcppに食わせれば一発なんだけどね。

% cat hoge
#define FuncA(x,y,z) FuncC(z,x,y)

1 FuncA(1,2,3)
2 FuncA(1,FuncB(2,3),4)
3 FuncA(1,"string2,3",4)
4 FuncA(1,2,3):FuncD(1,2,3)
% cpp hoge
# 1 "hoge"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "hoge"


1 FuncC(3,1,2)
2 FuncC(4,1,FuncB(2,3))
3 FuncC(4,1,"string2,3")
4 FuncC(3,1,2):FuncD(1,2,3)

460 :デフォルトの名無しさん:2009/09/18(金) 13:14:55
スルーされにくい質問のテンプレと例

●正規表現の使用環境
5.10.0

●検索か置換か?
置換

●説明
先頭の<と行末の>を削除したい

●対象データ
<XXXXXX>
XXXXXX>
<XXXXXX

●希望する結果
XXXXXX


461 :デフォルトの名無しさん:2009/09/18(金) 13:16:46
スルー力を試されているのか?

462 :デフォルトの名無しさん:2009/09/18(金) 13:24:16
>461
な、なぜだ…このテンプレつかてるのに。
あ。パールです…

463 :デフォルトの名無しさん:2009/09/18(金) 13:31:32
> ●正規表現の使用環境
> 5.10.0

言いたいことはわからんでもないが。

464 :デフォルトの名無しさん:2009/09/18(金) 13:34:45
>463
Linux 2.6.30.5-43.local.fc11.i686.PAE #1 SMP Wed Sep 16
16:46:32 JST 2009 i686 i686 i386 GNU/Linux

あら勘違いしたかな?これでだいじょぶですか?

465 :デフォルトの名無しさん:2009/09/18(金) 13:39:08
>>460
しむらー、一行目

/^<?(.*?)>?$/
Perlでは実行確認してないけど多分大丈夫だろ

466 :デフォルトの名無しさん:2009/09/18(金) 13:43:34
>465
うわーありがとう。
もーちょっとだったのに汗
助かりました。

467 :455:2009/09/18(金) 14:49:49
簡単には出来なそうなんですね。わかりました。
対になる()や[]の一致書式の方はありますか?
これが出来れば結構いろいろ応用がききそうなんですが。


468 :デフォルトの名無しさん:2009/09/18(金) 15:32:46
厳密な意味での正規表現では無理なことの代表的なものが、括弧の対応。
最近の拡張ではできるものもあるけど、やりかたがそれぞれなので、
一般的に説明できない。

つーかその例のようなのは>>459の言うようにcpp使うのが楽だな。

469 :デフォルトの名無しさん:2009/09/18(金) 18:48:14
「正規」表現って言い方ってどうよ?

正規分布 normal distribution
正規表現 regular expression


470 :デフォルトの名無しさん:2009/09/18(金) 19:22:31
別に?

混乱するからどうしてもと言うなら
統計学のnormalを「標準」とでも脳内変換しとけ

471 :デフォルトの名無しさん:2009/09/18(金) 20:03:18
>>469
何が問題なの?
異なる言語で単語が一対一に写像するなんてことは有り得ないんで、
その程度の不整合でいちいち悩んでると人生辛くなるよ。

472 :455:2009/09/18(金) 22:35:18
括弧処理には向いていないのでしたか。
それがわかっただけでも満足です。ありがとう。

473 :デフォルトの名無しさん:2009/09/18(金) 23:05:45
>>181
これ読んでみたけど本当に良い本だった。世界的に認められてるだけのことはある。
数学丸出しなのでかなり難しい内容だけど、オライリーのフクロウ本を一通り読んで
DFAとNFAの違いを知りたいというモチベーションがあれば読み進められるかも。

474 :デフォルトの名無しさん:2009/09/18(金) 23:16:09
/ヽ(´ー`)人(´∇`)人(`Д´)ノ/

475 :デフォルトの名無しさん:2009/09/20(日) 20:12:29
カッコの対応を見つけるのって無理なのか・・・。意外だった。

476 :デフォルトの名無しさん:2009/09/24(木) 21:36:59
C#の正規表現で悩んでいます。
お時間あればよろしくおねがいします

●正規表現の使用環境
.NET Framework 3.5
●検索か置換か?
置き換え
●説明
()の文字を取り除きたい
●対象データ
W(ジョーカー)
W(ルナ)
●希望する結果
W
W

string Title = "W(ジョーカー)";
string nobrackets = "<title>(.*)";
Regex re = new Regex(nobrackets);
Match m = re.Match(Title);
Title = m.Groups["title"].Value;

で、nullなんです。アドバイス乞う…。


477 :デフォルトの名無しさん:2009/09/24(木) 22:15:26
(1)あんまり弄らなかった方
string Title = "W(ジョーカー)";
string nobrackets = @"(?<title>W)\(.*\)";
Regex re = new Regex(nobrackets);
Match m = re.Match(Title);
Title = m.Groups["title"].Value;

(2)ちょっと弄ってみた方
string Title = "W(ジョーカー)";
string nobrackets = @"\(.*\)";
Regex re = new Regex(nobrackets);
Title = re.Replace(Title, "");

>>476
何がしたいのかをもうちょっと良く考えてみるといい

478 :デフォルトの名無しさん:2009/09/24(木) 22:15:26
本当に取り除くだけでいいのなら、こんな感じ?
Title = Regex.Replace(Title, @"\(.*?\)", "");

479 :デフォルトの名無しさん:2009/09/24(木) 22:52:03
thanks!

480 :デフォルトの名無しさん:2009/09/25(金) 11:17:01
C#の正規表現で質問です。
●正規表現の使用環境
.NET Framework 3.5
●検索か置換か?
置き換え
●説明
ホームページのすべてのタグを取り除きたい
●対象データ
http://www.asahi.com/shopping/pc_camera/special/TKY200909240072.html
●希望する結果
プレーンテキスト
●現状
');
document.write('');
//-->
などいくつかのタグが残る状況です。
●いま書いている正規表現
Regex regex = new Regex("<.*?>", RegexOptions.Singleline);
html = regexRemoveAllTag.Replace(html,"");


481 :デフォルトの名無しさん:2009/09/25(金) 11:35:31
>>480
「いま書いている正規表現」の処理の前段で <script>...</script> を削除すると良いと思われ。

482 :デフォルトの名無しさん:2009/09/25(金) 12:14:56
早速ありがとうございます。
html = Regex.Replace(html, "<script>.*</script>", "");
Regex regex = new Regex("<.*?>", RegexOptions.Singleline);
html = regexRemoveAllTag.Replace(html,"");
としてみましたが、状況に変化なしです。


483 :デフォルトの名無しさん:2009/09/25(金) 12:56:40
えーと、前段の方は <script.*[^>]>.*?</script> みたいな感じで Multiline で。

484 :デフォルトの名無しさん:2009/09/25(金) 13:02:57
>>480
何でそうなるかの原因を考えよう。
想定と違う動きをした箇所を比較してみるといい。
document.write('ipt>');
といった、JavaScript内で閉じタグを記述してる箇所に正規表現がひっかかって');が残る。
だから481は<script type= .... </script>を先に除去すればいい、って言ってるのでしょう。

485 :デフォルトの名無しさん:2009/09/25(金) 13:44:24
> html = Regex.Replace(html, "<script>.*</script>", "");
なんでこっちだけRegex.Replaceなんだ?

たぶん、これでいいんじゃないかな
Regex regex1 = new Regex("<script>.*?</script>", RegexOptions.Singleline);
Regex regex2 = new Regex("<noscript>.*?</script>", RegexOptions.Singleline);
Regex regex3 = new Regex("<.*?>", RegexOptions.Singleline);
html = regex1.Replace(html,"");
html = regex2.Replace(html,"");
html = regex3.Replace(html,"");

486 :デフォルトの名無しさん:2009/09/25(金) 18:34:41
みなさん、ありがとうございます。
>>485
これがいちばんいけそうです。
http://www.asahi.com/showbiz/stage/spotlight/OSK200909250086.html
をやってみたら、まだ下のほうにだいぶタグが残るのですが…。

>>484
考えながらやってみてはいるのですが、のこったタグの原因はほとんど判読不明…。
たとえば、
impAserver = "http://imp.asahi.com";
が残るのですが…。

>>483
実際に試したところ、multilineよりはsinglelineのほうが、タグを除去できる率は高いようです。


487 :484:2009/09/25(金) 19:22:18
>>486
ほんとに考えてるのかなあ……。
<script>だと<script type="text/.... って書いてあるのに引っかからないわけですよ。

var wc = new WebClient() { Encoding = Encoding.GetEncoding("EUC-JP") };
var html = wc.DownloadString("http://www.asahi.com/showbiz/stage/spotlight/OSK200909250086.html ");
var result = Regex.Replace(html, "<script.*?</script>", "",RegexOptions.Singleline);
result = Regex.Replace(result, "<.*?>", "", RegexOptions.Singleline);
Console.WriteLine(result);

488 :デフォルトの名無しさん:2009/09/26(土) 02:10:55
考えてない、考えてない・・・
他人の書いたのをコピーしてるだけ。

489 :483:2009/09/26(土) 02:30:20
>>486
> 実際に試したところ、multilineよりはsinglelineのほうが、タグを除去できる率は高いようです。
率とかそんなんじゃなくてさあ、 HTML のソース見て考えてる?
もうめんどくせえなあ。

490 :デフォルトの名無しさん:2009/09/29(火) 00:50:56
>>486
えーと、差分を見る方法を用意してる?
処理前と処理後を比較すれば、どこが除去されたのか
すぐ分かるはずなんだけど。

windiffとかWinMergeでも使え。

491 :デフォルトの名無しさん:2009/10/01(木) 07:09:09
わかりました

492 :デフォルトの名無しさん:2009/10/01(木) 07:11:38
HTMLのサニタイゼーションに正規表現を使うなと……

493 :デフォルトの名無しさん:2009/10/01(木) 13:32:47
先頭の改行(LF)を削除するにはどうすればいいのでしょうか?
$text =~ s/^\n//s; では削除されませんでした。

494 :493:2009/10/01(木) 13:38:11
あ、されてました。
2つ改行がありました。

2つの改行を削除するには、/^\n\n//では削除されませんでした。

495 :493:2009/10/01(木) 13:42:36
あれ?
これは改行じゃないのかもしれない。
なんかあります。
$textの先頭に改行される何かがあります。
CRLF、CR、LFのいずれもないのに、改行される何かがあるんです。

496 :デフォルトの名無しさん:2009/10/01(木) 13:46:00
BOMか?

497 :493:2009/10/01(木) 13:56:53
>>496
BOMじゃないですが、UTF-8です。

498 :デフォルトの名無しさん:2009/10/01(木) 14:02:12
コード16進で表示すると何が出る?

499 :493:2009/10/01(木) 14:03:40
/^\n//をやった直後に/^.//で最初の得体も知れない改行を削除しますと、◆の中に?がある文字が2つ出ました。
しかも、次の文字が消滅しました。

500 :493:2009/10/01(木) 14:06:35
>>498
16進数での開き方を調べます。

501 :デフォルトの名無しさん:2009/10/01(木) 14:08:20
楽しそうだな。これを機会にコンピュータ上で文字はどのように
表現されているのか勉強するといいと思うよ。

502 :493:2009/10/01(木) 14:16:26
バイナリエディタで開いてみました。
その不気味な改行の部分は、EF BB BF 0D 0A E3でした。
この正体は何なのでしょうか?

>>501
勉強がんばってみます。

503 :493:2009/10/01(木) 14:23:57
EF BB BFってどうやらBOMですね。
何とかしてみます。

504 :493:2009/10/01(木) 14:26:08
でも出力されたテキストをメモ帳で保存したからBOMが付いたのかも知れませんね。
よく分かりませんね。

505 :493:2009/10/01(木) 14:39:43
すみません。
全てはポックンのミスでした。
改行コード消した後に、改行コード付加してました。
BOMとか関係ありませんでした。
BOMはメモ帳で開いたから付加されただけでした。
0D 0AはCRLFの改行コードでした。
本当にありがとうございました。

506 :デフォルトの名無しさん:2009/10/02(金) 13:21:12
>>455
勉強がてら、ActivePerl 5.8.8で作ってみた。
色々調べて、いい勉強になった。

my $re1 = qr/(?:[^(),]+|"(?>(?:(?>[^"\\]+)|\\.)*)")*/;
our $re2 = qr/\w+\((?:(??{$re1}),?|(??{$::re2}))*\)/;

my @s = qw{
FuncA(1,2,3)
FuncA(1,FuncB(2,3),4)
FuncA(1,"string2,3",4)
FuncA(1,2,3):FuncD(1,2,3)
FuncA(1,FuncB(2,FuncC(3,"4),(5"),"\","),6)
};

for (@s) {
print "$_\n";
s/FuncA\(($re1|$re2),($re1|$re2),($re1|$re2)\)/FuncC($3,$1,$2)/;
print "$_\n\n";
}

507 :デフォルトの名無しさん:2009/10/11(日) 23:48:11
VB.NETの正規表現で質問です。
●正規表現の使用環境
.NET Framework 3.5
●検索か置換か?
置き換え
●説明
2行以上の連続した空の行(全角、半角スペースのみの行、または改行のみの行)を2行にしたい。
(1行の空の行は1行のまま、2行の空の行は2行のまま)
●対象データ
AAA

BBB



CCC
●希望する結果
AAA

BBB


CCC
●現状

●いま書いている正規表現
Dim r As Regex = New Regex("<.*?>", RegexOptions.Multiline)

よろしくお願いします。

508 :デフォルトの名無しさん:2009/10/12(月) 02:31:35
その「いま書いている正規表現」ってのは何を思って書いたの

509 :デフォルトの名無しさん:2009/10/12(月) 12:20:24
<.*?>  
・・・これは・・・。

510 :デフォルトの名無しさん:2009/10/12(月) 12:28:14
"3行以上"の"空白行"を最長一致させて、それを2行の空白行に置換すれば良いんじゃない?
今確認出来る環境じゃないんで、適当に書くけども。

([  ]*/n){3}  →  /n/n  に置換。

こんなイメージでどう?スペース入ってるけど、投稿すると消えるとおもう。

511 :デフォルトの名無しさん:2009/10/12(月) 14:32:25
\n\n\n\nが\n\n\nにならないか?つーかスラッシュ?

((\s| )*\n){2,}

512 :デフォルトの名無しさん:2009/10/12(月) 14:51:11
4から3にはならん
半分になるだろ

513 :デフォルトの名無しさん:2009/10/12(月) 15:01:20
え、globalフラグなくてwhlieループとかなの?

514 :デフォルトの名無しさん:2009/10/12(月) 16:55:11
{3,} なら3以上になるか。

515 :デフォルトの名無しさん:2009/10/12(月) 22:03:19
レスありがとうございます。
([  ]*\n){3,}
((\s| )*\n){3,}

これで出来そうですね。/は自分の環境の場合\に直します。
[ ]と( )の違いも試してみます。
ありがとうございました。

516 :デフォルトの名無しさん:2009/10/14(水) 00:43:45
とんちんかんなのかも知れんが、質問させてくださいな。
.NETの正規表現で"abc"という文字列を一回のreplaseで"b"にする方法はありますか?

517 :デフォルトの名無しさん:2009/10/14(水) 01:28:02
>>516
>>4
つーか例は数個出してくれ
一個だけだと「/abc/を"b"に置換すればいい」とか言われても文句言えないぞ

518 :デフォルトの名無しさん:2009/10/14(水) 01:37:17
途中から丁寧語になるレスを最近よく見かけるんだが、
流行っているのでしょうか?

519 :デフォルトの名無しさん:2009/10/14(水) 02:02:46
随分語弊があった。すまんね。

環境:
.NET
目的:
置換
説明:
特定の連続しない2つの文字列を取り除く
対象データ:
ACB
ADCB
AECDB
結果:
C
DC
ECD

520 :デフォルトの名無しさん:2009/10/14(水) 02:29:11
説明と例がちぐはぐな件
例に倣って、文頭と文末を一文字ずつ省けばいいのか?
それとも説明に則るとして、特定の文字列がAとBならACBCBはどうなるんだ?

521 :デフォルトの名無しさん:2009/10/14(水) 03:17:30
>>519
AとBをそれぞれ取り除くだけじゃん。
正規表現の必要な話か?

522 :デフォルトの名無しさん:2009/10/14(水) 13:02:14
[0-9]?[0-9]:[0-9][0-9]J(am|pm)

詳説正規表現の3版を読んでいるのですが
時刻にマッチさせる表現の例として、上のような正規表現が
書かれています。

このJというは、なんですか?誤植かと思って、ネットで正誤表を見てみましたが
誤植ではないみたいです。Jでやると、時刻にマッチしません。やっぱり誤植ですか?
何か意味があるのでしょうか?

523 :デフォルトの名無しさん:2009/10/14(水) 14:12:48
誤植だと思う。
オライリーにメールすれ。

524 :デフォルトの名無しさん:2009/10/14(水) 14:43:05
3版の正誤表ってどこにあるの?

525 :デフォルトの名無しさん:2009/10/14(水) 14:47:48
どもです。
2版の正誤表で確認しました。3版の正誤表はないっぽいですね。


526 :デフォルトの名無しさん:2009/10/14(水) 14:49:05
ズコー

527 :デフォルトの名無しさん:2009/10/14(水) 14:58:21
グーグルブックスで、第2版が閲覧出来ました。
問題の箇所を見てみますと、「J」は書かれていないです。
P20の四角でかこわれた解答の部分で
手元の3版では、+SIZEJ*=と書かれています。

>>522で質問した正規表現はP25にかかれていますが
グーグルブックスでは閲覧出来ないページとなっています。

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

528 :デフォルトの名無しさん:2009/10/14(水) 19:25:53
初版は
「[0-9]?[0-9]:[0-9][0-9]●(am|pm)」
こんな表現。
●は、60%網点の丸。

529 :デフォルトの名無しさん:2009/10/14(水) 21:11:01
「●は、60%網点の丸」は、確かふくろう本では空白を見やすくするための記法でしたね。

530 :デフォルトの名無しさん:2009/10/23(金) 10:12:47
正規表現をつかって
ある原稿の
文末から10文字を抽出しろ。と課題がでたのですが
どうしたらできるでのしょうか

531 :デフォルトの名無しさん:2009/10/23(金) 10:20:36
課題なら自分で考えろよ

532 :デフォルトの名無しさん:2009/10/23(金) 10:21:54
文末に密着した任意の文字10個の正規表現でマッチさせればできるだろ
宿題は自分でやれ

533 :デフォルトの名無しさん:2009/10/23(金) 10:26:17
文末が文章の終わりなのか、文の終わりなのか分からないが……

.{10}$

534 :デフォルトの名無しさん:2009/10/23(金) 11:01:52
ワードの文章の文末表現を10文字程度抽出して分類せよ、という問題でした。


申し訳ないのですが本当によくわからないので、
検索する文字列、置換後文字列それぞれにどう入力したらいいのか教えてくれませんか。

535 :デフォルトの名無しさん:2009/10/23(金) 11:22:26
ワードwww

あれ正規表現じゃなかったような
ヘルプ見るかぐぐれ、それでもわからないならあきらめろマジで

536 :デフォルトの名無しさん:2009/10/23(金) 11:35:34
いやだからさ
課題ってのは自分で考えてやらないと意味ないでしょ?
ここで答え教えて貰ってそれ提出すればそれでいいと思ってるの?

537 :デフォルトの名無しさん:2009/10/23(金) 12:02:34
「オプション」「ワイルドカードを使用する」
「??????????。」

538 :デフォルトの名無しさん:2009/10/23(金) 12:05:07
>>537
>>536みたいな文章の文末が判定できませんやりなおし

539 :デフォルトの名無しさん:2009/10/23(金) 12:14:36
??????????[。??]

540 :デフォルトの名無しさん:2009/10/23(金) 12:38:32
ワードの文章、抽出して分類…ワードのスレで聞いたら?

541 :デフォルトの名無しさん:2009/10/23(金) 12:50:48
甘やかすな
課題は自分で考えさせるべきだ

542 :デフォルトの名無しさん:2009/10/23(金) 13:23:10
抽出するなら、VBAの知識が必要かもな

543 :デフォルトの名無しさん:2009/10/24(土) 08:54:18
VBSのregexpを呼び出して使う感じかなぁ。

544 :デフォルトの名無しさん:2009/10/26(月) 11:37:03
特定の1文字をグループで取り出し、その1文字を後方参照で否定で使いたいのですが、
うまくいきません。つまり[^\1]がうまく動作しません(構文エラーにはならないのですが)。
おそらく\1は1文字でなく文字列なので文字クラスの中で使えないのだと思いますが、
では\1を否定で使うにはどうしたらいいですか。(!\1)なんてありませんよね。

545 :デフォルトの名無しさん:2009/10/26(月) 12:48:08
>>544
>>1

まず処理系を明示しろ

546 :デフォルトの名無しさん:2009/10/26(月) 12:48:50
ものによるけど否定先読みでどうにかならん?

547 :デフォルトの名無しさん:2009/10/26(月) 13:00:29
perlなら

/(.)(?!\1)./

でいけたよ。

548 :デフォルトの名無しさん:2009/10/27(火) 00:09:38
●正規表現の使用環境
VB.NET

●検索か置換か?
検索

●説明
htmlタグの外にある文字を取得したい

●対象データ
<hoge hoge hoge hoge>
<hoge>
<hoge>
<hoge hoge hoge>
あいうえお
<hoge hoge>
<hoge hoge hoge hoge hoge>

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

対象のデータの中にはタグの外の文字列は1箇所(1行)しかありません。
何行目にあるかは不明です。

お願い致します。


549 :デフォルトの名無しさん:2009/10/27(火) 01:24:47
>>548
説明からするとサンプルのようにきれいに揃っていそうだし
"<"で始まらない行を抽出(もしくは始まる行を削除)で十分かもしれない

VB.netは知らないから具体例はパス

550 :544:2009/10/27(火) 02:03:55
すみません。処理系はC#です。
否定先読みという機能を勉強したところ、C#の正規表現にも先読みは
あったので、これで実現することができました。ご教授有難うございました

551 :デフォルトの名無しさん:2009/11/01(日) 11:23:38
javascript

抽出

1回では難しそうなので2回に分けてやっているのですが
str=str.match(処理1)
str=str.match(処理2)
とやるとうまくいきません
下がないと処理1はできます
このやり方では何か問題があるのでしょうか?



552 :551:2009/11/01(日) 15:39:34
一応自己解決しました
過去のスクリプトを見直していたところ
matchで検索してからsubstringで抜き出していて
試したところうまくいきました
どうも失礼しました



553 :デフォルトの名無しさん:2009/11/03(火) 13:13:35
おめでとう

554 :デフォルトの名無しさん:2009/11/06(金) 01:43:16
●正規表現の使用環境
秀丸

●検索か置換か?
置換

●説明
文字列Higを含むが、Highでない文字列を置換

●対象データ
Hig123
HigABC
HighScore

●希望する結果
Hig123
^^^
HigABC
^^^
HighScore


お願いします。

555 :デフォルトの名無しさん:2009/11/06(金) 01:52:43
マッチ部分はHigだけでいいの?
Hig(?!h)

556 :デフォルトの名無しさん:2009/11/06(金) 02:09:08
できました、ありがとうございます。

理解できないところがあるので、迷惑でなければ教えてください。

?の効果は、直前のパターンが0回または1回です。
しかし、直前の文字は記号なのでエラーになるように見えます。
現に*や+ではエラーになります。
?はどんな動作をしているのでしょうか?

557 :デフォルトの名無しさん:2009/11/06(金) 02:22:40
>>555のこと?
(?!pettern)は否定先読みという構文で、その?とは異なる意味

558 :デフォルトの名無しさん:2009/11/06(金) 02:27:13
555のこと言ってるんなら?じゃなくて
(?!expression) 後方不一致指定でしょ

559 :デフォルトの名無しさん:2009/11/06(金) 02:29:26
理解できました。
ありがとうございます。

560 :デフォルトの名無しさん:2009/11/08(日) 23:04:00
PHP5で文字コードはEUCです。
全角半角が混ざった文字列の中から、@******という部分を取り出したいと思っています。
・@の前にはどんな文字があってもいい
・******は半角英数とアンダーバー(_)が使える
・******の後ろにスペースか全角文字かアットマーク(@)が付いたら終わり
という条件で取り出したいのですが、うまくいきません。
@\w+[^ ][\x01-\x7E]
では無理でした。
どのような式を書けばいいのでしょうか?

561 :560:2009/11/08(日) 23:10:48
具体的には、

こんにちは@Abc_123@Def_456 今日はいい天気

を、

こんにちは[hoge][hoge]今日はいい天気

に置換したいって事です

562 :デフォルトの名無しさん:2009/11/09(月) 01:21:51
>>560
@[_\w]+
でいいんじゃない?


563 :デフォルトの名無しさん:2009/11/09(月) 02:50:08
>>562
\w には _ も含まれてるとおも。

564 :560:2009/11/09(月) 17:24:29
>>562
>>563
ありがとうございます。@[\w]+で出来ました。
まだまだ正規表現は初心者ですが、流石にこれが出来ないのは情けない・・・・・・・

565 :デフォルトの名無しさん:2009/11/09(月) 17:26:42
@\w+

でおk

566 :デフォルトの名無しさん:2009/11/11(水) 23:08:14
●正規表現の使用環境
VB.NET
●検索か置換か?
検索
●説明
拡張子をtxt,jpg,gifなど複数の種類を指定してURLを検索したい
●対象データ
http:****/****/****/12345.jpg
http:****/****/****/12345.exe
http:****/****/****/12345.gif
http:****/****/****/12345.txt
http:****/****/****/12345.bmp
●希望する結果
http:****/****/****/12345.jpg
http:****/****/****/12345.gif
http:****/****/****/12345.txt
現在
http://[\w\d/%#$&?()~_.=+-]+\.jpg
jpgの場合は上記のように書いてありますが、別の拡張子を追加していくにはどうやって書けばよいでしょうか?
http://[\w\d/%#$&?()~_.=+-]+\.jpg|gif
だと、
http:****/****/****/12345.jpg と
g
にヒットするのですが、[jpg|gif] [(jpg)|(gif)]やURLの部分をカッコで囲んだりしてみましたがだめみたいです。
http://[\w\d/%#$&?()~_.=+-]+\.jpg|http://[\w\d/%#$&?()~_.=+-]+\.gif ・・・・・・・
と書けば良いのですが、長くなってしまいます。
拡張子だけを書き足す方法があれば教えていただけないでしょうか。


567 :デフォルトの名無しさん:2009/11/11(水) 23:17:11
\.(jpg|gif)

568 :デフォルトの名無しさん:2009/11/11(水) 23:24:08
できましたー
ありがとう。
でもこれ試した気がしたんだが・・・

569 :デフォルトの名無しさん:2009/11/12(木) 07:24:52
性器表現

570 :デフォルトの名無しさん:2009/11/12(木) 22:18:10
$hoge = "0123456789ABCDEF012";
$hoge =~ s/.*?([0-9A-F]{16}).*?/$1/i;
print $hoge;

とにかく16進ぽい文字列を16文字で切り出したいので
上みたいに書いたんだけど、切り出せません。
どこが間違ってるかわからないので助けて

571 :デフォルトの名無しさん:2009/11/12(木) 22:42:35
$hoge = "0123456789ABCDEF012";
$hoge =~ /([[:xdigit:]]{16})/;
print $1, "\n";

572 :デフォルトの名無しさん:2009/11/12(木) 22:43:43
$hoge = "0123456789ABCDEF012";
$hoge =~ s/.*?([0-9A-F]{16}).*?//i;
print $hoge;
print $1;
としてみりゃ原因わかるんじゃね?

?外して文頭文末明示すればおk

573 :デフォルトの名無しさん:2009/11/14(土) 17:16:59
「秀丸エディタ」の正規表現の置換がうまくいきません。

作業内容は、
(1)Excelで作成した表を、タブ区切りのテキストデータとして保存し、
(2)「秀丸エディタ」でそのテキストデータを開き、
^(先頭文字)⇒¥t¥t¥t
に全置換しようとしました。

もともとテキストデータであったファイルを置換するときはうまくいきますが、
Excelからエクスポートしたテキストデータは、先頭行を認識してくれないのでしょうか。
どうすれば、先頭行を置換できるでしょうか。

よろしくお願いいたします。

574 :デフォルトの名無しさん:2009/11/15(日) 01:24:50
先頭文字なのか
先頭行なのか
どっちかハッキリしろ


575 :デフォルトの名無しさん:2009/11/15(日) 10:10:28
>>574
先頭文字です。
Excelからエクスポートしたテキストに対して^がないと言われてしまうんです。

576 :デフォルトの名無しさん:2009/11/15(日) 11:33:20
マルチラインの問題とみた。
マルチライン有効になってる?

577 :デフォルトの名無しさん:2009/11/16(月) 00:48:19
>>576
ありがとうございます。
マルチラインの設定は秀丸側の設定ですか?
それともExcelでしょうか?
初心者ですみません。
早く秀丸を使いこなさないと、ソース書くときに便利なのにもったいないですね。

578 :デフォルトの名無しさん:2009/11/16(月) 12:20:02
>>577
そんなのどんな初心者でも人間なんだから
「マルチライン 秀丸」と「マルチライン Excel」で検索かけたり、設定見れば大体予想は付くと思うが、
少しは自分の手、動かした方がいいぞ、反感買うから

579 :デフォルトの名無しさん:2009/11/16(月) 12:27:26
パソコン買ったら最初に覚えること。
それは
     検索
だ!

580 :デフォルトの名無しさん:2009/11/16(月) 12:28:49
まさか、「□正規表現(R)」 をチェックしてないとかいうオチじゃないだろうな

581 :デフォルトの名無しさん:2009/11/19(木) 07:06:23
>>577です。
皆さんありがとうございます。
マルチライン、秀丸、excel、テキストなどで検索したのですが、
どこでマルチラインの有効無効をセットできるのか分かりません。
エクセルの各々のセルは、セル内改行を認めていません。
教えていただけないでしょうか。
よろしくお願いいたします。


582 :デフォルトの名無しさん:2009/11/19(木) 07:43:49
>>575
> Excelからエクスポートしたテキストに対して^がないと言われてしまうんです。

>>580は?

583 :デフォルトの名無しさん:2009/11/19(木) 07:45:52
念のために書いておくと
置換の時に出てくるダイアログに>>580のチェックボックスがある

584 :デフォルトの名無しさん:2009/11/19(木) 09:31:15
任意の1文字(なくてもOK)ってのはどうやるの?
「.*」だと文字数制限ないし...

585 :デフォルトの名無しさん:2009/11/19(木) 09:43:31
一般的には(|.)かな。perl互換なら.?

586 :デフォルトの名無しさん:2009/11/19(木) 09:47:17
.+

587 :デフォルトの名無しさん:2009/11/19(木) 10:06:15
改行と空白(全角&半角)以外すべての文字って一気には表現できない?

588 :デフォルトの名無しさん:2009/11/19(木) 10:42:56
[^\n\s]+
改行またはホワイトスペース(半角スペースとTAB含む)以外の1文字
(改行もホワイトスペースだから複数行対象のときは\n不要かもね)

[^\n\s ]+
全角スペースは文字コードにもよると思うので処理系依存かな

589 :デフォルトの名無しさん:2009/11/19(木) 18:44:49
>>584

.?

590 :デフォルトの名無しさん:2009/11/20(金) 01:22:54
>>587
なんで >>1 を読まないかな?

591 :デフォルトの名無しさん:2009/11/21(土) 08:57:37
>>583
そこはチェックを入れています。
別のcsvで試したら、1行目のタイトル行だけ先頭行を認識し、2行目からのデータ行の先頭行は認識しませんでした
(T_T)。

592 :デフォルトの名無しさん:2009/11/21(土) 09:31:53
だから、マルチラインがtrueになってないんだろ。

593 :デフォルトの名無しさん:2009/11/21(土) 09:37:18
どうもやりたいことがよくわからんな

594 :デフォルトの名無しさん:2009/11/21(土) 09:55:04
困ってるという割にのんびりしてるな

そういう独自の用語じゃなくて
どういうデータをどうしたいのか具体的に書いて
秀丸スレでもう一度聞いたほうがマシな気がする

595 :デフォルトの名無しさん:2009/11/21(土) 10:51:27
マルチラインが無効になってりゃ、改行記号が無視されるんだから、
先頭以外の改行は改行とみなされないんだよ。

だから2行目以降の先頭は、先頭とみなされていない。
改行記号に続く文字列って事。
改行記号を改行記号として認識させるのがマルチライン。

マルチライン問題じゃなかったらお手上げ。

596 :デフォルトの名無しさん:2009/11/21(土) 11:08:48
せめて >4のテンプレ埋めるくらいはしてくれんと。
Excel、秀丸共に現役バージョンが混在してるソフトなんだし
環境晒しもせず、できませんできません言われてもどうしようもない

WinXPSP3 / Excel 2002(Office XP) SP3 / 秀丸8β25 (HMJRE V2.06)
とりあえず↑の環境では
・Excelコピー→秀丸へペースト
・名前を付けて保存:テキスト(タブ区切り)→秀丸で開く
のどちらでも問題なくできたよ。

597 :デフォルトの名無しさん:2009/11/21(土) 12:28:52
マルチライン、マルチラインって言ってるヤツ、バカじゃねぇの?

598 :デフォルトの名無しさん:2009/11/21(土) 14:49:56
●正規表現の使用環境
Java1.6

●検索か置換か?
検索

●説明
雑多な文字列からスラッシュで終わるURLを抽出したい

●対象データ
今日はhttp://abcd.efgh/abc/でご飯を食べました
そしたらhttp://12345/abc/index.htmlなスープが出てきてビックリ
おまけにhttp://aiueo/test/xxx.imgこんなデザートまで

●希望する結果
http://abcd.efgh/abc/


599 :598:2009/11/21(土) 15:27:20
●パターン
(http://|https://){1}[\w\_\.\-/:\#\?\=\&\;\%\~\+]+/[^A-Za-z0-9\_\.\-/:\#\?\=\&\;\%\~]

●結果
http://abcd.efgh/abc/


最後に一文字付いてしまいます
どうやって付かないようにすれば良いでしょうか

600 :デフォルトの名無しさん:2009/11/21(土) 17:14:20
否定の先読み使え

601 :デフォルトの名無しさん:2009/11/24(火) 03:17:06
2 文字目以降にマッチする正規表現はどのように記述したら良いですか?
例えば "abcXdXefgXXhij" という文字列の、2番目以降全ての "X" にマッチするようなものです。
基本的そうなのですが、ちっとも思いつきませんでした。

602 :デフォルトの名無しさん:2009/11/24(火) 09:13:58
2文字目以降ってのが何を指してるのかわからんな。
その例だとどれにマッチすればいいんだ?

603 :601:2009/11/24(火) 09:43:31
>>602

すいません、いろいろ書き忘れてました。
こんな感じです。

- 使用環境: AutoHotkey 1.0.48
- 使用法: 検索
- 説明: 下記にある文字 X を、最初だけ残して残りを Y に置換したい

"abcXdXefgXXhij" -> "abcXdYefgYYhij"


604 :デフォルトの名無しさん:2009/11/24(火) 09:55:19
AutoHotKeyならRegExReplaceで開始位置を指定できるので、
最初のXの次の文字からにすりゃいいんじゃねーの?

605 :601:2009/11/24(火) 10:14:23
>>604
そうでした、ありがとうございます。
こんな感じでできました。

RegExReplace(str, "X", "Y", temp, -1, InStr(str, "X") + 1)

606 :デフォルトの名無しさん:2009/11/24(火) 19:44:10
IPv6かどうかを調べる正規表現ってどこかにサンプルある?

607 :デフォルトの名無しさん:2009/11/24(火) 21:06:46
IPv6 regex でググってみるとか

608 :デフォルトの名無しさん:2009/11/26(木) 00:47:05
IPv6 アドレスの形式チェックを正規表現でやる香具師は池沼。
getaddrinfo(3) を使え。

ってうちのじっちゃんが言ってた。

609 :デフォルトの名無しさん:2009/11/26(木) 08:59:16
>>608
inet_ptonだろ

610 :606:2009/11/26(木) 09:39:14
>>608
JavaScriptとか使って入力段階で一旦弾きたいんですだよ。
サーバ側ではinet_ptonなりなんなり別の手段で再チェックするけど。

611 :デフォルトの名無しさん:2009/11/26(木) 09:47:28
>>610
はやくぐぐれよ

http://www.google.co.jp/codesearch?q=IPv6+regex

612 :デフォルトの名無しさん:2009/11/26(木) 10:42:06
>>608
いのなかのかわず

613 :デフォルトの名無しさん:2009/11/26(木) 13:47:57
鬼車でひいひい言わせてやるよ

614 :デフォルトの名無しさん:2009/11/26(木) 23:51:33
>>609
inet_pton(3) のことは綺麗さっぱり忘れろ。

ってうちの itojun が言ってた。

615 :デフォルトの名無しさん:2009/11/27(金) 11:50:16
●正規表現の使用環境
perl5

●検索か置換か?
検索

●説明
クォーテーションに囲まれた(省略可)の文字列を取得したい。

●対象データ
"aaa":'bbb':`ccc`:ddd:eee:666:777:888:999:000:111

●希望する結果
$1:aaa
$2:bbb
$3:ccc
$4:ddd
$5:eee
$6:666
$7:777
$8:888
$9:999
$10:000
$11:111

(["'`]*)([^\1]*)\1):(["'`]*)([^\2]*)\2):(["'`]*)([^\2]*)\2)の形式で、
後方参照が一桁の時はうまく行くんですが、二桁になると不具合がおきます。

(["'`]*)([^\10]*)\10)
\10の下一桁に該当する文字(0)があるとマッチしません。
原因は[^\10]の部分が「\10以外」ではなく「\1と0以外」と解釈される為では
ないかと思いますが、回避する記述方法はありますか?。

616 :デフォルトの名無しさん:2009/11/27(金) 12:02:52
失礼しました。

(["'`]?)([^\1]*)\1:(["'`]?)([^\3]*)\3:(["'`]?)([^\5]*)\5
(["'`]?)([^\11]*)\11)

$2:aaa
$4:bbb
$6:ccc
$8:ddd
$10:eee
$12:666
$14:777
$16:888
$18:999
$20:000
$22:111

でしたm(__)m。

617 :デフォルトの名無しさん:2009/11/27(金) 13:26:38
そもそも文字クラス中で\1とかは使えない罠。
[^\1]は文字コードが1の文字以外に解釈されて
いると思われる。

print "match1\n" if 'aa' =~ /(.)[^\1]/;
print "match2\n" if "a\001" =~ /(.)[^\1]/;
print "match3\n" if 'ab' =~ /(.)[^\1]/;

618 :デフォルトの名無しさん:2009/11/27(金) 13:49:45
1と3だけマッチしますね。「(後方参照としての)\1と0以外」と
解釈される為でも無いということですね。

確かに下一桁が該当する場合に必ず一致しないということでも
なかったので、原因がわからず苦しんでました。ありがとうございます。

^を使用して簡潔に「(二桁で指定する)後方参照の文字を含まない
文字列」は表現できないものでしょうか。

619 :デフォルトの名無しさん:2009/11/27(金) 14:47:01
クラスの中で使えないということは^で「以外」を
表現することも出来ないということですね…。

perl5なんで(?!regexp) が使えるのかな。



620 :デフォルトの名無しさん:2009/11/27(金) 15:01:37
クォーテーションに使った文字以外と書きたくなるのはわかるが、
正規表現では書きにくいので最小マッチ.*?でいいんじゃね?

621 :デフォルトの名無しさん:2009/11/27(金) 15:16:04
最小マッチだと文字間の区切り記号「:」を含む文字列を指定できないんです。
説明不足でした。

●対象データ
"aaa":bbb:"c:c"

●希望する結果
変数1「aaa」
変数2「bbb」
変数3「c:c」
としてマッチさせたいんですが…。

622 :デフォルトの名無しさん:2009/11/27(金) 23:19:02
/\G(["'`])(.*?)\1(:|$)/

623 :デフォルトの名無しさん:2009/11/28(土) 00:53:45
実現できました。ありがとう御座いましたm(__)m。

文字列数は固定なのと、クォーテーションは
その文字列内で使わなければ省略できる形が
望ましかったので以下の形にして無事動作しました。

/(?:("?|'|`)(.*?)\1):(?:("?|'|`)(.*?)\3):(?:("?|'|`)(.*?)\5)$/

\Gは始めて知りました。奥深くて理解が追いついてませんが、
勉強したいと思います。

初歩的で恥ずかしいのですが、クォーテーション部分の記述って
「"」または「'」または「`」または「入力なし」を表わすものとして

"?|'|` で正しいのでしょうか

それとも ["'`]? とか他に記述法があるのでしょうか。

624 :デフォルトの名無しさん:2009/11/28(土) 01:29:40
訂正 "?|'|`では正常に判定されませんでしたm(__)m。


625 :デフォルトの名無しさん:2009/11/29(日) 13:29:56
"a1a2" =~ /([a-z][0-9])+/
p $1
p $2

これで$1に"a1" $2に"a2"になるようには出来ませんか?
"a1a2" =~ /([a-z][0-9])([a-z][0-9])/
コレなら行くんですが・・・

626 :デフォルトの名無しさん:2009/11/29(日) 13:36:41


627 :デフォルトの名無しさん:2009/11/29(日) 15:03:10
エスパー的にはscan使えでよさげ

628 :デフォルトの名無しさん:2009/11/29(日) 18:56:11
正規表現を学習したいのですが、自分の県には何処に行っても正規表現の本が辞典(リファレンス)以外売っていません
何か段階的に学習出来るお勧めの書物はないでしょうか?


629 :デフォルトの名無しさん:2009/11/29(日) 18:57:28
とりあえずふくろう本

630 :デフォルトの名無しさん:2009/11/29(日) 19:45:57
>>628
629さんも言ってる通り、正規表現の本はオライリーのフクロウしか選択肢が無いかも。

あとはネットで勉強すると良いかも。
パターンを何回自分で作ったかによるところが多いから、
PHPチェッカーで作りつつ勉強して、正規表現パズルで息抜きして。
って感じで、フクロウと併用するといいかも。

631 :デフォルトの名無しさん:2009/11/29(日) 20:07:32
体で覚えるのも一つの方法だな。
オレみたいに頭の弱いヤツなら。
正規表現検索機能つきのテキストエディタで試行錯誤してれば
すぐに覚えられるよ。
unix の ed とか、まるで「正規表現養成ギブス」だもんな。

632 :デフォルトの名無しさん:2009/11/29(日) 20:09:40
>>631
大丈夫、EDは治療できます。安心してください

633 :デフォルトの名無しさん:2009/11/29(日) 20:22:11
パズルとかよりエロデータ整理とか
ダウンロードの方が覚えると思うが。。。


634 :628:2009/11/29(日) 21:36:03
皆さん、ご返答ありがとうございました

635 :デフォルトの名無しさん:2009/11/30(月) 15:26:13
大量のエロデータとかダウンロードとかそんな興味ないわw

636 :デフォルトの名無しさん:2009/11/30(月) 15:37:50
実用的にはふくろうもいいけど、オートマトンや言語理論の勉強して
基礎を理解しておくと数学的に無理なことをやろうとしたりとか無駄に
悩まなくてよくなるのでお勧め。

637 :デフォルトの名無しさん:2009/11/30(月) 16:21:11
実装してみたけど、NFAからDFAへの変換で躓いた俺が通りますよ。

638 :デフォルトの名無しさん:2009/12/02(水) 06:48:07
「^\w+$」 から 「^_+$」 だけ除外して検索したいのですが、下のような記述でよいでしょうか?
自信がないのでお願いします。たぶん Perl です。

^\w*[a-zA-Z0-9]\w*$

639 :デフォルトの名無しさん:2009/12/02(水) 08:20:42
Perlだとしたら違うが、Perlじゃないとしても違う

640 :デフォルトの名無しさん:2009/12/02(水) 09:19:26
>>638
そもそも\wは[a-zA-Z0-9_]じゃないんだが

641 :デフォルトの名無しさん:2009/12/02(水) 11:35:49
>>638-639
○ 1行内に、1文字以上の、空白を含まない英数単語のみ ^[0-9A-Za-z_]+$ であればマッチする、
○ 但しアンダーラインのみ ^_+$ の連続は単語ではない。
正規表現はPerlの機能の一部として含まれる。すなわち、Perlには正規表現の機能が入っている。
正規表現で出来なくてもPerlなら出来る。

642 :デフォルトの名無しさん:2009/12/02(水) 12:35:03
perlです。
$str="aa(bb)cc";
$ptn="aa(bb)cc";
のとき、
$str=~/$ptn/;
みたいな書き方でマッチさせたいんですが括弧が邪魔して無理でした。
$strと$ptnの内容は上記のままで、正規表現でマッチさせるにはどう書けば良いのでしょうか?

643 :デフォルトの名無しさん:2009/12/02(水) 12:40:54
>>642
そういうのはperlのスレで聞けよ。

$quoted_ptn = quotometa($ptn);
$str =~ /$quoted_ptn/

または

$str =~ /\Q$ptn\E/

644 :デフォルトの名無しさん:2009/12/02(水) 12:42:56
ごめんtypoしてるわ。

quotemetaが正解

645 :デフォルトの名無しさん:2009/12/02(水) 12:51:49
>>643
いけました。
どうもすいませんでした。
そして、ありがとうございました。


646 :427:2009/12/03(木) 21:59:36
前方一致(前方参照)について教えてください。

●正規表現の使用環境
秀丸7.11 HMJRE.DLL1.92

●検索か置換か?
検索

●説明
改行(空行)に挟まれたaだけを検索したい

●対象データ


a

a
a


●希望する結果


a ←これだけマッチしてほしい

a
a


647 :デフォルトの名無しさん:2009/12/03(木) 22:00:06
以下を試しましたがダメでした。
(?<=\n\n)a(?=\n\n)
(?<=^$)a(?=\n\n)

バラして試したところ、どうも後方一致で改行は認識してくれるみたいですが、前方一致では改行はダメのようです。
(?<=\n\n)a ←ダメ
(?<=\n)a ←ダメ
a(?=\n\n) ←OK

そこで知りたいのは、
前方一致で改行を使えないのは仕様でそうなっているからでしょうか?そうした記載を見つけることが出来ませんでした。
また改行(空行)に挟まれた文字を検索する方法がありましたらぜひお教えください。

648 :デフォルトの名無しさん:2009/12/03(木) 22:22:43
>>647
前方一致って look-behind のこと指して言ってんの?
それはともかく、秀丸は改行絡みの扱いが弱いから制限事項でない?



649 :デフォルトの名無しさん:2009/12/03(木) 22:33:51
>>646
マッチして欲しいaが空行に挟まれてないじゃん

650 :デフォルトの名無しさん:2009/12/03(木) 23:42:48
秀丸v8β28なら (?#fulllinematch)\n(a)\n\n(?\1) でできるみたい

前方一致は秀丸で使われている独自用語。一般用語では648のとおり。




651 :デフォルトの名無しさん:2009/12/03(木) 23:50:50
"(a b)(c d e)"
こういう文字列を
(a b)と(c d e)に分割する事って出来ませんか? 出来ればrubyでお願いします

652 :650:2009/12/03(木) 23:52:40
おっと間違えた。
(?#fulllinematch)\n\n(a)\n\n(?\1) だ

653 :デフォルトの名無しさん:2009/12/04(金) 00:46:20
r = /(\(+)
([^\(]+)
(\)+)
/x

"(a b)(c d e)" .scan(r).map do |m|
puts m.to_s
end


654 :デフォルトの名無しさん:2009/12/04(金) 00:51:04
ありがとうございます
追加で悪いんですが・・・
"(a b)(c (d e))" もし、こういうネスト構文になった場合
正規表現での分割は無理でしょうか?
(a b)
(c (d e))

655 :デフォルトの名無しさん:2009/12/04(金) 02:39:38
>>654
全ての場合に対応するのは無理

656 :646:2009/12/04(金) 07:03:25
>>650
ありがとうございました。
なんか最新βからfulllinematchなるものが使えるようになったみたいですね。
実にタイムリーでした。
おまけに (?<=\n\n)a を実行すると「前方一致では改行文字は使えません」なメッセージも表示するようになっていました。
で、「前方一致」って秀丸独自だったんですね。以後注意します。


657 :デフォルトの名無しさん:2009/12/04(金) 20:12:15
>>653
を少し改良してみて
p "(a b)(c d e)test".scan(/(\([^\(]*\))/)
こうなったんですが
何故^\(を[]で囲わなきゃいけないんでしょうか?

↓のようにかいても意味は同じだと思うんですが動かないんです。かき方が違うんでしょうか?
p "(a b)(c d e)test".scan(/(\(^\(*\))/)
p "(a b)(c d e)test".scan(/(\(.*\))/)

658 :デフォルトの名無しさん:2009/12/04(金) 20:24:08
正規表現では、[]で囲まれると、他の部分と意味が変わって、
たとえば [^\(] の場合、( 以外の任意の一文字、という意味になる。

659 :デフォルトの名無しさん:2009/12/04(金) 20:34:02
>>658
^この否定は[]の中でしか使えないんですかね
(a b)と(c d e)に分割するには/(\([^\(]*\))/これが最小コードとなるんでしょうか?

あと>>653さんのかいた//x のxの意味もよくわからず消してしまったんですが、xをつけると何が変わるんでしょう?

660 :デフォルトの名無しさん:2009/12/04(金) 21:00:25
>>658
[]の中の(はエスケープいらんだろう。

>>659
オマエはマニュアル読むって頭を持ってないのか?


661 :デフォルトの名無しさん:2009/12/04(金) 21:20:50
>>660
だって、早く簡単にわかるならそのほうがいいじゃないですか。


662 :デフォルトの名無しさん:2009/12/04(金) 23:11:59
うわぁぁぁ

663 :デフォルトの名無しさん:2009/12/04(金) 23:52:52
>>660
//xについての記述はぐぐりにくいので見つけられなかったです

664 :デフォルトの名無しさん:2009/12/05(土) 00:03:30


       | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
       |                    |
       |                    |
       /    ̄ ̄ ̄ ̄      /
       /  ぶち殺すぞ     /
     /              /
     /              /
    /   ____     /
   /             /
 /             /


665 :デフォルトの名無しさん:2009/12/05(土) 00:05:30
確かに調べるのめんどくさいんですが、
2chはいつから喰わず嫌いをはじめたのか、質問したい

次の方どうぞ

666 :デフォルトの名無しさん:2009/12/05(土) 11:36:21
釣りはいいから。獣の数字げっと

667 :デフォルトの名無しさん:2009/12/05(土) 12:02:56
鬼車でひいひいいわせてやるよ

668 :デフォルトの名無しさん:2009/12/11(金) 15:49:19
諸君、進んでおるかね?

669 :デフォルトの名無しさん:2009/12/15(火) 18:46:12
●正規表現の使用環境
otbedit(http://www.hi-ho.ne.jp/a_ogawa/otbedit/index.htm)というエディタです。
(emEditorでは行をまたいだ置換がうまくいかずotbeditに変えました。使えればソフトにはこだわりません)
Perl互換の拡張正規表現が使えるとのことですが、詳しい説明が書いておらずわかりませんでした。

●検索か置換か?
置換

●説明
特定の文字列の間にある空でない文字列の最後に任意の文字列を加えること
(例では@Bと@Aの間にある空でない文字列の最後にaを付け加えたい。できればそれから@Aと@Bは除外したい)
【@B(.|[\r\n])*?@A】で全体から特定の範囲を指定した後で
【[^\n]+$】→【$&a】の置換の繰り返しで可能ではありましたが、数が多いのでできれば一括で置換したいです。

●対象データ

@A
あいうえお
@B
かき

っくけこ
さしす
@A
せそたち
つてと
@B
なにぬね
のは
@A
ひふへほ

670 :デフォルトの名無しさん:2009/12/15(火) 18:49:00
●希望する結果

@A
あいうえお
@Ba
かきa

っくけこa
さしすa
@Aa
せそたち
つてと
@Ba
なにぬねa
のはa
@Aa
ひふへほ




↑できれば@Aや@Bにaをつけたくはありません

671 :デフォルトの名無しさん:2009/12/16(水) 04:39:29
ゼロ幅アサーション

672 :デフォルトの名無しさん:2009/12/21(月) 01:54:38
誰かCで正規表現できるクラス作れよ
BOOST使いづらすぎる

673 :デフォルトの名無しさん:2009/12/21(月) 02:34:55
CじゃなくてC++です

674 :デフォルトの名無しさん:2009/12/21(月) 04:07:23
Boost Regex++じゃ駄目なのか

675 :デフォルトの名無しさん:2009/12/21(月) 14:59:11
Boost使いづらいです・・・

676 :デフォルトの名無しさん:2009/12/21(月) 15:27:52
xpressiveもだめ?

677 :デフォルトの名無しさん:2009/12/21(月) 17:04:49
今出先なので、帰ったら見てみます

678 :デフォルトの名無しさん:2009/12/22(火) 18:28:13
鬼車ってどうなんでしょうか?

679 :デフォルトの名無しさん:2009/12/22(火) 19:27:41
どうって?

680 :デフォルトの名無しさん:2009/12/22(火) 22:41:42
性能?

681 :デフォルトの名無しさん:2009/12/22(火) 23:06:52
鬼車って確か検索機能しかないよね(置換機能が無い)
置換を自力で実装するの面倒なんで代わりにbregonig.dllとか使うんだけど
文字コードsjisしか使えなくて勿体無いあああってなる

682 :デフォルトの名無しさん:2009/12/25(金) 19:56:08
●正規表現の使用環境
perl5.8.7 CentOS 5.3
文字コードはEUCです。

●検索か置換か?
置換

●説明
全銀テレ為替文字対応のため、数字、大文字英字、半角カナ・濁点、一部半角記号記号のみの文字列に
変換したいのです。
可能文字はこちら
ttp://www.kyodocms.jp/qanda/qa18.htm

これら以外の文字を半角スペースに置き換えたいのです。

●対象データ

任意の文字列です。

1.ひらがな→カタカナ変換
2.全角→半角変換
3.英小文字→英大文字変換
4.ァィゥェォッャュョをアイウエオツヤユヨに変換

ここまで出来てて、入力可能文字以外をスペースに置き換えたいんですが、上手くいきません。
どうすればいいでしょうか?


683 :デフォルトの名無しさん:2009/12/25(金) 20:29:25
[^0-9A-Zアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン゛°\\,\.「」\(\)\-\/]


に置換
あってるかどうかは試してないけどこういうこと?

684 :デフォルトの名無しさん:2009/12/25(金) 22:49:43
>>683
レスどうもです。そのとおりです。
>>682の条件を変数$regExpに代入し、

$result = 'パ-カ-ヲ買ツタ01234567';
$result =~ s/$regExp/ /g;

とすると、漢字だった部分が文字化けし、「パ-カ-ヲ ・糟・1234567」となってしまいます。
結果は「パ-カ-ヲ ツタ1234567」にしたいのです。


685 :デフォルトの名無しさん:2009/12/26(土) 00:05:51
未定義領域含んでるんじゃね?
文字の正規表現
http://www.din.or.jp/~ohzaki/perl.htm#Character

686 :デフォルトの名無しさん:2009/12/26(土) 00:26:46
質問があります。
<div id=・・・>←1
   <div id=・・・>
   </div>←2
   <div id=・・・>
   </div>←3
</div>←4
抜き出したいのは1から4全体なんですけど
"<div id=・・・(.+?)</div>
で非欲張り系で抜き出すと1から2までヒットします。
1から4全体を抜き出す方法ていうのはないのでしょうか?
XML形式ならいけるぽいのですが・・・
無理なのでしょうか?



687 :デフォルトの名無しさん:2009/12/26(土) 01:52:00
対応するタグという意味なら田中スペシャルが使えればできる。

688 :デフォルトの名無しさん:2009/12/26(土) 08:16:39
ていうか素直にXMLパーサ使え

689 :デフォルトの名無しさん:2009/12/26(土) 12:19:49
HTMLの処理には正規表現ではなくHTMLパーザを、XMLの処理にはXMLパーザを。

テンプレに入れてもいいレベルのFAQ。


690 :デフォルトの名無しさん:2009/12/27(日) 02:55:21
わかりました。パーサを調べてみます

691 :デフォルトの名無しさん:2009/12/28(月) 18:29:47
文字列を分割するとき、特定の文字で囲われているものは除外するっていう方法ありますか?
phpなんですけど
preg_splitで例えば
A,B,C,'D,E',F

[0]=A
[1]=B
[2]=C
[3]=D,E
[4]=F

上記のように分割できますか?

692 :デフォルトの名無しさん:2009/12/28(月) 18:34:35
普通にCSVのモジュール使えばいいのでは

693 :デフォルトの名無しさん:2009/12/28(月) 19:36:26
>>691
詳説 正規表現 にCSV処理のサンプルあるよ。オヌヌメ

694 :デフォルトの名無しさん:2009/12/30(水) 15:29:52
●正規表現の使用環境
Java1.5(Firefox 3.0.16)

●検索か置換か?
検索

●説明
\.nas(3|5)\d+\.[a-z\-]+\.nttpc.ne.jpという文字列を検索したいです。
※検索対象の文字列自体が正規表現のようになっています。

●対象データ
\.nas(3|5)\d+\.[a-z\-]+\.nttpc.ne.jp

●希望する結果
\.nas(3|5)\d+\.[a-z\-]+\.nttpc.ne.jp
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
※完全一致


自分なりに\を付けたりして試してみたのですが出来ませんでした。
以上、どうかよろしくお願いします。

695 :デフォルトの名無しさん:2009/12/30(水) 17:02:17
文字列定数内の \ 自体を \\ とするエスケープまで含めて
"\\\\\\.nas\\(3\\|5\\)\\\\d\\+\\\\\\.\\[a\\-z\\\\\\-\\]\\+\\\\\\.nttpc\\.ne\\.jp"
となる

696 :デフォルトの名無しさん:2009/12/31(木) 10:01:19
>>695
694です。
どうもありがとうございました。
すごく長い表現になっちゃうんですね。(汗


697 :デフォルトの名無しさん:2009/12/31(木) 15:49:42
こんにちは。
度々すみませんが、よろしくお願いします。

●正規表現の使用環境
Java1.5(Firefox 3.0.16)
●検索か置換か?
検索
●説明
#ipbf\d+souka.saitama.ocn.ne.jp という文字列を検索したいです。
//マッチする
var body = document.body.innerHTML;
var temp1;
temp1 = new RegExp(/#ipbf\\d\+souka.saitama.ocn.ne.jp/);
alert(temp1.test(body));
//マッチしない
var body = document.body.innerHTML;
var word = new Array();
var temp2;
word.push('#ipbf\\d\+souka.saitama.ocn.ne.jp');
for (var i = 0; i < (word.length); i++)
{
 temp2 = new RegExp(word[i]);
 alert(temp2.test(body));
}
●対象データ
#ipbf\d+souka.saitama.ocn.ne.jp
●希望する結果(※完全一致)
#ipbf\d+souka.saitama.ocn.ne.jp
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
「//マッチしない」方の配列内容を変えずに(\を追加せずに)一致させたいです。

以上どうか、よろしくお願いします。

698 :デフォルトの名無しさん:2009/12/31(木) 16:25:29
Pattern.quote 使えばできるんでない?

699 :デフォルトの名無しさん:2009/12/31(木) 22:01:43
>>697
word.push(/#ipbf\\d\+souka.saitama.ocn.ne.jp/);

700 :デフォルトの名無しさん:2009/12/31(木) 22:38:39
>Java1.5(Firefox 3.0.16)
JavaじゃなくてJavaScriptでしょ?それなら>>695は正規表現リテラルでこう書ける
/\\\.nas\(3\|5\)\\d\+\\\.\[a\-z\\\-\]\+\\\.nttpc\.ne\.jp/

701 :デフォルトの名無しさん:2010/01/02(土) 16:48:00
>>698
>>699
>>700
返事が遅くなりすみません。
レスありがとうございます。
体調が悪くまだよく試していないのですが、まずはお礼だけで失礼します。

702 :デフォルトの名無しさん:2010/01/03(日) 22:07:34
JavaとJavaScriptが区別できない人っていまだにいるのか…

703 :デフォルトの名無しさん:2010/01/03(日) 23:16:48
VBとVBAの違いもな。
説明するの大変なんだよな・・・。

704 :デフォルトの名無しさん:2010/01/03(日) 23:32:15
VBとVBAの違いなんて知らない奴たくさんいるだろ
VB触ってるのは底辺だけなんだから

705 :デフォルトの名無しさん:2010/01/03(日) 23:55:38
ゲーム機は全て「ファミコン」だ。

706 :デフォルトの名無しさん:2010/01/04(月) 01:36:20
ファミコンって何だ?
ピコピコのことか?

707 :デフォルトの名無しさん:2010/01/04(月) 13:05:34
ピコピコはゲームウォッチ系じゃねーの?

知人が20万円ほど出してPC-98を買ったら
姉に「たっかいファミコンやなぁ」と言われたらしい。


708 :デフォルトの名無しさん:2010/01/05(火) 12:45:41
●正規表現の使用環境
Java1.5
●検索か置換か?
検索
●説明
123456700 とか12345678-00など
7桁から10桁の数字にあと2桁の数字がハイフンもしくは連続して付属する数列の検索。
数列の直前にCodeまたはInvoiceがついてたら除外する。
Invoice 12345678-00 はマッチしないけどaccess# 12345678-00 はマッチする。
"On Invoice 123446789, your order was placed. However, please be sure to note that your account number 789456123 is suspended until further notice."
最初の番号Invoice 123446789は無視するけどaccount number 789456123はマッチするようにしたい。

●対象データ
Invoice 123446789
word 454545454
454545454545
Code: 4085432259
passcode 6789012 06
number 8901234 08
word 454545454 word

●希望する結果
マッチしない
Invoice 123446789
Code: 4085432259
passcode 6789012 06
Code 7890123-07

^(?!(Code|Invoice).)([^=\/%(.]\b\d{7,10}((\d?\d?)|(-\d\d))?\b)
自分でここまでやったけどうまく動かないです。
よろしくお願いいたします。

709 :デフォルトの名無しさん:2010/01/05(火) 13:09:16
javaならプログラム書けるんだからInvoice,Codeのことはとりあえず
忘れてマッチさせて、そのあとでマッチ位置からさかのぼってCode,
Invoiceがないことを確認する方がたぶん楽だと思うよ。

710 :デフォルトの名無しさん:2010/01/05(火) 13:09:29
javaならプログラム書けるんだからInvoice,Codeのことはとりあえず
忘れてマッチさせて、そのあとでマッチ位置からさかのぼってCode,
Invoiceがないことを確認する方がたぶん楽だと思うよ。

711 :デフォルトの名無しさん:2010/01/05(火) 13:10:13
すまん2つ出た

712 :デフォルトの名無しさん:2010/01/05(火) 14:16:10
ありがとうございます。実際にはJAVAで作成しているわけではなく、アプリケーションがJAVAとおなじ正規表現を使用している環境なので、プログラムを書くことはできないんです。それでここでアドバイスがいただければと思いまして、

713 :デフォルトの名無しさん:2010/01/05(火) 14:30:07
look-ahead(?!...)じゃなくてlook-behind(?<!...)を使うとこだね。

そしてlook-behindはたいていある決まった長さのの文字列に
マッチするパターンがしか使えないので、

(?<!Invoice: )(?<!Invoice )(?<!Code: )(?<!Code )

のように並べて使うことになるだろう。

必要な仕様がきちんと書かれてないのでこれだというのは
示せないけどがんばれ。

714 :デフォルトの名無しさん:2010/01/05(火) 14:51:49
●正規表現の使用環境
VB.NET

●検索か置換か?
検索

●説明
タブを含む何かの文字列の複数行を表す方法を教えて

●対象データ
AAAA
TAB TAB hogehoge改行
あああああ
TABT ABT AB hogehoge改行
TAB TAB hogehoge改行
ZZZZ

●希望する結果
あああああ

Regex("AAAA\n([\t.]+?\n)+(?<1>.+?\n)([\t.]+?\n)+ZZZZ",MultiLine)

上のように書いてみましたがだめでした。
AAAA改行とZZZZの間の文字列をターゲットにしつつ
その中にタブか何かの文字の組み合わせの文字列が1つ以上あって、行末に改行がある
という行がいくつかある。
ということを書いたつもりなのですが間違っているところを教えて頂きたいです。


715 :デフォルトの名無しさん:2010/01/05(火) 15:06:04
[\t.]だとタブまたは任意の文字なので結局[\t.]+?は.+?と書いたのと同じ。
また、〜+?とは普通書かないね。〜*と同じなので。

\tが少なくとも一つ含まれた行にマッチさせたいなら、

.*\t.*\n

716 :デフォルトの名無しさん:2010/01/05(火) 15:09:31
いや+?は最短マッチだろ。

717 :デフォルトの名無しさん:2010/01/05(火) 15:12:27
Multilineなら\nは.に含まれないので、.+?\nと書いても結局.*\nと
同じになるっていいたいんじゃねーの?

718 :デフォルトの名無しさん:2010/01/05(火) 15:48:20
それをいうなら.+じゃないか

719 :デフォルトの名無しさん:2010/01/05(火) 16:31:59
前にも .+? と .* が等価だと思ってる人がいたような。
\d? とかの ? と同じものに見えてるのかな。

720 :デフォルトの名無しさん:2010/01/05(火) 22:00:58
>>715
[\t.] ってブラケットの中にはいってんのなら'.'は単なるピリオドでしょ。


721 :デフォルトの名無しさん:2010/01/10(日) 22:09:28
Javascriptを勉強中です。といっても、ブックマークレット程度しかやってませんが。
正規表現を練っていたときに、もうかなり以前のブラウザから最短一致(ものぐさ/non-greedy/非貪欲)が
使えるようになっていたことを知り、いま必要というわけではないのですが、詳しく調べてました。

{n,m}? {n,}? *? +? ?? ←これらについては自習して使い方を理解したのですが、{n}? が解りません。
どう考えても {n} と {n}? は同じ結果になるように思えるのです。
正規表現のリファレンスや正規表現を解説しているサイトは数多く見ましたが、量指定子の直後に?を付けた
{n}? を紹介はしていても、その使い方を例示したものを見つけることが出来ませんでした。
どなたか解説していただければ幸いです。よろしくお願いします。

  記号関係はGoogleでも検索しづらいので、なかなか見つかりません。Googleの弱点ですね。

722 :デフォルトの名無しさん:2010/01/10(日) 22:36:48
googleに頼り切ってるヤツの弱点に見えるけどなぁ

ttp://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html
>a{n}? = ちょうどn回の繰り返しにマッチします。ちょうどn回なので、a{n}と等価であり、一貫性のためだけに存在します。

要するに/x{1}/の意味を問うているようなもん

723 :デフォルトの名無しさん:2010/01/11(月) 12:53:43
>>722
的確な回答ありがとうございます。

>googleに頼り切ってるヤツの弱点に見えるけどなぁ
検索ばかりしてるんじゃなく良書を得てそれで勉強せよ、またはGoogleに頼り切ってると
目が節穴になるぞ、というお叱りと理解いたしました。

☆perlretut - Perl の正規表現のチュートリアル
ttp://www.kt.rim.or.jp/~kbk/perl-5.8/perlretut.html
これは>>2の一番最初、「正規表現メモ」のページにある一番最初のリンクですね。
答えへの近道はGoogleでなく、このスレにあったようで…目が節穴でした。
このチュートリアルはとても解説が丁寧で、まさしく良書だと思います。これで勉強します。

結論としては /x{n}/ と /x{n}?/ は同じ結果なので、通常 {n}? は使用されない、ですね。

やはりPerlだと細かい情報もしっかりあってスゴイです。
これからは正規表現で悩んだらこのスレとPerlの周辺を当たってみようと思います。

724 :デフォルトの名無しさん:2010/01/11(月) 15:57:50
>>723
それ、Perlのマニュアルなんだよ。UNIX系のシステムだったら
man perlretut を実行すると表示されるよ。

ウェブを見るより先にマニュアルを読めってことで。



725 :デフォルトの名無しさん:2010/01/11(月) 16:31:29
.NET のマニュアルにも {n}? は {n} と等価って書いてあるな。
なんか訳が微妙におかしいけど。

http://msdn.microsoft.com/ja-jp/library/3206d374(VS.80).aspx

726 :723:2010/01/12(火) 22:05:22
>>724
UNIX系とは縁がありませんが、perlre/perlretutはWeb上にあるので、それをmanの代わりにします。
Javascriptで使える表現かどうかは、以下を見てチェック。
☆RegExp - Core JavaScript 1.5 Reference - Mozilla Developer Center
ttps://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/RegExp
出来るだけ大本の公式情報を参照すべし、ですね。

>>725
情報ありがとうございます。間違ってはいませんが、確かに変ですねぇ。

perlretut、面白いですね−。塩基配列のストップコドンのとことか。
自習してみて、チュートリアルと同じ結果になるのを確認したのはいいのですが…
Javascript:var R=/(\w\w\w)*?TGA/g, S='ATCGTTGAATGCAAATGACATGAC', A = [], I = 0; while(R.test(S)) {A[I] = RegExp.lastMatch + ' (' + RegExp.lastParen + ') Pos=' + R.lastIndex; ++I;} alert(A.join('\n\n'));
なぜずれるのか、理解できず…。その後バックトラックの動作を知り、単に「必ず3文字ずつ進む」と
思い込んでただけだと気付きました。。。マッチにトライして失敗したらそこで終わりではなく、
開始位置を1文字進めるんですね。筆者が仕掛けた罠に見事にハマりました。。。
というか、こういう処理は素直に3文字ずつ取り出して判定すべきですよね。
なお、Javascriptには\Gなんてありませんでした。残念!

727 :デフォルトの名無しさん:2010/01/13(水) 21:03:05
>726
man じゃなくても perldoc perlretut でいけるよ。

728 :デフォルトの名無しさん:2010/01/15(金) 16:56:04
>>725
MSDNライブラリは機械翻訳だからしかたないべ

729 :デフォルトの名無しさん:2010/01/18(月) 02:35:24
LESSON1 1. water 2. autumn 3. city 4. (Not at all.) 5. This is (what) think. 6. (What if) he's not there? 7. I've never (met him). 8. Look (at her). 9. water 10. matter LESSON2 以下L10まで続く

を並び替える所で詰みました。

↓↓↓↓↓
LESSON1 1. water
2. autumn
3. city
4. (Not at all.)
5. This is (what) think.
6. (What if) he's not there?
7. I've never (met him).
8. Look (at her).
9. water
10. matter
LESSON2 以下L10まで続く

と並び替える方法をご教授ください。

(\d{1,2}\.).+(?=\d{1,2})こんな汚いソースでは動きませんでした(;;)
昔よくいじってたんだが、これでは自信なくしてしまいますね。。

730 :デフォルトの名無しさん:2010/01/18(月) 02:45:28
なんの言語使ってるのか知らんが数字が必ず頭にあるのなら
コレクションか配列にぶち込んで数値扱いでsortするだけじゃないのか

731 :デフォルトの名無しさん:2010/01/18(月) 20:34:54
●正規表現の使用環境
Javascript(たぶん1.5?Firefox3.5以降で動かしたいです)

●検索か置換か?
検索

●説明
直前に限らず前方にhugaまたはpiyoがない場合のhogeにマッチさせたいんですが
どうすればいいですか?

〜以外、とか〜が続かない場合、とか
[^xyz]やx(?!y)がありますが
複数の一まとまりの単語が前にない場合
ってどうすればいいのかなと
あと
piyoaaaaahoge
と同じ文字の繰り返しじゃなく
piyoaiueohoge
といろんな文字(数字や記号も)が複数挟まる場合も
どうすればいいのかわからず

732 :デフォルトの名無しさん:2010/01/18(月) 21:56:52
/^(?!huga|piyo).*hoge/

733 :デフォルトの名無しさん:2010/01/18(月) 22:17:47
>>729
自分は勉強中なので演習がてら作ってみました。
/(LESSON\d+ +)?[^ ].*?(?= +(\d+\. |LESSON\d+ |$)|$)/g

一応、区切りと途中のスペースはいくつ入っても可としました。
1行目だけ「LESSON1 1. water 」で、かつ「LESSON2 以下L10まで続く」という文章にもマッチ
させなければならないのが面倒でしたが、x(?=y) 肯定的前方先読みの良い題材になりました。

ところで、、、「LESSON2 以下L10まで続く」という文章はデータ中に必要だったんですか??


以下はついでに試作しました。

■汎用的に「数字. 」で区切る、冒頭保存
/[^ ].*?(?= +(\d+\. |$)|$)/g

■汎用的に「数字. 」で区切る、冒頭は捨てる
/\d+\. .*?(?= +(\d+\. |$)|$)/g

734 :731:2010/01/18(月) 22:37:06
>>732
どうもありがとうございます

.*って
aaaaiiiiuuuueeeeooooってあったら
最初に見つけた文字(この場合a)の繰り返しにマッチするんだと思ってました
つまりaaaaだけにマッチするんだとばかり

hugaまたはpiyoが先頭じゃないかも知れない場合もそのままでマッチしますか?
^.*(?!huga|piyo)〜とかに改変?

735 :デフォルトの名無しさん:2010/01/18(月) 22:47:00
>>731
どうでもいいことですが、Firefox3は、以下によると JavaScript 1.8 のようですよ。
https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/About

736 :デフォルトの名無しさん:2010/01/19(火) 16:22:27
JavaScriptの正規表現をその場で試せるサイトってないのかな?

php、ruby、.netなら知ってるんだけど。

737 :デフォルトの名無しさん:2010/01/19(火) 16:43:16
ブラウザのデバッグツールつかってJSコンソール叩けばいいじゃん
アドレスバーに直で入れたっていいし

738 :デフォルトの名無しさん:2010/01/20(水) 00:46:10
いくらでもありそうだな
http://regexpal.com/
http://www.gethifi.com/tools/regex
http://jsregex.com/

739 :デフォルトの名無しさん:2010/01/20(水) 14:29:46
>>731
/^((?!huga|piyo).)*hoge/

740 :デフォルトの名無しさん:2010/01/22(金) 18:00:35
rubyにもperl互換の正規表現ってあんの?


741 :デフォルトの名無しさん:2010/01/22(金) 18:28:16
有無

742 :デフォルトの名無しさん:2010/01/25(月) 20:34:01
●正規表現の使用環境
php 5.3のpreg_replace
●検索か置換か?
置換
●説明
$var['var1'] = "value1";
$str = "%var1%var1%var1%";
$ptn = わからん;
$str = preg_replace($ptn,$var['var1'],$str);
echo $str;

期待する結果
→value1varvalue1

要するに%なんたら%を変数として扱って、
連想配列から引っ張ってきたいんですが、
うまく%の対応を表現することができません。どのような正規表現を使えば良いんでしょうか?

743 :デフォルトの名無しさん:2010/01/25(月) 20:50:11
$ptn = '/%([^%]+)%/e';
$str = preg_replace($ptn,'$var[$1]',$str);

value1var1value1になるけど。

744 :デフォルトの名無しさん:2010/01/25(月) 21:16:14
>>>743
'$var[$1]'
これ普通に思いつかなかった。ありがとう。できた。

745 :デフォルトの名無しさん:2010/01/28(木) 00:22:28
●正規表現の使用環境
PHP

●検索か置換か?
検索

●説明
大量の文字データの中から「マンコ」という文字列をMATCHさせたい。
ただし、「イマンコ」「マンコア」「ウルトラマンコスモス」「アパマンコーポ」を含む文字列はMATCHさせない。

●テストケース(文字列)と期待する結果(MATCHするかしないか)
マンコ        MATCHする
オマンコ       MATCHする
マンコー       MATCHする
ウルトラマンコ    MATCHする
マンコスモス     MATCHする
アパマンコ      MATCHする
マンコーポ      MATCHする

イマンコ       MATCHしない
マンコア       MATCHしない
イマンコア      MATCHしない
ウルトラマンコスモス MATCHしない
アパマンコーポ    MATCHしない

●試した正規表現
(?<!イ)((?<!ウルトラ)((?<!アパ)マンコ|マンコ(?!ーポ))|((?<!アパ)マンコ|マンコ(?!ーポ))(?!スモス))(?!ア)

●質問内容
上記の正規表現で、期待する結果は得られたのですが、どうも長ったらしく、スッキリしません。
もし、「ウルトラマンコスモス」や「アパマンコーポ」のように、真ん中に対象文字列ありで除外したい文字列がどんどん増えていったとしたら非常に面倒な気がします。
もっとコンパクトに短く効率的に書けたりするなど、いい案はございますでしょうか?アドバイスをいただけると幸いでございます。

746 :デフォルトの名無しさん:2010/01/28(木) 01:04:48
くだらねえww

747 :デフォルトの名無しさん:2010/01/28(木) 10:48:44
>>745
例外を先に弾いてしまうのが一番楽だろうが
そんなのは正規表現スレで言っていい発言ではないしな


748 :デフォルトの名無しさん:2010/01/28(木) 10:54:36
正規表現でやったら楽なことっていちいち聞かなくてもできるから
スレで質問がでるようなのはたいてい不向きな問題w

749 :デフォルトの名無しさん:2010/01/28(木) 13:40:43
>>745では、ワードが不適切でした。申し訳ございません。訂正いたします。

●説明
大量の文字データの中から「新宿」という文字列をMATCHさせたい。
ただし、「西新宿」「新宿駅」「東京都新宿区」「西武新宿線」を含む文字列はMATCHさせない。

●テストケース(文字列)と期待する結果(MATCHするかしないか)
新宿     MATCHする
湘南新宿   MATCHする
新宿御苑   MATCHする
東京都新宿  MATCHする
新宿区    MATCHする
西武新宿   MATCHする
新宿線    MATCHする

西新宿    MATCHしない
新宿駅    MATCHしない
西新宿駅   MATCHしない
東京都新宿区 MATCHしない
西武新宿線  MATCHしない

●試した正規表現
(?<!西)((?<!東京都)((?<!西武)新宿|新宿(?!線))|((?<!西武)新宿|新宿(?!線))(?!区))(?!駅)

●質問内容
上記の正規表現で、期待する結果は得られたのですが、どうも長ったらしく、スッキリしません。
もし、「東京都新宿区」や「西武新宿線」のように、真ん中に対象文字列ありで除外したい文字列がどんどん増えていったとしたら非常に面倒な気がします。
もっとコンパクトに短く効率的に書けたりするなど、いい案はございますでしょうか?アドバイスをいただけると幸いでございます。

●補足
「事前にif文などで、MATCHさせたくないワードを除外する」ということは諸事情によりできません。
たった一つの正規表現で表すことが絶対条件です。

750 :デフォルトの名無しさん:2010/01/28(木) 14:16:50
新宿(?<!西新宿)((?!区)(?!線)(?!駅)|(?<!東京都新宿)(?=区)|(?<!西武新宿)(?=線))

751 :デフォルトの名無しさん:2010/01/28(木) 14:24:46
>>747
西新宿|新宿駅|西新宿駅|東京都新宿区|西武新宿線|新宿

にマッチさせて、結果が "新宿" 以外の物を弾け
と言えば正規表現スレらしい発言になるぜ。

>>749の条件には合わなさそうだけどな。

752 :デフォルトの名無しさん:2010/01/28(木) 14:40:15
もうちょっとメンテしやすいのを思いついた
新宿(?<!西新宿)(?!駅)((?<!東京都新宿)|(?!区))((?<!西武新宿)|(?!線))

俺も>>751の方がいいと思うけどな
何か我々の与り知らぬ事情があるんだろう

753 :デフォルトの名無しさん:2010/01/28(木) 17:26:43
いっそ文字列sとsを部分文字列として含む文字列の集合T={t1,t2,...}が与えられたときに
sを含むがTの要素を含まない文字列にマッチする正規表現を求めるプログラムを
書いてしまうのがいいのではないだろうか。と思ったが結構難しいな...

754 :デフォルトの名無しさん:2010/01/28(木) 18:12:02
>>753
○○を含まない正規表現 を求めるプログラムならあるから
それをベースにすればある程度簡単にいけそうだ。

755 :デフォルトの名無しさん:2010/01/28(木) 19:05:50
>>752
これは目から鱗

MATCHさせたくないワードに「○○新宿△△」を追加したいときは
単純に正規表現に

((?<!○○新宿)|(?!△△))

を追加すればいいわけか

756 :デフォルトの名無しさん:2010/01/28(木) 23:29:04
空気読まずに質問するけど
その正規表現はどの正規表現エンジンの構文なの?


757 :デフォルトの名無しさん:2010/01/28(木) 23:37:07
>756
多分 Perl 互換なんで PCRE とかじゃね?

758 :デフォルトの名無しさん:2010/01/28(木) 23:46:41
ありがと、ググってみる

759 :デフォルトの名無しさん:2010/01/29(金) 00:03:04
>>756
そういうときは>>2の最初のサイトが便利

760 :749です:2010/01/29(金) 02:40:15
>>752
ありがとうございます!
まさに求めていたご回答です。

カスタマイズ性にも優れ、大変勉強になりました。

761 :デフォルトの名無しさん:2010/01/29(金) 11:18:44
○ンコメソッド
ないし
新宿メソッドと命名しよう

762 :デフォルトの名無しさん:2010/01/29(金) 12:55:28
いつも見てて思うけど、ここの人たちって良い人ばっかだ。

763 :デフォルトの名無しさん:2010/01/29(金) 13:09:03
見た目に騙されてはいけない

764 :デフォルトの名無しさん:2010/01/29(金) 17:28:13
>>755
これは便利だな。新宿パターンとでも呼べばいいのか

765 :デフォルトの名無しさん:2010/01/29(金) 23:33:29
答えを考えるがパズル的でけっこう楽しいのだよ。


766 :デフォルトの名無しさん:2010/01/29(金) 23:46:14
すぐパズル言う人は、有名な人の発言に影響され杉。

だと思う。

767 :デフォルトの名無しさん:2010/01/30(土) 09:19:58
正規表現程度でパズルとか言っちゃう奴はパズル知らな杉

768 :デフォルトの名無しさん:2010/01/30(土) 09:23:59
パズルやったことあるけど、面白さがわからなかった。

トランプもゲームもやったことあるけど、面白さが分からなくて
友達いなくなった。

769 :sage:2010/01/30(土) 13:05:58
リアルの生活は捨ててコンピュータに熱中しろ。
そして悟りを開くのだ...

770 :デフォルトの名無しさん:2010/01/30(土) 13:36:33
図書館からこれを借りてきたが、元々の目的を忘れて読んでるぜ

詳説 正規表現
tp://www.oreilly.co.jp/books/4873111307/

771 :デフォルトの名無しさん:2010/01/30(土) 15:06:52
麻雀の役の判定を正規表現ですることは可能ですか?

772 :デフォルトの名無しさん:2010/01/30(土) 15:46:21
比較演算子にマッチする正規表現で教えてください。

"<"にはマッチするが"<<"にはマッチしない、その逆の
">"にはマッチするが">>"にはマッチしないという部分
がうまくいっていないようなんです。
どう記述すればいいですか?

"(!=|==|<[^<]|>[^>]|<=|>=)"


773 :デフォルトの名無しさん:2010/01/30(土) 17:01:26
単純に
[^<]<[^<]|[^>]>[^>]
じゃだめ?

774 :デフォルトの名無しさん:2010/01/30(土) 17:16:58
>>773
否定の文字クラス[^...]は、'...'以外の一文字にマッチするので
'[^<]<[^<]'だと、例えば単独の '<' や '<=' にマッチしないのだが、これはいいのかな。

775 :デフォルトの名無しさん:2010/01/30(土) 17:28:18
比較演算子だけの行とかがなければ問題ないでしょ。

776 :デフォルトの名無しさん:2010/01/30(土) 17:34:18
>>774
比較演算子ならかなりの確立で "x>y" みたいな比較をすると思う。
計算が長くなって改行したとしても必ず、
"x
<
y"
という形になるから、改行を文字として考慮していれば問題ないと思う。
単独の文字として"<"にマッチングさせるなら、なら先読み後読みを使う必要があるけども。

777 :デフォルトの名無しさん:2010/01/30(土) 17:38:17
>>775, >>776
ああ、比較演算子にマッチさせるのか。忘れてた。
でも必ず題意を満たすかどうかは保証できないけど、何をやりたいかにもよるのかな。

778 :デフォルトの名無しさん:2010/01/30(土) 18:17:03
みなさんありがとうございます。
いちおう演算子の途中で改行がはいることはないという前提です。

でもシフト演算子はあるので、A << B ではアンマッチで、 A < B や
A <= B はマッチするというのが希望です。

779 :デフォルトの名無しさん:2010/01/30(土) 18:19:09
#送信してしまいました

>>773 の方法でうまくマッチしてくれるようです。
ありがとうございました。

780 :デフォルトの名無しさん:2010/01/30(土) 20:58:25
あ、けど "<!" こんなありえないものもマッチしちゃいますね・・・orz

781 :デフォルトの名無しさん:2010/01/30(土) 21:07:31
(!=|==|[\w\s]<[\w\s]|[\w\s]>[\w\s]|<=|>=)

で、うまくいったような。

782 :デフォルトの名無しさん:2010/01/30(土) 21:14:03
"<!"が出る場面がよくわからない(HTMLのコメント文ぐらい?)けど、
それを言い始めたら収集がつかなくなると思うんだが。
そもそもそれは先読み後読みを使っても生じる問題。

783 :デフォルトの名無しさん:2010/01/30(土) 23:03:24
何が目的でマッチさせるのかがわからないとそれ以上の議論はできないと思うけど
(正規表現でマッチさせるのは手段)

784 :童貞C使い:2010/01/30(土) 23:12:12
>>782
if ( -1 <!(1) ) {...}

785 :デフォルトの名無しさん:2010/01/31(日) 14:42:07
>>771
順子の表現が思いつかない。

786 :デフォルトの名無しさん:2010/02/01(月) 02:02:39
普通にlookahead/-behindつかえよ

787 :デフォルトの名無しさん:2010/02/01(月) 02:43:30
環境書いてないから普通に使えるかどうかもわからない。

788 :デフォルトの名無しさん:2010/02/01(月) 10:06:13
ドンジャラなら正規表現で問題なくいけるんだけどなぁ

789 :デフォルトの名無しさん:2010/02/01(月) 14:11:41
| の使い方はわかりましたが、C言語の && に相当する表現は
どうすればいいでしょうか

語単位で使いたいです

William & John (William と John を両方含む)みたいな感じで

790 :デフォルトの名無しさん:2010/02/01(月) 14:23:34
WilliamとJohnの間に何がどれだけあってもその全体がマッチしていいのか?
\bWilliam\b.*\bJohn\b|\bJohn\b.*\bWilliam\b
こんな感じ?

791 :デフォルトの名無しさん:2010/02/01(月) 14:47:05
いつも思うけど2回ずつ書くのめんどくせーよなー

792 :デフォルトの名無しさん:2010/02/01(月) 14:50:44
>>790
そうですそんな感じですありがとうございます

でもそれタイプするの大変そうですね

793 :デフォルトの名無しさん:2010/02/01(月) 16:04:27
/\bWilliam\b/ && /\bJohn\b/

タイプが楽になる。

794 :デフォルトの名無しさん:2010/02/01(月) 16:15:50
>>793
それ頂きます

795 :デフォルトの名無しさん:2010/02/01(月) 17:56:57
処理系依存注意

796 :デフォルトの名無しさん:2010/02/02(火) 03:29:12
処理系依存も何も正規表現じゃないだろ

797 :デフォルトの名無しさん:2010/02/02(火) 07:17:50
/(?=.*William)(?=.*John)/

798 :デフォルトの名無しさん:2010/02/03(水) 12:17:59
0
0
0
1
2
3
0
0
0
4
5
6・・・・

と続く文字列を0を残したまま
0
0
0
1
2
3
0
0
0
456
と抜き出すにはどううればよいでしょうか?

0は最低1桁あり上は5個です

000000 などは存在せず
最低は 01 になります

799 :デフォルトの名無しさん:2010/02/03(水) 12:20:36
失礼しました
こちらです

000123000456・・・・

と続く文字列を0を残したまま
000123
000456
と抜き出すにはどううればよいでしょうか?

0は最低1桁あり上は5個です

000000 などは存在せず
最低は 01 になります

800 :デフォルトの名無しさん:2010/02/03(水) 12:25:40
search ==> ([1-9])0
replace ==> $1\n0
about 1024 ?

801 :デフォルトの名無しさん:2010/02/03(水) 12:25:57
0+[1-9]+

802 :デフォルトの名無しさん:2010/02/03(水) 12:30:49
>>800
確かに途中に0を考慮してませんでした

>>801
ありがとうございます


となると

0+[1-9][0-9]+[1-9]

あ、これじゃあ桁数が少ないとだめか・・・

803 :デフォルトの名無しさん:2010/02/03(水) 13:19:06
>>801
802じゃないけど勉強になりました。ありがとうございます

804 :デフォルトの名無しさん:2010/02/03(水) 15:00:15
その都度変化する変数$txtの中身(全半角混在)から、alt="●"とsrc="■"(●と■が変化)の
●と■だけを抜き出して$aと$bにそれぞれ代入したいのですが、どのようにやればよいでしょうか

PHP5

805 :デフォルトの名無しさん:2010/02/03(水) 15:27:10
>>802
・途中の0: 0103 01と03にするのか、0103にするのか
・末尾の0: 0110021 どこが最初の数字の末尾になるのか

806 : ◆Qn5tuAIkhk :2010/02/07(日) 16:28:08
●正規表現の使用環境
Windows XP, Python 2.6
Windows XP, Boost.Regex
Windows XP, Boost.Xpressive
のうちどれでも可です。

●検索か置換か?
検索

●説明
C++言語のコメントを過不足無く検出できる正規表現

●対象データ
C++ソースコード, ヘッダーファイル
(中身を全て一つの文字列(target_str)として取得しています。
 target_strは全ての行を取得し、行間に\nを挿入してつなげた形となっています。)

●希望する結果
コメントを検出できること。

C++言語のコメントに一致するPython正規表現を書いてくださいませんでしょうか?
コメントは // と /* */ とからなりますが、厳密には
C++言語は>>806の様なコメントの扱いをします。




807 : ◆Qn5tuAIkhk :2010/02/07(日) 16:29:23
C++言語は>>806の様なコメントの扱いをします。
ではなく C++言語は>>808の様なコメントの扱いをします。 でした。



808 : ◆Qn5tuAIkhk :2010/02/07(日) 16:31:06
1. //でコメント導入を示し、行末までがコメントになります。

 var = 42; // comment

2. /*と*/で囲むと、複数行コメントになります。

 /*comment*/
 aaaコメントでない
 /*comment
  comment
  comment
  */

3. コメントの入れ子については
C++言語では基本的に前から見ていくので、最初に出現したコメントが優先されます。
(//を無条件で優先するというようなことはありません。)

従って
 /* foo // bar */
 foobar */
は最初の/*を見た瞬間から*/が出現しない限り全て無視する(コメント扱いする)こととなります。
よってC++言語では//を見ても何とも思わずコメント扱いを続け、
その後最初に */を見た瞬間にコメント扱いを終了します。
よって foobar までコメントになるのでははなく、
/* foo // bar */だけがコメントとなりfoobar */の部分はコメントでないことにとなります。

4. 文字列リテラルの扱い
C++言語では "" で挟まれた物を文字列として扱います。
"コメントでない"//comment

5. コメントと文字列の入れ子について
C++言語では3.と同様に、最初に出現したものを優先します。

809 : ◆Qn5tuAIkhk :2010/02/07(日) 16:32:51
C++言語 コメント&文字列 扱いの例:

// comment /*
foo コメントでない
// comment */

foo /*
comment
// comment */

// comment /*
foo コメントでない
foo */ これはコメントでない


"// foo" コメントでない


// "comment" コメントである
/* "comment" コメントである
 comment
// comment */

foo コメントでない
"/*" コメントでない
foo コメントでない
// comment */



810 :デフォルトの名無しさん:2010/02/07(日) 16:34:08


自己解決しました。


811 :デフォルトの名無しさん:2010/02/07(日) 16:35:17
>>810
死んでしまえばいいのになぁ

812 :デフォルトの名無しさん:2010/02/07(日) 17:42:02
pythonスレに答え出てる

813 :810:2010/02/07(日) 18:00:01
なんだ、マルチポストだったのか。

# そういえば、ふくろう本にサンプルあった気がするけどな。

814 :デフォルトの名無しさん:2010/02/07(日) 22:03:00
pythonスレでは不可能じゃね?
という結論になっている。
>>813
> # そういえば、ふくろう本にサンプルあった気がするけどな。
いや、アレは全然だめ。
複数行コメントに対応してないから。


815 :デフォルトの名無しさん:2010/02/07(日) 22:11:41
入れ子構造が記述できればいいなら折角なんだからC++のままBoost::spirit使うとか

816 :デフォルトの名無しさん:2010/02/07(日) 23:10:47
日本語で\bが使えたらすごいだろうなぁ

817 :デフォルトの名無しさん:2010/02/07(日) 23:33:25
入れ子構造を処理する必要があるなら不可能だけど
C++のコメントってネストできたっけ

818 :デフォルトの名無しさん:2010/02/07(日) 23:35:36
>>817
>>809


819 :デフォルトの名無しさん:2010/02/07(日) 23:46:56
C++のコメントはネストできないしふくろう本の正規表現はちゃんと動くよ。

820 :デフォルトの名無しさん:2010/02/08(月) 21:33:43
>>819
>>809

821 :819:2010/02/08(月) 21:34:51
>>820
ああごめん、ネストってもしかして
Cスタイルコメントのネストのこと?
つまり/* */と/* */のネストのことか?


822 :デフォルトの名無しさん:2010/02/09(火) 21:47:51
>>821
そう。/* */と//が互い違いになってても階層が無限に深くなることはないはず

823 :デフォルトの名無しさん:2010/02/09(火) 23:18:12
秀丸の正規表現で質問です
括弧の中の「word:○」の○の大文字の英字一文字だけを\1や\2などで取得する正規表現は動書けばいいでしょうか?
例の場合ですと、AとBを取得できるようにしたいです


【例】
word:A
word:C
(
word:A
word:B
)

【補足】
記述は例の通りなんですが、カッコ内のデータは2つとは限りません。3個の場合もあれば100個の場合もあるので決まってないです。
(
word:Z
word:V
word:R
word:F
)

【自分で書いてみたけどダメだった正規表現】
\(.*(word:([A-Z]+?)){1,}.*\)

824 :デフォルトの名無しさん:2010/02/09(火) 23:27:42
>>823
たしか括弧って一番外側に無いと\1とかで取得できないんだよねぇ。
うーむ。。。

825 :デフォルトの名無しさん:2010/02/10(水) 00:17:34
秀丸エディタのヘルプ
目次− 検索系コマンド− 正規表現−一般的正規表現互換のタグ付き正規表現
には
"タグの対象となるのはあくまで一番ネストの浅いカッコだけ"
とありますね。

つまりカッコがいくつ出てくるか分からない場合,
番号指定による文字列取得はできません。

まずマクロなどで括弧内の文字列を分離したうえで
word:([A-Z]+)で処理するしかないと思います。
この場合,各々の大文字が\1で得られます。

826 :デフォルトの名無しさん:2010/02/10(水) 17:27:32
困っているわけじゃないんだけど、{0}って出現しないって考えでいいんだよね?
じゃあ何で
(東京都){0}新宿区{0}
 が
東京都新宿区
にマッチするんだろう・・・。

試したのは.NetのRegex

827 :デフォルトの名無しさん:2010/02/10(水) 17:37:04
空文字列にマッチしてんじゃねーの?

828 :デフォルトの名無しさん:2010/02/10(水) 17:41:30
いや、どうも"新宿"にマッチしたことになってるんだけど。
なんか間違ってたのかな。

829 :デフォルトの名無しさん:2010/02/10(水) 17:51:17
新宿区{0}
この{0}は区にしかかかってない

830 :デフォルトの名無しさん:2010/02/10(水) 17:54:30
あ〜、空文字って
"空文字""新宿""空文字"
ってことか〜。
なるほど。ありがとう。

831 :デフォルトの名無しさん:2010/02/10(水) 17:54:41
そりゃそうなるわな

832 :デフォルトの名無しさん:2010/02/11(木) 14:14:20
adcという文字列にはマッチしてabcdやabcdeなどはマッチしないようにするにはどうしたらいいでしょうか?

833 :デフォルトの名無しさん:2010/02/11(木) 14:36:16
・/adc/

834 :デフォルトの名無しさん:2010/02/11(木) 14:44:04
\bで挟む

835 :デフォルトの名無しさん:2010/02/11(木) 14:49:26
曖昧で質問の意図がわかりにくいが
^ と $ で挟むとか。

836 :デフォルトの名無しさん:2010/02/11(木) 18:25:39
提示された条件だけなら、文字列として"adc"と比較すればいい
これが望む回答だとは思えないので、高確率で質問自体が無意味

837 :デフォルトの名無しさん:2010/02/11(木) 19:03:10
>>4どおりでなくてもいいけど情報なさすぎの質問では答えにくいよね。

838 :デフォルトの名無しさん:2010/02/11(木) 20:43:44
>>832
正規表現エンジンによるな
秀丸(hmjre.dll)なら"単語の検索"にチェックをいれるか,もしくは"\< abc\> "
鬼車なら"\babc\b"


839 :デフォルトの名無しさん:2010/02/11(木) 21:14:48
adcだよ?

840 :デフォルトの名無しさん:2010/02/11(木) 21:54:32
孔明の罠かっ!!!

841 :デフォルトの名無しさん:2010/02/11(木) 21:57:59
多数のレスありがとうございます
情報がすくなかったようですみませんでした
参考にさせてきただきます

842 :デフォルトの名無しさん:2010/02/12(金) 06:29:48
PHP 5.2の環境です。
タグが1つだけの場合に消去したいです。
下のような文章があったとして…

あああ<br /><br />いいい<br />ううう<br />えええ

次が希望する結果です。

あああ<br /><br />いいいうううえええ


php.netとか見てると、言明とかなんとか辺りだとおもうんですが…上手くできません。

843 :842:2010/02/12(金) 06:31:30
ああ補足、マルチバイトに対応した置換です。

844 :デフォルトの名無しさん:2010/02/12(金) 06:53:03
(?<!<br />)<br />(?!<br />)

845 :デフォルトの名無しさん:2010/02/12(金) 06:54:25
おっと失礼
(?<!<br />)(<br />)(?!<br />)

846 :デフォルトの名無しさん:2010/02/12(金) 07:01:09
pregなら
/(?<!<br \/>)(<br \/>)(?!<br \/>)/

847 :842:2010/02/12(金) 08:00:08
ありがとーございます。
試してみます。

ああ、でもこれだけだと必要な改行まで省いてしまうかも。改行直後の文字を判別して改行するか決めるのも手間だなぁ。自然な文章に整形するのも結構大変だ。

848 :デフォルトの名無しさん:2010/02/12(金) 10:45:12
こんにちは
yahoo pipes を使っています

<a href="http://www.@@@.co.jp/aaa/bbb/ccc/ddd/">

ではじまるURLの末尾に文字(xxx)を追加したいのですが

URLは http://www.@@@.co.jp の時限定で

/aaa/bbb/ccc/ddd/ のあたりは何文字でも構わない(毎回変わる)場合

Regexボックスの中になんと表記すればよいのでしょうか


<変更前>
<a href="http://www.@@@.co.jp/aaa/bbb/ccc/ddd/">

<こうしたい>
<a href="http://www.@@@.co.jp/aaa/bbb/ccc/ddd/xxx">

<こういう時も>
<a href="http://www.@@@.co.jp/eee/fff/ggg/">

<こうしたい>
<a href="http://www.@@@.co.jp/eee/fff/ggg/xxx">

849 :デフォルトの名無しさん:2010/02/12(金) 10:50:38
グループを

<a href="
URL部分
">

に分けてマッチした場合に

<a href="
URL部分
追加した文字列
">

でいいのでは?

850 :デフォルトの名無しさん:2010/02/12(金) 11:10:03
>>849

yahoo pipes だと すべての文字列を .* で表すのですが

<a href="http://www.@@@.co.jp/.*><タグ><タグ><タグ>
のようにURLのあとにもタグが続いていて

<a href="http://www.@@@.co.jp/.*> を マッチさせようとすると
一番最後の > まで見に行ってしまうので

<a href="http://www.@@@.co.jp/   .*><タグ><タグ><タグ   >xxx
                          ↑この部分がごっそり置換されてしまいます…

URL部分だけを切り分ける方法を教えていただけますか?


851 :デフォルトの名無しさん:2010/02/12(金) 11:16:46
(<a href=\")(s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+)(\">)

$1$2xxxx#3

yahoo pipesは知らんけどperl5(.netもこれ)だとこんな感じでだめかな?

852 :デフォルトの名無しさん:2010/02/12(金) 11:17:29
ミスった
置換側は
$1$2xxxx#3

じゃなくて

$1$2xxxx$3

853 :デフォルトの名無しさん:2010/02/12(金) 11:43:32
>>851
>>852

すごいです!うまく行きました!!!
ありがとうございます!!

854 :デフォルトの名無しさん:2010/02/12(金) 11:51:09
.+?は使えない環境なのか…?

855 :デフォルトの名無しさん:2010/02/12(金) 14:37:27
>>851

度々すみません、これだと
<a href="のすべてが置換されるようです・・・

<a href="http://www.@@@.co.jp/ のリンクだけに有効にさせるには
どうしたらいいでしょう?

856 :デフォルトの名無しさん:2010/02/12(金) 15:42:01
>>855
co.jpも基準につっこんどけばおk

857 :デフォルトの名無しさん:2010/02/12(金) 15:53:20
(<a href=\")(s?https?://[-_.!~*'()a-zA-Z0-9;@@@.co.jp/?:@&=+$,%#]+)(\">)

でOKですか?

858 :デフォルトの名無しさん:2010/02/12(金) 16:13:59
文字クラスの意味わかってるのかなぁ

859 :デフォルトの名無しさん:2010/02/12(金) 16:39:37
(<a href=\"http://www.@@@.co.jp/.*?)(\">)

$1xxx$2



(?<=<a href=\"http://www.@@@.co.jp/.*?)(?=\">)

xxx

860 :826:2010/02/12(金) 17:04:19
また質問なんですが、
^(A{0}){1}$
 で
A
にマッチしないのはどういう解釈なんでしょう?

861 :デフォルトの名無しさん:2010/02/12(金) 17:25:46
^$

862 :デフォルトの名無しさん:2010/02/12(金) 17:52:40
最終的にそうなるのか。
わかりました。ありがとう。

863 :デフォルトの名無しさん:2010/02/12(金) 18:06:03
{0}と??は名前付き捕獲式集合(田中哲スペシャル/Tanaka Akira Special)で
パターンを定義する時に便利だよ


864 :デフォルトの名無しさん:2010/02/12(金) 18:08:12
あ田中哲スペシャルって名前付き捕獲式集合じゃなくて
部分式呼出しのことだったっけね

865 :デフォルトの名無しさん:2010/02/12(金) 20:02:59
"03秒",
"22分 15秒",
"69時間 30分 08秒"

↑のような文字列にマッチして、数字部分を抜き出したいんですが、今は

((\\d+)時間)?\\s?((\\d+)分)?\\s?((\\d+)秒)

で$2,$4,$6を持ってきてるんですが、
もっとクレバーな方法ってありますか?

Perl 5.10

866 :デフォルトの名無しさん:2010/02/12(金) 23:34:28
>>865
([0-9]{2})(時間|分|秒)

867 :デフォルトの名無しさん:2010/02/13(土) 06:23:20
>>866
クレバーじゃねえwww

>>865
秒と分の\d+を[0-5][0-9]にする
抽出不要なカッコは非捕獲式集合にする

868 :865:2010/02/13(土) 14:34:47
非捕獲式集合を知りました
どうもでした

869 :デフォルトの名無しさん:2010/02/13(土) 15:53:33
>>863
使い方をまったく思いつけなかった俺に具体例をplz

それとa??がaにマッチすることってあり得るの?

870 :デフォルトの名無しさん:2010/02/13(土) 19:04:20
>>869
簡単な例が思い浮かばないが
日付を表す正規表現で使ったことがある(Ruby1.9/鬼車)

 RE = /
 (?<sep>[\- \/_.]*){0}
 (?<year>\g<y_normal>|\g<y_leap>){0}
  (?<y_normal>(\d{2})?\d{2}(?!\g<sep>\g<m_feb_leap>)){0}
  (?<y_leap>\g<y_leap_mother>?\g<y_leap_child>(?=\g<sep>\g<m_feb_leap>)){0}
   (?<y_leap_mother>[02468][048]|[13579][26]){0}
   (?<y_leap_child>0[48]|[2468][048]|[13579][26]){0}
 (?<month>\g<m_feb_normal>|\g<m_feb_leap>|\g<m_short>|\g<m_long>){0}
  (?<m_feb_normal>0?2(?=\k<sep>\g<d_1_28>)){0}
  (?<m_feb_leap>0?2(?=\k<sep>\g<d_29>)){0}
  (?<m_short>(11|0?[469])(?=\k<sep>(?:\g<d_1_28>|\g<d_29>|\g<d_30>))){0}
  (?<m_long>(1[02]|0?[13578])(?=\k<sep>(?:\g<d_1_28>|\g<d_29>|\g<d_30>|\g<d_31>))){0}
 (?<day>\g<d_1_28>|\g<d_29>|\g<d_30>|\g<d_31>){0}
  (?<d_1_28>(2[0-8]|1[0-9]|0?[1-9])(?!\d)){0}
  (?<d_29>29(?!\d)){0}
  (?<d_30>30(?!\d)){0}
  (?<d_31>31(?!\d)){0}
 (?<date>\g<year>\g<sep>\g<month>\k<sep>\g<day>){0}
 \A\g<date>\Z/x

871 :デフォルトの名無しさん:2010/02/13(土) 19:46:44
>>870
そうかそうか定義だけするわけね

・・・こんなのよく書いたなw
閏年判定を正規表現でやろうという発想すらなかった

872 :デフォルトの名無しさん:2010/02/16(火) 17:19:15
1〜3桁までの数字(全角含む)にマッチして
4桁以上だとスルーするようにはどうしたらよいでしょうか?

(例)
あいうえお 12  かきくけこ→12がマッチ
あいうえお 123 かきくけこ→123がマッチ
あいうえお 1234 かきくけこ→スルー

.NETのRegexです
単純に\d{1,3}で良いのかと思ったら、4桁あっても最初の3桁がマッチしてしまいました・・

873 :デフォルトの名無しさん:2010/02/16(火) 17:38:07
\d{1,3}[^\d]

874 :デフォルトの名無しさん:2010/02/16(火) 17:53:08
それも最後の1〜3桁にマッチする罠がww

875 :デフォルトの名無しさん:2010/02/16(火) 17:54:19
>>873
それだと

あいうえお 1234 かきくけこ→234がマッチ

となってしまいませんか?

と思ったんですが [^\d]\d{1,3}[^\d] でやったら思った通り動いてくれてる感じです
ありがとうございました。

876 :デフォルトの名無しさん:2010/02/16(火) 18:07:00
「数字がない」でなくて「数字でない文字にマッチ」なので、
それだと、

123

にマッチしない。それでいいならいいんだけど。

877 :デフォルトの名無しさん:2010/02/16(火) 18:13:53
そういうときには、先読み/戻り読みを使う

(?<!\d)\d{1,3}(?!\d)

「1〜3桁の数値」ではなく「1〜3個の数字」でいいんだよな?


878 :デフォルトの名無しさん:2010/02/16(火) 19:03:49
意外と深いなw

879 :デフォルトの名無しさん:2010/02/16(火) 19:42:36
>>876
おっしゃるとおりでした・・
そんで悩んでる最中でした

>>877
ありがとうございます
>「1〜3桁の数値」ではなく「1〜3個の数字」でいいんだよな?
その通りです
教えて頂いたのでうまくいってるようです。
先読み/戻り読みってのはまだ知らないのでとりあえず調べてみます。

880 :デフォルトの名無しさん:2010/02/17(水) 14:02:29
マッチさせるだけなら簡単だけど
マッチさせたくないものにマッチさせない条件がつくと複雑になるよな

881 :デフォルトの名無しさん:2010/02/17(水) 18:12:07
>マッチさせたくないものにマッチさせない条件
そもそもこれがないと文字列の集合が確定できない => 正規表現じゃない
正規表現はワイルドカードじゃないんよ。

882 :デフォルトの名無しさん:2010/02/17(水) 18:19:47
正規表現はマッチしたいものを書くのが基本だからなぁ。
有限状態オートマトンをひっくり返せば補集合にマッチ
するのになるけど、いざ正規表現で書こうとすると大変。
結局先読み・戻り読みみたいな飛び道具に頼ることになる。

883 :デフォルトの名無しさん:2010/02/17(水) 22:12:56
>>882
文字列集合の確定をどこまで厳密にしようとするかで
複雑さは変わってくるよね

たとえば>>870に出てるような日付の(拡張)正規表現もあれば
d{4}/\d{1,2}/\d{1,2}
なんて表現もありうる

あまりに複雑になるようならパーサジェネレータを使うべきだとは思う

884 :デフォルトの名無しさん:2010/02/18(木) 09:31:27
極窓などのファイル名置き換えで、
01_1. xxxx
10_10. xxxx
 を
01_xxxx
10_xxxx
のように変えたい場合はどう記述すればいいんでしょうか?


885 :デフォルトの名無しさん:2010/02/18(木) 13:38:06
>>884
search: ^(\d+_)\d+\.\
replace: $1

886 :デフォルトの名無しさん:2010/02/18(木) 23:23:13
●正規表現の使用環境
VB.NET

●検索か置換か?
置換

●説明
置き換えの正規表現で前後関係を記述する方法があったら教えて頂きたいです。

●対象データ
あいうえお123ABCかきくけこ
さしすせそ123ABCたちつてと
あいうえお123ABCかきくけこ

●希望する結果
あいうえお***かきくけこ
さしすせそ123ABCたちつてと
あいうえお***かきくけこ

887 :デフォルトの名無しさん:2010/02/18(木) 23:59:14
$url = "/search/value/num=1234/location=add"
http://〜ではなく、このような相対URLのみにマッチさせたいときは
/\/search\/value\/num=\d+\/location=add/
をどうなおしたら良いですか?
絶対urlにパターンが含まれる場合はマッチしますが、相対の場合はマッチしません。

888 :デフォルトの名無しさん:2010/02/19(金) 11:19:09
>>887
文字列が下記のようなHTMLタグのAttributeならこれが手っ取り早いかも
<a href="http://www.exapmle.com/search/value/num=1234/location=add">

/(?<=[.'"])\/search\/value\/num=\d+\/location=add/

889 :デフォルトの名無しさん:2010/02/20(土) 00:00:45
次の文字列からhogeだけマッチさせたいのですが可能でしょうか?
? KEY = "hoge" ?
KEYは固定の文字列です
イコールの左右には0個以上のスペースがはいります。
?は不特定な文字列です
肯定後読みを使うとしたのですが思うように動きません

jdk1.4です


890 :デフォルトの名無しさん:2010/02/20(土) 11:14:22
javaでは後読みに+と*は使えなかったと思うけど、その辺かな?

891 :デフォルトの名無しさん:2010/02/20(土) 11:38:25
一般的な実装だと後読みは固定長文字列限定だな。

892 :デフォルトの名無しさん:2010/02/20(土) 12:45:30
>>889
俺ならば、イコール右のスペースをtrimしてから正規表現に掛ける。
つまり、作業用配列か何かに放り込んで、1クッション挟むね。

893 :デフォルトの名無しさん:2010/02/20(土) 12:55:19
>>889
俺ならば、イコール右のスペースをtrimしてから正規表現に掛ける。
つまり、作業用配列か何かに放り込んで、1クッション挟むね。

894 :デフォルトの名無しさん:2010/02/20(土) 12:56:42
大事なことなので(

895 :デフォルトの名無しさん:2010/02/20(土) 13:08:09
>>889
KEY *= *"((?:[^"]|(?<=\\)")+)"
みたいな捕獲式集合で妥協してもらえないだろうか

>>892
漢なら正規表現一発でキメるべき

896 :デフォルトの名無しさん:2010/02/20(土) 14:10:30
スレ的にはそうなんだろうけど、俺もたぶんクッション挟んで動作の確実性を取るなぁ。

897 :デフォルトの名無しさん:2010/02/21(日) 17:23:37
>>889です。
ありがとうございました。
やはり2回に分けてやってみます。


898 :デフォルトの名無しさん:2010/02/21(日) 21:16:08
環境:perl (ファイラーからマスクで使う)

質問です
(特定の文字列)+(特定の拡張子or拡張子なし) にマッチにはどのように記述すればいいのでしょうか?
(hoge|foo).*(|\.(txt|html)) と試したのですが、拡張子なしの部分で躓いています

899 :デフォルトの名無しさん:2010/02/21(日) 21:30:36
(hoge|foo)(\.(txt|html))?


900 :デフォルトの名無しさん:2010/02/21(日) 21:49:54
>>889
即レス感謝
出来ました。ありがとうございます。

901 :898:2010/02/21(日) 21:52:44
ごめんなさい、間違えました。>>900>>899へのアンカです
連投失礼

902 :デフォルトの名無しさん:2010/02/22(月) 11:28:10
yahoo! pipesで

<img src="http://

で始まる URL を

<img src="http://www.@@@.jp/

にしたいときの正規表現を教えてください

ただ、画像に属性がついてる時とついていない時があるので
両方に対応できるものだと助かります…

<例>
<img src="http://aaa.com/bbb/ccc/ddd.jpg alt="eee" width="100" height="100"
hspace="5" border="0" align="left"></a>

<img src="http://www.@@@.jp/aaa.com/bbb/ccc/ddd.jpg alt="eee" width="100"
height="100" hspace="5" border="0" align="left"></a>

<例>
<img src="http://fff.jp/ggg/hhh/iii.jpg "></a>
<img src="http://www.@@@.jp/fff.jp/ggg/hhh/iii.jpg "></a>



903 :デフォルトの名無しさん:2010/02/22(月) 15:01:56
お断りします

904 :デフォルトの名無しさん:2010/02/22(月) 15:07:46
パーサ使った方が楽なんじゃない。。

905 :デフォルトの名無しさん:2010/02/22(月) 19:33:35
yahoo! pipes使ったことないからな~
如何ともし難い

906 :デフォルトの名無しさん:2010/02/22(月) 19:38:45
つか、似たような質問をどこかで見た気がする。
忘れたけど。

907 :デフォルトの名無しさん:2010/02/23(火) 07:01:00
>>906
同じような質問に関わったわ・・・
かなり前のような気がしたが>>848だった
このスレ進むのおせーなw

908 :デフォルトの名無しさん:2010/02/24(水) 12:58:56
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
typedef struct bregexp { const TCHAR *outp; const TCHAR *outendp; const int splitctr; const TCHAR **splitp; INT_PTR rsv1; TCHAR *parap; TCHAR *paraendp; TCHAR *transtblp; TCHAR **startp; TCHAR **endp; int nparens; } BREGEXP;
typedef int(__stdcall *bregfnc)(TCHAR*, TCHAR*, TCHAR*, BREGEXP**, TCHAR*);
typedef int(__stdcall *bregfnd)(BREGEXP*);
bregfnc BSubst;
bregfnd BRegfree;

void main(){
HINSTANCE hd = LoadLibrary("bregonig.dll");
if(!hd){printf("bregonig.dllを読み込めませんでした\n"); return;}
BSubst = (bregfnc)GetProcAddress(hd, "BSubst");
BRegfree = (bregfnd)GetProcAddress(hd, "BRegfree");

BREGEXP *rxp = NULL;
TCHAR msg[80], str1[] = "s/う//k", str2[] = "あいうえお";
if(BSubst(str1, str2, str2+_tcslen(str2), &rxp, msg)){
int m = int(rxp->outendp - rxp->outp);
printf("置換結果サイズ:%d\n", m);
_tprintf(_T("置換結果:%s\n"), rxp->outp);
} else printf("置換出来ませんでした\n");
if(rxp) BRegfree(rxp), rxp = NULL;

FreeLibrary(hd);
system("pause");
}

上記の様にLoadLibraryでDLLを読み込んで使おうと思ったのですが、
VC++2008で /O2 を入れてコンパイルすると置換結果サイズがおかしくなりました。
/O1 や最適化オプションを入れない場合では正常に動きます。
何か使い方が悪いのでしょうか?

909 :デフォルトの名無しさん:2010/02/24(水) 13:23:31
>>908
もう少し簡潔にまとめてもらいたいものだ。
で、どんな正規表現をご所望で?

910 :デフォルトの名無しさん:2010/02/24(水) 13:51:54
>>909
サクラエディタのソースに呼び出し規約の問題と書いてありました…。
お騒がせして申し訳ありませんでした。

911 :デフォルトの名無しさん:2010/02/24(水) 17:56:45
Jane Style 3.21でスレタイにヒットさせる方法で、

A(B偏差値|の試験|Bの試験|の採点|晒し|評価|B試験|うp)

をきれいにしたいんですが、わかりません

A[Bの]?(偏差値|試験|採点|晒し|評価|うp)

だと

ABの

と言うスレタイだけヒットしないんです

912 :デフォルトの名無しさん:2010/02/24(水) 18:03:19
>>911
ごめんなさい解決しました

913 :デフォルトの名無しさん:2010/02/24(水) 22:41:05
[0-9]{1,}
のような感じで数字以外を弾きたいのですが、+-等が弾かれません
どうしたらいいでしょうか?

914 :デフォルトの名無しさん:2010/02/25(木) 00:29:26
*.txt,*.bmp,*.zip などなど

上の文字列(拡張子の数は不定)の拡張子を
参照できるような正規表現はどうするのですか?

915 :デフォルトの名無しさん:2010/02/25(木) 06:06:48
^[^\.]+\.(.+)$

916 :デフォルトの名無しさん:2010/02/25(木) 09:02:41
php5.2.5
タグの後ろにある改行は無視してその他の改行に<br />を入れるという正規表現なんですが、自前で書いた
preg_replace( '/[^>]\r\n/', '<br />', $str)
って奴だとなぜか行末の1文字が文字化けを起こすか削られてしまいます。
何が悪いんでしょうか?


917 :デフォルトの名無しさん:2010/02/25(木) 09:07:45
書き忘れてましたが、
なぜか[^>]を消すと症状がなくなりました。


918 :デフォルトの名無しさん:2010/02/25(木) 09:19:45
そりゃマッチした部分全体を置き換えるんだから[^>]にマッチしたところが
消えちゃうだろ。昔はキャプチャして戻したもんだが、今なら戻り読みで

/(?<!>)\r\n/

かな?

919 :デフォルトの名無しさん:2010/02/25(木) 11:17:21
>>914
入力は "*.txt,*.bmp,*.zip" でいいのか?
で、最終的に欲しい出力はどれだ?
{ ".txt", ".bmp", ".zip" } のような配列か?

>>915
ファイル名から拡張子を取る、という正規表現のつもりかな?
その間違いはなんというか

"DENGER.txt          .exe"
"DENGER.<RTL>txt.exe"

みたいなのを平気で実行するのに通じるものがあるな

920 :デフォルトの名無しさん:2010/02/25(木) 11:44:49
>>919
>>915じゃないが
validな拡張子付きファイル名がすでに用意されていて
そこからさらに拡張子を分離するための正規表現
と見るなら妥当じゃないか?

文字クラス内のドットにエスケープは必要ないが。

921 :デフォルトの名無しさん:2010/02/25(木) 12:30:57
[韓国ドラマ]
(韓国ドラマ)
【韓国ドラマ】

のいずれかにマッチする正規表現を"韓国ドラマ"が一度だけで済むように
記述する方法はないでしょうか?

922 :デフォルトの名無しさん:2010/02/25(木) 12:58:39
(?(condition)yes-pattern)を使えばできる。

/(?:(\[)|(\()|(\【))
韓国ドラマ
(?(1) \] )
(?(2) \) )
(?(3) \】 )
/x

923 :デフォルトの名無しさん:2010/02/25(木) 13:28:57
>>920
ドットを複数含むファイル名はvalidだし、
拡張子というのは最後のドット以降のことなんだが


924 :デフォルトの名無しさん:2010/02/25(木) 13:32:09
RFCとかあるの?
hoge.tar.gzの拡張子は.gz?それとも.tar.gz?

925 :デフォルトの名無しさん:2010/02/25(木) 13:44:06
拡張子に統一規格なんてないよ
アプリ側が拡張子を見て判断することはあっても

926 :デフォルトの名無しさん:2010/02/25(木) 13:49:13
拡張子はあくまでアプリケーションの関連付けとか人間が見て分かりやすくとか
そのくらいの意味しかないもな
プログラムからすればファイルの先頭のヘッダーを読み取るとかして初めて
中身が自分で処理できるかどうか判断できるわけだし

その辺をうまくやってるのが偽装gifか
人間はjpgと判断してるんだが中身がgifってやつ
画像表示ソフトはjpgもgifも対応してるのがほとんどなので
拡張子に関係なく中の情報でgifとして再生するから
ああいう結果になる

927 :デフォルトの名無しさん:2010/02/25(木) 13:59:09
MacとかDarwinとか拡張子あってもなくても関係ないし

928 :デフォルトの名無しさん:2010/02/25(木) 14:05:59
質問者さんが foo.src.tar.gz.md5 でどこまで欲しいのかもわからないし
ほかの要件ももひとつわからないから詳細待ちでいいんじゃないかな。

929 :デフォルトの名無しさん:2010/02/25(木) 15:25:31
>>924
925の言うように規格は存在しないが、大勢としては"最後のドットとそれに続く文字列"
少なくともWindowsではそうなっている。他にはPythonやRubyの標準ライブラリでも同様

あと、Unix系だとそもそもextension(拡張子)と呼ぶ文化がないけど、
.tar.gzをさして単にsuffix(接尾辞)と呼ぶことはある

930 :デフォルトの名無しさん:2010/02/25(木) 17:03:43
httpdでMIME TYPEを決めるのにも使うな

931 :デフォルトの名無しさん:2010/02/25(木) 17:23:31
なんでおまえら拡張子の話してんだよ。スレ間違えたかと思ったじゃねーか。

932 :デフォルトの名無しさん:2010/02/25(木) 17:53:20
元の質問者が正確に要望を提示できるように?

933 :デフォルトの名無しさん:2010/02/25(木) 19:47:40
>>921
鬼車が使えるなら
/(?<e>韓国ドラマ)??\[\g<e>\]|\(\g<e>\)|【\g<e>】/
でもいい。かな?

934 :914:2010/02/25(木) 21:27:36
>>915
$1:txt,*.bmp,*.zip
こんな結果が得られました、期待してない結果です

>>919
入力はそれ以外の可能性がああります
"*.txt,*.bmp,*.zip"の数が3個と決まってるなら
正規表現"([^,.]+\\.[^,.]+),?([^,.]+\\.[^,.]+),?([^,.]+\\.[^,.]+),?"で取得できたのですが
入力が3個と決まってないのでどうすればいいのかわからないのです

>>928
foo.src.tar.gz.md5 の場合 .md5が欲しいです

ちなみに正規表現のライブラリにはboost使ってます

935 :デフォルトの名無しさん:2010/02/25(木) 21:59:18
>>934
色々突っ込みどころ満載だな。

boost使ったことはないんだけど
boostにはJavaやPerlのsplitメソッドのような関数は無いの?

文字列は本当に"米印dot拡張子"をカンマでつなげたものなの?
実は"foo.txt,bar.bmp,baz.zip,hoge.tar.gz"だったりする?

キャプチャ($1)は部分式の個数の上限が不定の場合には使えないよ。
正規表現一発で解決しなければいけない問題なの?

936 :914:2010/02/25(木) 22:14:42
>>935
Perlのsplit
調べてみたら セパレータによる文字列分割 みたいですね
boostにtokenizerというトークン切り分けがあるのでこれが使えるのかな?

>キャプチャ($1)は部分式の個数の上限が不定の場合には使えないよ。
どうやら自分のしたいことは正規表現では無理みたいですね
自分で文字処理していこうと思います

937 :914:2010/02/25(木) 22:20:26
書き忘れた

>文字列は本当に"米印dot拡張子"をカンマでつなげたものなの?
>>934で書いたように”入力はそれ以外の可能性がああります ”

つまり>実は"foo.txt,bar.bmp,baz.zip,hoge.tar.gz"だったりする?
の可能性もあるわけです

938 :デフォルトの名無しさん:2010/02/25(木) 22:26:19
my $str = '*.foo,..,*.dummy.*.bar, file.baz,,,foo.src.tar.gz';
my @suffix = $str =~ /(\.[^.,]+)(?:,|$)/g;
print join ' ', @suffix;

.foo .bar .baz .gz

boost のことはよくしらない。

939 :デフォルトの名無しさん:2010/02/26(金) 00:46:42
はげしく香ばしいな

940 :デフォルトの名無しさん:2010/03/01(月) 21:38:47
test

941 :デフォルトの名無しさん:2010/03/05(金) 14:30:14
秀丸エディタで正規表現がうまくいきません。
コメントで挟まれた文章(/*と*/も消します)を消したいのですがうまくできません。
ちなみにここでは文章は3行ですが、文章の量がいつも変わるので10行のときもあれば100行のときもあります。


検索→/\*.*?\*/
置換→


内容↓
/*
さようなら
わたしの
こいびとよ
*/

942 :デフォルトの名無しさん:2010/03/05(金) 14:32:03
ひでまるw

943 :デフォルトの名無しさん:2010/03/05(金) 15:48:08
テキストエディタ固有の正規表現はよくわからんけど

(/\*[改行コード])([有象無象の文字コード])(*/[改行コード])

[]で囲ったのは自分で対応してね

で引っかかるんじゃないの?

944 :デフォルトの名無しさん:2010/03/05(金) 15:50:18
ちょっとミスった

(/\*[改行コード])([有象無象の文字コード])(\*/[改行コード])

945 :デフォルトの名無しさん:2010/03/05(金) 15:53:25
>>941
秀丸じゃ無理だよ。
理由はヘルプに書いてある。(\nを使った複数行検索の際の制限について)


946 :デフォルトの名無しさん:2010/03/05(金) 16:40:47
s/\(ん\)\(ち\)/\2\1\2\1/g

947 :デフォルトの名無しさん:2010/03/05(金) 17:02:39
複数行も扱えないエディタってカスだな

948 :デフォルトの名無しさん:2010/03/05(金) 17:30:37
vim使えビィームッ!

949 :デフォルトの名無しさん:2010/03/05(金) 23:27:49
>>941
hmjre.dllの代わりにbregonig.dll(鬼車)を使えばできる
ttp://homepage3.nifty.com/k-takata/

以下の正規表現は詳解3版p.270から引用
/\*[^*]*\*+([^/*][^*]*\*+)*/

950 :デフォルトの名無しさん:2010/03/06(土) 09:42:36
Perl5.8で置換したい
JSON.pmを使わずに「=>」を「:」に変換し、各項目を「"」で囲みたい
とくに項目を「"」で囲む部分が分かりません

↓変換前
xml.data = {
xmlns => http://aaaa.org/rss/1.0/,
item => [
{
dc:subject => あいうえお,
description => 本日は雨なり。
},
]
}

↓変換後
xml.data = {
"xmlns" : "http://aaaa.org/rss/1.0/",
"item" : [
{
"dc:subject" : "あいうえお",
"description" : "本日は雨なり。"
},
]
}

951 :デフォルトの名無しさん:2010/03/06(土) 10:53:38
>>949
ありがとうございます

952 :デフォルトの名無しさん:2010/03/07(日) 13:28:19
誰だ性器表現書いた奴は……

953 :デフォルトの名無しさん:2010/03/08(月) 12:37:36
perl使用
入力はCSVで1行ずつ、行中のハイフン1文字をゼロ文字列または
数字のゼロにしたいのですが書き方が判りませぬ。
無い頭で「s/-/$_/」こう書いたらひどいことになりましたw
アドバイス下さい。


954 :デフォルトの名無しさん:2010/03/08(月) 13:52:28
なぜ置換文字列にそんなものを書くのか理解できないw

955 :953:2010/03/08(月) 16:34:43
>>954
どうも根本的なことが理解できていないようで…

956 :953:2010/03/08(月) 16:35:45
途中で送信しちゃったorz

正規表現は諦めてsplitで分割してチマチマとif分かませることにしました

957 :デフォルトの名無しさん:2010/03/08(月) 16:40:25
$ echo 'hoge-fuga--boo' | perl -pe 's/-/0/g'
hoge0fuga00boo

958 :デフォルトの名無しさん:2010/03/08(月) 16:45:10
<BR/><A href="http://aaa/bbb/ccc/?id=12345">リンク先URL</A>

というタグと

<BR/><A href="http://ddd/eee/fff/ggg/0001.jpg">画像URL</A>

というタグが混在したソースの中から

「.jpg を含まないもの」 をマッチさせたいのですが、どのように書けばいいでしょうか

共通しているのは

・行頭が<BR/>で始まっている
・<BR/><A href="http:// までは どのリンクも同じ
http:// 以降は、いろんなURLが混在、/の数も不確定
・末尾の "> と </A> の間にはいろんなテキストが入っている

よろしくお願いいたします。。。

959 :デフォルトの名無しさん:2010/03/10(水) 18:23:08
>>958
「.jpg を含まないもの」というのが「URL中のどこにも含まない」という意味であれば

^<BR/><A href="http://((?!\.jpg).)*?">.*?</A>

「拡張子としては含まない」という意味(多分こっちの意味だと思うけど)であれば

^<BR/><A href="http://((?!\.jpg").)*?">.*?</A>

否定先読みを使うから処理系依存だね。

960 :デフォルトの名無しさん:2010/03/11(木) 12:40:30
>>958
質問する前に自分で考えた解を書け
何回目だ

961 :デフォルトの名無しさん:2010/03/14(日) 01:53:37
●正規表現の使用環境
Python3.0

●検索か置換か?
検索

●説明
特定の単語を含まないURLを検索したい

●対象データ
http://hoge.net/123/
http://hoge.net/abc/
http://hoge.net/XYZ/
http://hoge.net/bad/
http://hoge.net/OTZ/

●希望する結果
http://hoge.net/123/
http://hoge.net/abc/
http://hoge.net/xyz/
にはマッチするが、
http://hoge.net/bad/
http://hoge.net/OTZ/
にはマッチしない。

今とのところ
^http://hoge.net/([a-zA-Z0-9]+)/$
で抜き出して、後からプログラム側でばbadとOTZを含む結果を除外しています。

正規表現で可能なのでしょうか。
ご教授お願いいたします。

962 :デフォルトの名無しさん:2010/03/14(日) 01:58:18
否定先読み(?!...)でできるけどそのやり方が一番いいよ

963 :デフォルトの名無しさん:2010/03/14(日) 02:14:47
レスありがとうございます。
今までどおりプログラム側で処理しようと思います。

964 :正規表現 Part7:2010/03/15(月) 08:03:07
正規表現(Regular Expression)スレです。

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

【 前スレ 】 正規表現 Part6
http://pc12.2ch.net/test/read.cgi/tech/1241537764/

965 :デフォルトの名無しさん:2010/03/17(水) 04:10:43
全角と全角に挟まれた一個の半角スペースにマッチさせるにはどう書いたらいいですか?

966 :965:2010/03/17(水) 04:18:39
UTF-8の全角文字です
すいません

967 :デフォルトの名無しさん:2010/03/17(水) 11:44:54
Perlであれば。

$str =~ /[\x80-\xBF] [\xC2-\xFD]/;

でいけると思う。
UTF-8の文字コードで、マルチバイト文字の始まりは必ず0xC2〜0xFDの間で、マルチバイト文字の終わりは必ず0x80〜0xBFだから、
ただ、マルチバイト文字ではなく全角文字という条件であると、半角カタカナの扱いをどうするか、などがあります。

968 :デフォルトの名無しさん:2010/03/17(水) 12:56:56
それだと半角スペースの前後もマッチ結果に含まれるから
先後読み入れた方がいいんじゃないかな

969 :デフォルトの名無しさん:2010/03/17(水) 13:16:06
ああ、1個の半角スペースにマッチさせる、ってあるからその通りだね。
でもマッチ結果に半角スペース1個って必要なの?

970 :デフォルトの名無しさん:2010/03/17(水) 14:28:04
つ 痴漢

971 :デフォルトの名無しさん:2010/03/17(水) 14:29:03
HTMLのようにホワイトスペース(改行含む)をまとめられたとかで
英単語境界を壊さずに日本語の 間に挟まった スペースを 取り除きたい のかもしれない

972 :デフォルトの名無しさん:2010/03/17(水) 14:33:17
マッチングに気を取られてて置換を忘れてた・・・死にたい・・・
確かにこのマッチングで>>971のことができるね

973 :デフォルトの名無しさん:2010/03/17(水) 14:45:13
<p>全角に挟まれた→
←半角スペース(xhtmlのソース)</p>

これをレンダリングすると1行目の改行が半角スペースになって"→ ←"になる

というのを想像したが、これの除去が目的だと改行がマッチ対象だな

974 :デフォルトの名無しさん:2010/03/17(水) 15:28:49
>これをレンダリングすると
だからそれをブラウザからコピペすると挟まるんだよ
改行を処理すれば済むケースはレンダリングしてないデータ

975 :965:2010/03/17(水) 16:12:26
>>971
まさしくその通りです!エスパーさんありがとう

処理系も書かなきゃダメだったんですね
えと、Vimの置き換えで使おうと思ってました。

976 :デフォルトの名無しさん:2010/03/17(水) 18:12:47
>>975
:%s /\W[ ]\{1}\W/g

977 :デフォルトの名無しさん:2010/03/18(木) 12:28:37
マッチ
/[\x80-\xBF][ ]\{1}[\xC2-\xFD]

削除
:%s /[\x80-\xBF][ ]\{1}[\xC2-\xFD]//g

こうかな?

978 :デフォルトの名無しさん:2010/03/18(木) 14:46:23
vimだと1個の数量指定が必要なのか

979 :デフォルトの名無しさん:2010/03/18(木) 18:45:33
いや、>>965が一個の半角スペースって言ってるから

980 :デフォルトの名無しさん:2010/03/19(金) 13:50:16
全角文字と半角文字(ただし空白文字でない)が連続しているところをみつけたら
半角スペースを挿入する処理はどう書けば良いでしょうか。
#############################################################################
●正規表現の使用環境
秀丸エディタ
ttp://homepage3.nifty.com/kons/hidemaru/helpsite/hidemaru/html/190_CmdSearch_Regular.html
ttp://homepage3.nifty.com/kons/hidemaru/helpsite/hidemaru/html/190_CmdSearch_Regular_PerlTag.html
●検索か置換か?
置換
●説明
<全角文字><半角文字(ただしタブ\tでも半角スペース でも改行\nでもない)>
または
<半角文字(ただしタブ\tでも半角スペース でも改行\nでもない)><全角文字>
となっているところをみつけたら
半角スペースをその間に挿入する置換正規表現を教えてください。
空白文字
●対象データ
秀丸エディタは最初OS/2用に開発され、その後Windowsへ移植された(OS/2版はフリーソフトウェア)。Win
dows 3.1時代より、定番のエディタとして使われてきた。1995年に32bit対応をした後は、Windows を代表するエディタ
として広くその名を知られるようになる。公開当初より本体価格が4000
円(現在では消費税により購入価格4200円になる)のシェアウェアであるにも関わらず、
人気は高く、企業で一括して導入される場合もある。
●希望する結果
秀丸エディタは最初 OS/2 用に開発され、その後 Windows へ移植された( OS/2 版はフリーソフトウェア )。 Win
dows 3.1 時代より、定番のエディタとして使われてきた。 1995 年に 32bit 対応をした後は、 Windows を代表するエディタ
として広くその名を知られるようになる。公開当初より本体価格が 4000
円(現在では消費税により購入価格 4200 円になる)のシェアウェアであるにも関わらず、
人気は高く、企業で一括して導入される場合もある。
#############################################################################
よろしくお願い申し上げます。


981 :デフォルトの名無しさん:2010/03/19(金) 14:30:09
春だなぁ

982 :デフォルトの名無しさん:2010/03/19(金) 15:26:32
980 超えたので

正規表現 Part7
http://pc12.2ch.net/test/read.cgi/tech/1268979408/

983 :デフォルトの名無しさん:2010/03/19(金) 19:17:43
>>976-977
うそつき

984 :デフォルトの名無しさん:2010/03/19(金) 21:48:15
こうかなし

985 :デフォルトの名無しさん:2010/03/19(金) 22:20:39
こうかりんご

986 :デフォルトの名無しさん:2010/03/20(土) 01:32:16
青葉りんご

987 :デフォルトの名無しさん:2010/03/20(土) 01:58:41
 

988 :デフォルトの名無しさん:2010/03/20(土) 16:07:56
>>980
秀丸エディタのスレに行っておいでよ

989 :デフォルトの名無しさん:2010/03/20(土) 16:56:19
>>988
分かりました。
ありがとうございました。


990 :デフォルトの名無しさん:2010/03/21(日) 12:29:13
>>988
せっかく答えてくれた人いるのに後だし条件だした上に自分で調べる気もなさそう、ということで秀丸エディタのスレで拒否られてる
で、秀丸エディタのスレであって正規表現を聞くところじゃないんだって言われて、また正規表現スレで聞けとか言われてる

思わずワロタ

991 :デフォルトの名無しさん:2010/03/21(日) 18:49:19
質問者がただいま秀丸スレで暴れてるので引き取りに来ていただけますか?

992 :デフォルトの名無しさん:2010/03/21(日) 18:58:09
>>991
このスレなら引き取ってもどうせすぐなくなるからいいんでない?
と言うか何で暴れ出す流れになったの?

993 :デフォルトの名無しさん:2010/03/21(日) 21:31:03
回答できない秀丸住人が暴れてるとエスパー


994 :デフォルトの名無しさん:2010/03/21(日) 21:34:22
セルフエスパー現る

995 :デフォルトの名無しさん:2010/03/21(日) 22:27:49
あと5レス分で良ければ快く引き取ろう。
でも次スレまで持ち越したくはないな。

996 :デフォルトの名無しさん:2010/03/21(日) 22:47:48
990の流れの後
お前らに聞いても無駄っぽいから自力で解決したぜ宣言して退場
結果的にスレは荒れたし顰蹙は買ってるが暴れまわってるわけではない

997 :デフォルトの名無しさん:2010/03/21(日) 23:02:52
結局 自決したのか。
見に行ってみようかな


998 :997:2010/03/21(日) 23:25:44
見てきた。
便乗して荒らすヤツが居て良い荒れっぷりだった。



スレ梅。

999 :デフォルトの名無しさん:2010/03/22(月) 00:10:07
スレ梅。

1000 :デフォルトの名無しさん:2010/03/22(月) 00:11:02
スレ梅。

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

244 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)