1read 100read
2011年12月1期プログラム39: 正規表現 Part8 (934) TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
40: イナズマイレブン人気投票連投ツール (5)
41: MFC相談室 mfc22d.dll (53)
42: ★初心者にVisual C++を教えるスレ★ Part38 (106)
43: Cygwin + MinGW + GCC 相談室 Part 6 (446)

正規表現 Part8


1 :11/03/26 〜 最終レス :11/12/09
正規表現(Regular Expression)スレです。
質問する場合は実装言語や処理系ソフトウェア名を示しておくと話が早いです。
正規表現 Part7
http://hibari.2ch.net/test/read.cgi/tech/1268979408/

2 :
◆関連サイト
正規表現メモ
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 :
◆関連スレ
[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/
[6] http://pc12.2ch.net/test/read.cgi/tech/1241537764/
[7] http://hibari.2ch.net/test/read.cgi/tech/1268979408/

4 :
スルーされにくい質問のテンプレと例
●正規表現の使用環境
Java1.5
●検索か置換か?
検索
●説明
各行の1番目のAまでを検索したい
●対象データ
ABCA
BCAA
CABA
●希望する結果
ABCA
^
BCAA
^^^
CABA
^^

5 :


6 :
この勢いだとdat落ちしそうだな

7 :
ここで聞くより試した方が早いし
JavaScript
http://regexpal.com/
Ruby
http://www.rubular.com/
.NET
http://regex-recipe.frozenlib.net/
PHP
http://www.rider-n.sakura.ne.jp/regexp/regexp.php

8 :
>>7
perlのってないですかね

9 :
どなたかご教授ください・・・
●正規表現の使用環境
EmEditor
●検索か置換か?
置換
●説明
鍵カッコ内の文字列と前方の文字列を入れ替えたい。
●対象データ
AAA「BBB」/CCC「DDD」/EEE「FFF」…YYY「ZZZ」
●希望する結果
BBB「AAA」/DDD「CCC」/FFF「EEE」…ZZZ「YYY」

10 :
>>9
試してないけど
検索: ([^「」/]+)「([^」]+)」
置換: \2「\1」

11 :
>>10
ありがとうございます!

12 :
●正規表現の使用環境
秀丸(複数行置換)
●検索か置換か?
置換
●説明
上2行は条件付けの為に検索時に必要になり、置換時は style=0 のみ style=2 へ
変更したいです。
●対象データ
name=Relative
color=#000000
style=0
●希望する結果
name=Relative
color=#000000
style=2
********************************************
下のようにnameとcolorは値が変わるので.*としているのですが、
置換文の置換時に変更しないという書き方が分かりません。
分かる方おりましたら教えて下さいませ。
[検索条件]
name=.*
color=.*
style=0
[置換文]
name=
color=
style=2

13 :
検索 name=(.*)\ncolor=(.*)\nstyle=0
置換 name=\1\ncolor=\2\nstyle=2

14 :
>>13
無事出来ました、どうもありがとうございます!

15 :
Excelの置換で、
マッチした文字列を、マッチした文字列の最初の一文字で置換したいです。
たとえば、
りんご
ごりら
ぼーる
だと、



に置換したいです。
置換前の正規表現と、置換後の正規表現はどのようにすればよいのでしょうか?

16 :
最近のExcelって正規表現で検索・置換ができるようになったの?

17 :
>>16
アドオンみたいなのでいけるようになります。

18 :
検索 (.).*
置換 \1

19 :
繰り返しの処理は分かるので正規表現の書き方を教えて頂きたいです。
よろしくお願いします。
●正規表現の使用環境
VB.NET2003
●検索か置換か?
検索
●説明
果物の名前を検索したい
●対象データ
箱の色・箱A/緑、箱B/橙、箱C/黄、箱D/赤
箱の中身・箱A/メロン、箱B/みかん、箱C/バナナ、箱D/りんご
箱の大きさ・箱A/100cm、箱B/120cm、箱C/140cm、箱D/160cm
●希望する結果
メロン
みかん
バナナ
りんご

20 :
メロン|みかん|バナナ|りんご

21 :
.replace(/^(http:\/\/[\w-]+\.ggpht\.com\/(?:[\w-]+\/){4})s[\w-]+\/([\w-]+\.[\w-]+)$/, "$1$2")
「%20」や「%26」や2バイト文字を含むURLで動作しないので
例:http://lh5.ggpht.com/_yIvKcqI3wVA/TabN39xH8HI/AAAAAAAADbA/JAurXpYyStQ/s128/open%20mouthed%20scared%20cat.jpg
動作するように、ご教授お願います

22 :
また猫かよ
http://lh5.ggpht.com/_yIvKcqI3wVA/TabN39xH8HI/AAAAAAAADbA/JAurXpYyStQ/s128/open%20mouthed%20scared%20cat.jpg
http://lh5.ggpht.com/_yIvKcqI3wVA/TabN39xH8HI/AAAAAAAADbA/JAurXpYyStQ/open%20mouthed%20scared%20cat.jpg
最初以外の[\w-]を[^/]に変える
あとは考えてくれ

23 :
var url = "http://lh5.ggpht.com/.../s128/open%20mouthed%20scared%20cat.jpg";
var elems = url.split(/\//); /* このあたりがそこはかとなくスレの趣旨に合致 */
var filename = elems.pop(); elems.pop(); elems.push(filename);
var new_url = elems.join('/');

24 :
●正規表現の使用環境
C#.Net
●検索か置換か?
検索
●対象データ
data
(data
data)
(data)
Xdata
dataY
●希望する結果
data
dataが()XY以外と隣接している場合は検索を一致させたくないのですが、
それが中々できません。
よろしくお願いします。

25 :
すいません、追記です。
dataの部分をグループにまとめたいです

26 :
思いついたのをそのまま書いたらすげー長くなってしまった
((?<=[()XY])data|data(?=[()XY])|(?<=[()XY])data(?=[()XY]))
一番上のdataも含めるなら
((?<=[()XY])data|data(?=[()XY])|(?<=[()XY])data(?=[()XY])|^data$)
追記はよくわからん

27 :
^(data)$
とは違うのか?

28 :
最初はそれかと思った。でも
>()XY以外と隣接している場合は検索を一致させたくない
ということなので()XYに隣接してるdataが引っかかるようにしといた

29 :
皆さんありがとうございます。
現在出先なのでまだ確認できませんが、家に帰ったらやてみようと思います。
>>28
data
(data
dataY
などは一致させたいのですが、
bigdata
などは一致させたくないのです
分かりづらくてすいません

30 :
V2Cとか正規表現を使える2ch専ブラってマジ便利すぎるな。

31 :
正規表現でとあるスレの、特定のURLを含まないレスをあぼーんにしたいと考えています
特定のURLは"mt=8"と"hibari"が含まれたURLです
[^(mt=8)(hibari)]
と試しましたが駄目でした。どのようにすればよいのでしょうか?

32 :
mt=8とhibariを含まないURLにマッチでいいんだよね?
^((?<!mt=8).(?!mt=8))*$
^((?<!hibari).(?!hibari))*$
正規表現を複数登録できるならこの2つでいける
なんとか1つにまとめようとしたんだけど無理だったわ。
1つにまとめれる人いたらやり方教えて

33 :
>>32
二つを併用しようとしたら全部のレスが消えてしまったのですが、上の
^((?<!mt=8).(?!mt=8))*$
だけでも絶大な効果だったので下のは諦めることにします
有難うございました!

34 :
>>31,32
(Perl正規表現雑技を見ながら)
両方の文字列を共に含まないなら
    ^(?:(?!mt=8.*hibari)(?!hibari.*mt=8).)*$
どちらか一方でも含まないなら
    ^(?:(?!mt=8)(?!hibari).)*$
でいけるっぽい

35 :
>>34
量指定子って先後読みには使えないと思ってたけど
使えないのは後読みだけなのか。間違って覚えてた
先後読み両方使うより先読みだけのほうがスマートだな
勉強になった。ありがとう

36 :
>>34
おお、下の
^(?:(?!mt=8)(?!hibari).)*$
で望み通りになりました
>>34-35
本当に有難うございます!

37 :
>>26
ようやく自宅のPCを付けて確認することができました。
ありがとうございます。
私が望んでいた動きができました!

38 :
>>22-23
[^/]でいけました
ありがとうございましたm(_ _)m

39 :
Windowsなんですが、
C:\work\20110410dsk30.jpg
C:\work\2011419100002.jpg
D:\My Pictures\保存画像\カレイドスター\e2498f54.jpg
D:\My Pictures\保存画像\プリキュア\03cde8e1.jpg
D:\My Pictures\保存画像\プリキュア\10mai458354.jpg
こう言うフルパスからファイル名だけ抜き出したいのですが、「.*\\」とすると最後の10mai458354.jpgだけしか残りません。
どうすれば、1行毎に、行頭からその行の最後の\記号までを指定できるのですか?

40 :
ロゼッタの画像うpしてくれたらがんばって答える
それはともかく使ってる処理系かエディタの名前書いたほうがいいよ
バックスラッシュがややこしい

41 :
ロゼッタって誰?
バックスラッシュがややこしいとは?

42 :
^[^\n]*\\
>>40
どうぞ
http://www.egyptian.jp/goods/rosetta-l.JPG

43 :
円記号

44 :
>>43
どう考えてもURLからしてロゼッタストーンです
本当にありがとうございました

45 :
>>42
うーん…
ピリオドが一文字を表してて、その繰り返しだからアスタリスクを使ったんだけど。
[^\n]は、[]の中は先頭が改行じゃ無いって事だとは解るんだけど。
[]で囲むのと、どれかに一致で、先頭が改行の時は除外するって事になるのかな。
最初、ピリオド・アスタリスクとしていたけど、アスタリスクの意味を理解して無かったって事かな?

46 :
アスタリスクの意味はあってるよ
文字クラスの理解が怪しい感じかな
http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE#.E6.96.87.E6.B3.95
ところで>>42で希望通りの動作になった?

47 :
[]で囲っている文字クラス内の^は先頭じゃなくて否定
.は任意の文字で通常は改行は含まれないがオプションなどで動作が変わる
.*は欲張りなマッチとか言われてて、とりあえず取れるとこまで進めてから
バックトラックしながらその後の条件があれば取捨選択していく

48 :
>>46
あ、スミマセン。
実験したのですが、何もヒットしないでした。
使ってる状況なんですが、TeraPadと言うテキストエディタの外部ツールのTpRegExpなんです。
なんか、正規表現が、こんなに方言化してると思わず、状況後出しに成ってるのが、申し訳ないです。

49 :
^が行頭じゃない環境なのか、じゃあこっちで
\f[^\n]*\\
一応リファレンスは調べてみたけど試してはいない。
これでだめだったら、いっそのこと別のエディタにしてしまったほうが楽な気がする
こっちの環境(Mery)だと
.*\\
でも希望通りの動作になるよ

50 :
どうもです。
望んだ動作に成りました。
この外部ツールが曲者なのかな。sakuraエディターだと、.*\\で望みの動作しました。
どうもでした。
毎回呪文を打ち込むのも面倒だなと、VBスクリプトでやろうとしたんだけど、挫折しました。

51 :
///

52 :
PHP の preg に関して質問です。http://www1.axfc.net/uploader/File/so/62486.txt
php 4.4.9 だとマッチしますが、php 5.3.5 だとマッチしません。
何か原因がわかればご教示ください。よろしくお願いします。

53 :
Linux (CentOS) 上の PHP 5.1.6 だとマッチしました。
memory_limit は php5は 128M に、php4 は 32M にしています。
>>52 の OS は WindowsXP Home SP3 です。

54 :
mb入ってんの?

55 :
mbは有効になっています。
一応 php.ini です。 http://www1.axfc.net/uploader/File/so/62697
>>52 の aaaaaaaaa の部分を短くするとマッチします。
なんでかな…

56 :
なんだろうねぇ。
対象の文字列を減らすとマッチするのはこちらでも再現した。
なんだろうねぇ。。。。

57 :
適当だけどこれじゃまいか
http://jp.php.net/manual/ja/pcre.configuration.php#ini.pcre.backtrack-limit

58 :
ありがとうございます。それでした。
pcre.backtrack_limit=200000 で動くようになりました。

59 :
勉強になった。
なるべくその設定を変更せずにすむように心がけよう。

60 :
よろしくお願いします。
●正規表現の使用環境
PHP 5.2.9 (XAMPP 1.7.1)
●検索か置換か?
検索
●説明
入力文字が+、-、数字以外ならエラーを返す
●コード
preg_match("/^[+|-]*\d+$/g", $string)
(1行ごとに処理するので、/mは不要です)
●希望する結果
+100→○
-488→○
1024→○
*300→×
/200→×
Aaaa→×
ああ→×

61 :
[0-9\+\-]
(\+|\-)[0-9]

62 :
>>61
> (\+|\-)[0-9]
こちらを使用しました。意図した通りになりました。
正規表現に関係なく、素直に書いてみることが大事なんだと認識しました。
ありがとうございます。

63 :
A+10 ○
でもいいの?

64 :
突っ込みどころ満載だが
とりあえず (\+|\-) なんて書くくらいなら [\+\-] でいいだろ……
* 小数点や指数表記を考えない
* 最上位の桁が 0 の場合ははじく
* 符号のみの場合もはじく
って感じなら ^[\+\-][1-9]\d*$

65 :
>>62
>> (\+|\-)[0-9]
>こちらを使用しました。意図した通りになりました。
1024 → × になりませんか?

66 :
(\+|\-)?[0-9]+

67 :
回答により実装し、問題が分かってきましたので、本来欲しかった結果と合わせて再度質問します。
●正規表現の使用環境
PHP 5.2.9 (XAMPP 1.7.1)
●検索か置換か?
検索
●説明
入力された文字列のエラーチェックで使用します。
入力文字が+、-、数字以外ならエラーを返します。
●正規表現を確認したサイト
HiFi Regex Tester
http://www.gethifi.com/tools/regex
●コード
if( !preg_match("/^(\+|\-)?[0-9]+$/", $string) ) {
  エラー文生成
}
(1行ごとに処理するので、/mは不要です)
●希望する結果
○:エラーではない、×:エラーとなる
0→○
+0→○
-0→○
+100→○
-488→○
1024→○
/200→×
Aaaa→×
ああ→×
12+1→×
5-10→×

68 :
>67
^[-+]?\d+$

69 :
>>67
希望する結果にならなかった例を挙げない人だよね。

70 :
>>69
情報の小出しになっていることは認めます。

71 :
1→○
01→?

72 :
長い文字列から文字列を抽出したいんだけど、どうすれば簡単ですか?
122ch345673ch89
この文字列から2chと3chの間の文字だけを取得したいです

73 :
正規表現自体は2ch(.+?)3chとかだけど
実際にどう抜き出すかは使ってる言語やツール次第

74 :
>>72
(?<=2ch).*?(?=3ch)

75 :
>>73
VB.NETです

76 :
じゃあC#でも大丈夫だよね
正規表現は>>74のを使わせてもらった
using System;
using System.Text.RegularExpressions;
...
Match m = Regex.Match("122ch345673ch89", @"(?<=2ch).*?(?=3ch)");
Console.WriteLine(m);
34567

77 :
VBじゃないと読めないかもしれない
Imports System.Text.RegularExpressions
Module Module1
 Sub Main()
  Dim m As Match = Regex.Match("122ch345673ch89", "(?<=2ch).*?(?=3ch)")
  If m.Success Then
   '隊長!発見しましたぞ!
   Console.WriteLine(m.Value)
  End If
 End Sub
End Module

78 :
隊長なごんだ。

79 :
aaa=bbb;ccc=ddd;eee=fff
という感じの文字列からcccの値dddを取得したいです。
dddは可変でその部分にはセミコロンとカンマは入ることはありません。
(セミコロンは区切りとしては使いますが値としては使いません。)
cccは最後に書かれてる場合もあり、その場合は、
上記のeee=fffのように最後にセミコロンがつきません。
そこで正規表現なんですが、
ccc=(.*?;|[^;\,]+$)
という感じにしました。
後方参照で()内の部分を取り出したとき、
ccc=ddd;のときは、「ddd;」といった感じにセミコロンつきで取得され、
ccc=dddのときは、「ddd」といった感じにセミコロンなしで取得されます。
ccc=ddd;のときでもセミコロンなしで取得したいのですが、
正規表現のみで可能でしょうか?

80 :
ccc=([^;,]*)
だけじゃだめなのかな?
先読み使えばこう書けるけど
ccc=(.*?(?=;)|[^;,]+$)

81 :
>>80
ありがとうございます!
>ccc=([^;,]*)
これでとることができました。
正規表現難しいです><

82 :
C#で以下のように書いた場合、これってASCIIコードをさすんだよね?
「\x○○」のところ。 
str=@"[^\x00-\x22\x27-\x2D\x3A\-\x3B\x3F\x5B\x5D\x5E\x60\x7B-\x7D\x7F]+" ;

83 :
asciiなら、"[#$%&./0-9<=>@A-Z\\_a-z~]"と同等だね。

84 :
Perl互換表現の\wからアンダースコアをとったものの連続を表現
ようするに[0-9a-zA-Z]+と同等なことをしたいのですが
[\w^_]+とかでは動きませんでした
どう書くのが正しいのでしょうか?
[0-9a-zA-Z]+でもいいのですが後学のために教えてください

85 :
[0-9a-zA-Z]+

86 :
すみません自己解決しました
[\w][^_]+でたぶんいけました
スレ汚しすみません

87 :
それ間違ってるよ
場合によっては正しく判定してるように見えることもあるけど
本質的には正しくない

88 :
>>87
そうですね
色々値かえて@とか想定外のもの入れたらマッチしてしまいましたorz

89 :
つーかさ、[0-9a-zA-Z]+で完璧に条件満たしてるんだから
それ以外の書き方をしようとするのがそもそもの間違いだ
初心者の頃って、短く書くことが良いことで正しいとか勘違いしてる奴も多いけど
短く書くより分かりやすく書いた方が絶対いいから
まあ[0-9a-zA-Z]+を[a-zA-Z\d]+とするくらいなら、分かりやすさを損なってないからいいけどね
先読み、後読み使えば、\wから_除外したものの連続って表現も出来るけど
この程度のことに先読み、後読み使うなんて余りにも無駄すぎるので、
本当に分かってる奴は[0-9a-zA-Z]+か[a-zA-Z\d]+を使う
とりあえず、メタ文字として用意されているもの以外の文字集合はベタ書き、これ基本な
「5以外の数字」とかも\dから5を除外するのではなく[0-46-9]が一番良い

90 :
>>84
文字クラスのintersection(&&)が使える処理系なら [\w&&[^_]]+

91 :
後学のためっていってるのに説教垂れる奴はなんなんだ

92 :
後学のために、短くまとめることにこだわるより
分かりやすく書いた方が良いというアドバイスをしているのでは?

93 :
ところでa-zA-Z0-9の順番が一般的だけど、
なんで0-9が先にこないのか不思議。
n進数表記でも0からだし、ASCII char codesは0-9A-Za-zの順番だし、
なんか理由とかあるのかな?

94 :
alphanumeric
英数字

95 :
[^\W_]
\Wがあるならこんなふうに書けるけどちょっと分かりづらいよね

96 :
>>95
まさに逆の発想

97 :
読解性って大事だよね。
読解性犠牲にして短くしてもしょーがない。
誰が見ても、人目で何を意味してるか解る、それが一番大事。

98 :
その意見には同意だけど正規表現に限っては難読でもいいわ
そういうもんだし
そもそも読みやすさを求めるなら規約で正規表現禁止にするわ

99 :
> そういうもんだし
君にとってはそうなのかもしれないし、個人的にどう思ってようと勝手だけど
世間的にはそういう認識ばかりじゃないので、主観で断定するのは良くない

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
40: イナズマイレブン人気投票連投ツール (5)
41: MFC相談室 mfc22d.dll (53)
42: ★初心者にVisual C++を教えるスレ★ Part38 (106)
43: Cygwin + MinGW + GCC 相談室 Part 6 (446)