正規表現 Part8
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2011/03/26(土) 00:38:06.48質問する場合は実装言語や処理系ソフトウェア名を示しておくと話が早いです。
正規表現 Part7
http://hibari.2ch.net/test/read.cgi/tech/1268979408/
0002デフォルトの名無しさん
2011/03/26(土) 01:09:51.73正規表現メモ
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/
0003デフォルトの名無しさん
2011/03/26(土) 01:10:52.77[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/
0004デフォルトの名無しさん
2011/03/26(土) 01:11:41.35●正規表現の使用環境
Java1.5
●検索か置換か?
検索
●説明
各行の1番目のAまでを検索したい
●対象データ
ABCA
BCAA
CABA
●希望する結果
ABCA
^
BCAA
^^^
CABA
^^
0005デフォルトの名無しさん
2011/03/26(土) 13:27:53.720006デフォルトの名無しさん
2011/03/27(日) 17:45:43.260007デフォルトの名無しさん
2011/03/27(日) 18:17:41.22JavaScript
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
0008デフォルトの名無しさん
2011/03/27(日) 19:28:21.14perlのってないですかね
0009デフォルトの名無しさん
2011/03/30(水) 11:49:01.94●正規表現の使用環境
EmEditor
●検索か置換か?
置換
●説明
鍵カッコ内の文字列と前方の文字列を入れ替えたい。
●対象データ
AAA「BBB」/CCC「DDD」/EEE「FFF」…YYY「ZZZ」
●希望する結果
BBB「AAA」/DDD「CCC」/FFF「EEE」…ZZZ「YYY」
0010デフォルトの名無しさん
2011/03/30(水) 16:26:48.54試してないけど
検索: ([^「」/]+)「([^」]+)」
置換: \2「\1」
0011デフォルトの名無しさん
2011/03/31(木) 09:04:29.54ありがとうございます!
0012デフォルトの名無しさん
2011/04/03(日) 22:46:00.44秀丸(複数行置換)
●検索か置換か?
置換
●説明
上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
0013デフォルトの名無しさん
2011/04/03(日) 23:22:18.38置換 name=\1\ncolor=\2\nstyle=2
0014デフォルトの名無しさん
2011/04/03(日) 23:37:55.17無事出来ました、どうもありがとうございます!
0015デフォルトの名無しさん
2011/04/07(木) 17:46:48.45マッチした文字列を、マッチした文字列の最初の一文字で置換したいです。
たとえば、
りんご
ごりら
ぼーる
だと、
り
ご
ぼ
に置換したいです。
置換前の正規表現と、置換後の正規表現はどのようにすればよいのでしょうか?
0016デフォルトの名無しさん
2011/04/07(木) 18:00:09.970017デフォルトの名無しさん
2011/04/07(木) 18:02:48.07アドオンみたいなのでいけるようになります。
0018デフォルトの名無しさん
2011/04/07(木) 19:57:20.75置換 \1
0019デフォルトの名無しさん
2011/04/10(日) 01:24:00.50よろしくお願いします。
●正規表現の使用環境
VB.NET2003
●検索か置換か?
検索
●説明
果物の名前を検索したい
●対象データ
箱の色・箱A/緑、箱B/橙、箱C/黄、箱D/赤
箱の中身・箱A/メロン、箱B/みかん、箱C/バナナ、箱D/りんご
箱の大きさ・箱A/100cm、箱B/120cm、箱C/140cm、箱D/160cm
●希望する結果
メロン
みかん
バナナ
りんご
0020デフォルトの名無しさん
2011/04/10(日) 01:46:27.240021デフォルトの名無しさん
2011/04/14(木) 23:47:33.90「%20」や「%26」や2バイト文字を含むURLで動作しないので
例:http://lh5.ggpht.com/_yIvKcqI3wVA/TabN39xH8HI/AAAAAAAADbA/JAurXpYyStQ/s128/open%20mouthed%20scared%20cat.jpg
動作するように、ご教授お願います
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-]を[^/]に変える
あとは考えてくれ
0023デフォルトの名無しさん
2011/04/15(金) 15:51:46.12var elems = url.split(/\//); /* このあたりがそこはかとなくスレの趣旨に合致 */
var filename = elems.pop(); elems.pop(); elems.push(filename);
var new_url = elems.join('/');
0024デフォルトの名無しさん
2011/04/16(土) 16:39:05.13C#.Net
●検索か置換か?
検索
●対象データ
data
(data
data)
(data)
Xdata
dataY
●希望する結果
data
dataが()XY以外と隣接している場合は検索を一致させたくないのですが、
それが中々できません。
よろしくお願いします。
002524
2011/04/16(土) 17:12:20.27dataの部分をグループにまとめたいです
0026デフォルトの名無しさん
2011/04/16(土) 20:41:22.03((?<=[()XY])data|data(?=[()XY])|(?<=[()XY])data(?=[()XY]))
一番上のdataも含めるなら
((?<=[()XY])data|data(?=[()XY])|(?<=[()XY])data(?=[()XY])|^data$)
追記はよくわからん
0027デフォルトの名無しさん
2011/04/16(土) 21:58:05.25とは違うのか?
0028デフォルトの名無しさん
2011/04/16(土) 22:12:13.20>()XY以外と隣接している場合は検索を一致させたくない
ということなので()XYに隣接してるdataが引っかかるようにしといた
0029デフォルトの名無しさん
2011/04/16(土) 23:02:36.31現在出先なのでまだ確認できませんが、家に帰ったらやてみようと思います。
>>28
data
(data
dataY
などは一致させたいのですが、
bigdata
などは一致させたくないのです
分かりづらくてすいません
0030デフォルトの名無しさん
2011/04/17(日) 13:54:16.70特定のURLは"mt=8"と"hibari"が含まれたURLです
[^(mt=8)(hibari)]
と試しましたが駄目でした。どのようにすればよいのでしょうか?
0032デフォルトの名無しさん
2011/04/17(日) 18:00:16.76^((?<!mt=8).(?!mt=8))*$
^((?<!hibari).(?!hibari))*$
正規表現を複数登録できるならこの2つでいける
なんとか1つにまとめようとしたんだけど無理だったわ。
1つにまとめれる人いたらやり方教えて
二つを併用しようとしたら全部のレスが消えてしまったのですが、上の
^((?<!mt=8).(?!mt=8))*$
だけでも絶大な効果だったので下のは諦めることにします
有難うございました!
0034デフォルトの名無しさん
2011/04/17(日) 20:52:05.01(Perl正規表現雑技を見ながら)
両方の文字列を共に含まないなら
^(?:(?!mt=8.*hibari)(?!hibari.*mt=8).)*$
どちらか一方でも含まないなら
^(?:(?!mt=8)(?!hibari).)*$
でいけるっぽい
003532
2011/04/17(日) 21:28:07.66量指定子って先後読みには使えないと思ってたけど
使えないのは後読みだけなのか。間違って覚えてた
先後読み両方使うより先読みだけのほうがスマートだな
勉強になった。ありがとう
0038デフォルトの名無しさん
2011/04/19(火) 02:20:36.99[^/]でいけました
ありがとうございましたm(_ _)m
0039デフォルトの名無しさん
2011/04/21(木) 21:50:15.99C:\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行毎に、行頭からその行の最後の\記号までを指定できるのですか?
0040デフォルトの名無しさん
2011/04/21(木) 22:11:05.31それはともかく使ってる処理系かエディタの名前書いたほうがいいよ
バックスラッシュがややこしい
0041デフォルトの名無しさん
2011/04/21(木) 22:15:07.07バックスラッシュがややこしいとは?
0042デフォルトの名無しさん
2011/04/21(木) 22:16:47.46>>40
どうぞ
http://www.egyptian.jp/goods/rosetta-l.JPG
0043デフォルトの名無しさん
2011/04/21(木) 22:17:03.210044デフォルトの名無しさん
2011/04/21(木) 22:17:49.21どう考えてもURLからしてロゼッタストーンです
本当にありがとうございました
0045デフォルトの名無しさん
2011/04/21(木) 23:07:35.97うーん…
ピリオドが一文字を表してて、その繰り返しだからアスタリスクを使ったんだけど。
[^\n]は、[]の中は先頭が改行じゃ無いって事だとは解るんだけど。
[]で囲むのと、どれかに一致で、先頭が改行の時は除外するって事になるのかな。
最初、ピリオド・アスタリスクとしていたけど、アスタリスクの意味を理解して無かったって事かな?
0046デフォルトの名無しさん
2011/04/21(木) 23:29:26.29文字クラスの理解が怪しい感じかな
http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE#.E6.96.87.E6.B3.95
ところで>>42で希望通りの動作になった?
0047デフォルトの名無しさん
2011/04/21(木) 23:30:45.33.は任意の文字で通常は改行は含まれないがオプションなどで動作が変わる
.*は欲張りなマッチとか言われてて、とりあえず取れるとこまで進めてから
バックトラックしながらその後の条件があれば取捨選択していく
0048デフォルトの名無しさん
2011/04/21(木) 23:50:00.45あ、スミマセン。
実験したのですが、何もヒットしないでした。
使ってる状況なんですが、TeraPadと言うテキストエディタの外部ツールのTpRegExpなんです。
なんか、正規表現が、こんなに方言化してると思わず、状況後出しに成ってるのが、申し訳ないです。
0049デフォルトの名無しさん
2011/04/22(金) 00:16:11.73\f[^\n]*\\
一応リファレンスは調べてみたけど試してはいない。
これでだめだったら、いっそのこと別のエディタにしてしまったほうが楽な気がする
こっちの環境(Mery)だと
.*\\
でも希望通りの動作になるよ
0050デフォルトの名無しさん
2011/04/23(土) 05:36:55.82望んだ動作に成りました。
この外部ツールが曲者なのかな。sakuraエディターだと、.*\\で望みの動作しました。
どうもでした。
毎回呪文を打ち込むのも面倒だなと、VBスクリプトでやろうとしたんだけど、挫折しました。
0051デフォルトの名無しさん
2011/04/25(月) 08:30:22.420052デフォルトの名無しさん
2011/05/06(金) 19:40:46.16php 4.4.9 だとマッチしますが、php 5.3.5 だとマッチしません。
何か原因がわかればご教示ください。よろしくお願いします。
0053デフォルトの名無しさん
2011/05/06(金) 20:58:11.44memory_limit は php5は 128M に、php4 は 32M にしています。
>>52 の OS は WindowsXP Home SP3 です。
0054デフォルトの名無しさん
2011/05/06(金) 22:05:22.990055デフォルトの名無しさん
2011/05/08(日) 11:41:05.08一応 php.ini です。 http://www1.axfc.net/uploader/File/so/62697
>>52 の aaaaaaaaa の部分を短くするとマッチします。
なんでかな…
0056デフォルトの名無しさん
2011/05/09(月) 17:22:10.19対象の文字列を減らすとマッチするのはこちらでも再現した。
なんだろうねぇ。。。。
0057デフォルトの名無しさん
2011/05/09(月) 17:41:43.51http://jp.php.net/manual/ja/pcre.configuration.php#ini.pcre.backtrack-limit
0058デフォルトの名無しさん
2011/05/09(月) 17:51:47.67pcre.backtrack_limit=200000 で動くようになりました。
0059デフォルトの名無しさん
2011/05/09(月) 19:02:42.70なるべくその設定を変更せずにすむように心がけよう。
0060デフォルトの名無しさん
2011/05/11(水) 09:47:04.06●正規表現の使用環境
PHP 5.2.9 (XAMPP 1.7.1)
●検索か置換か?
検索
●説明
入力文字が+、-、数字以外ならエラーを返す
●コード
preg_match("/^[+|-]*\d+$/g", $string)
(1行ごとに処理するので、/mは不要です)
●希望する結果
+100→○
-488→○
1024→○
*300→×
/200→×
Aaaa→×
ああ→×
0061デフォルトの名無しさん
2011/05/11(水) 10:06:04.62(\+|\-)[0-9]
0062デフォルトの名無しさん
2011/05/11(水) 11:11:25.84> (\+|\-)[0-9]
こちらを使用しました。意図した通りになりました。
正規表現に関係なく、素直に書いてみることが大事なんだと認識しました。
ありがとうございます。
0063デフォルトの名無しさん
2011/05/11(水) 11:13:41.25でもいいの?
0064デフォルトの名無しさん
2011/05/11(水) 12:38:21.59とりあえず (\+|\-) なんて書くくらいなら [\+\-] でいいだろ……
* 小数点や指数表記を考えない
* 最上位の桁が 0 の場合ははじく
* 符号のみの場合もはじく
って感じなら ^[\+\-][1-9]\d*$
0065デフォルトの名無しさん
2011/05/11(水) 13:17:27.58>> (\+|\-)[0-9]
>こちらを使用しました。意図した通りになりました。
1024 → × になりませんか?
0066デフォルトの名無しさん
2011/05/11(水) 13:21:49.740067デフォルトの名無しさん
2011/05/11(水) 14:11:09.38●正規表現の使用環境
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→×
0068デフォルトの名無しさん
2011/05/11(水) 14:17:50.19^[-+]?\d+$
0069デフォルトの名無しさん
2011/05/11(水) 15:34:39.84希望する結果にならなかった例を挙げない人だよね。
0070デフォルトの名無しさん
2011/05/11(水) 15:59:24.60情報の小出しになっていることは認めます。
0071デフォルトの名無しさん
2011/05/11(水) 23:07:49.3601→?
0072デフォルトの名無しさん
2011/05/22(日) 14:18:14.06122ch345673ch89
この文字列から2chと3chの間の文字だけを取得したいです
0073デフォルトの名無しさん
2011/05/22(日) 14:25:18.65実際にどう抜き出すかは使ってる言語やツール次第
0074デフォルトの名無しさん
2011/05/22(日) 14:32:36.53(?<=2ch).*?(?=3ch)
0075デフォルトの名無しさん
2011/05/22(日) 14:32:52.41VB.NETです
0076デフォルトの名無しさん
2011/05/22(日) 14:54:38.68正規表現は>>74のを使わせてもらった
using System;
using System.Text.RegularExpressions;
...
Match m = Regex.Match("122ch345673ch89", @"(?<=2ch).*?(?=3ch)");
Console.WriteLine(m);
34567
0077デフォルトの名無しさん
2011/05/22(日) 15:05:07.94Imports 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
0078デフォルトの名無しさん
2011/05/22(日) 15:50:24.680079デフォルトの名無しさん
2011/05/23(月) 10:39:22.11という感じの文字列からcccの値dddを取得したいです。
dddは可変でその部分にはセミコロンとカンマは入ることはありません。
(セミコロンは区切りとしては使いますが値としては使いません。)
cccは最後に書かれてる場合もあり、その場合は、
上記のeee=fffのように最後にセミコロンがつきません。
そこで正規表現なんですが、
ccc=(.*?;|[^;\,]+$)
という感じにしました。
後方参照で()内の部分を取り出したとき、
ccc=ddd;のときは、「ddd;」といった感じにセミコロンつきで取得され、
ccc=dddのときは、「ddd」といった感じにセミコロンなしで取得されます。
ccc=ddd;のときでもセミコロンなしで取得したいのですが、
正規表現のみで可能でしょうか?
0080デフォルトの名無しさん
2011/05/23(月) 11:16:21.88だけじゃだめなのかな?
先読み使えばこう書けるけど
ccc=(.*?(?=;)|[^;,]+$)
0081デフォルトの名無しさん
2011/05/23(月) 11:31:28.50ありがとうございます!
>ccc=([^;,]*)
これでとることができました。
正規表現難しいです><
0082デフォルトの名無しさん
2011/05/23(月) 13:48:15.55「\x○○」のところ。
str=@"[^\x00-\x22\x27-\x2D\x3A\-\x3B\x3F\x5B\x5D\x5E\x60\x7B-\x7D\x7F]+" ;
0083デフォルトの名無しさん
2011/05/23(月) 13:55:18.150084デフォルトの名無しさん
2011/05/24(火) 08:08:29.88ようするに[0-9a-zA-Z]+と同等なことをしたいのですが
[\w^_]+とかでは動きませんでした
どう書くのが正しいのでしょうか?
[0-9a-zA-Z]+でもいいのですが後学のために教えてください
0085デフォルトの名無しさん
2011/05/24(火) 08:13:54.23008684
2011/05/24(火) 08:17:33.28[\w][^_]+でたぶんいけました
スレ汚しすみません
0087デフォルトの名無しさん
2011/05/24(火) 08:22:48.26場合によっては正しく判定してるように見えることもあるけど
本質的には正しくない
0089デフォルトの名無しさん
2011/05/24(火) 08:58:22.69それ以外の書き方をしようとするのがそもそもの間違いだ
初心者の頃って、短く書くことが良いことで正しいとか勘違いしてる奴も多いけど
短く書くより分かりやすく書いた方が絶対いいから
まあ[0-9a-zA-Z]+を[a-zA-Z\d]+とするくらいなら、分かりやすさを損なってないからいいけどね
先読み、後読み使えば、\wから_除外したものの連続って表現も出来るけど
この程度のことに先読み、後読み使うなんて余りにも無駄すぎるので、
本当に分かってる奴は[0-9a-zA-Z]+か[a-zA-Z\d]+を使う
とりあえず、メタ文字として用意されているもの以外の文字集合はベタ書き、これ基本な
「5以外の数字」とかも\dから5を除外するのではなく[0-46-9]が一番良い
0090デフォルトの名無しさん
2011/05/24(火) 09:43:43.83文字クラスのintersection(&&)が使える処理系なら [\w&&[^_]]+
0091デフォルトの名無しさん
2011/05/24(火) 10:28:01.220092デフォルトの名無しさん
2011/05/24(火) 11:15:05.61分かりやすく書いた方が良いというアドバイスをしているのでは?
0093デフォルトの名無しさん
2011/05/24(火) 11:25:02.36なんで0-9が先にこないのか不思議。
n進数表記でも0からだし、ASCII char codesは0-9A-Za-zの順番だし、
なんか理由とかあるのかな?
0094デフォルトの名無しさん
2011/05/24(火) 12:21:01.67英数字
0095デフォルトの名無しさん
2011/05/24(火) 12:57:46.19\Wがあるならこんなふうに書けるけどちょっと分かりづらいよね
0096デフォルトの名無しさん
2011/05/24(火) 15:22:48.24まさに逆の発想
0097デフォルトの名無しさん
2011/05/24(火) 16:51:40.00読解性犠牲にして短くしてもしょーがない。
誰が見ても、人目で何を意味してるか解る、それが一番大事。
0098デフォルトの名無しさん
2011/05/24(火) 17:21:52.95そういうもんだし
そもそも読みやすさを求めるなら規約で正規表現禁止にするわ
0099デフォルトの名無しさん
2011/05/24(火) 17:51:31.12君にとってはそうなのかもしれないし、個人的にどう思ってようと勝手だけど
世間的にはそういう認識ばかりじゃないので、主観で断定するのは良くない
0100デフォルトの名無しさん
2011/05/24(火) 17:56:10.91実際コーディング規約で禁止にしてるところは多い
理由は複雑だから
0101デフォルトの名無しさん
2011/05/24(火) 17:58:40.47やめちまえ。
■ このスレッドは過去ログ倉庫に格納されています