正規表現道場 Part2 (393レス)
上下前次1-新
3(1): 2012/09/22(土)03:58 ID:??? AAS
AA省
4: 2012/10/15(月)10:43 ID:??? AAS
>>2
正規表現最新リンク集2005
外部リンク[html]:web.archive.org
個人名載ってるしこのまま外しちゃってもいいかもしれない
5(1): 2012/10/19(金)12:38 ID:ZQDqri43(1) AAS
過疎スレ状態になっているっぽいですが質問宜しいでしょうか?
6: 2012/10/19(金)12:44 ID:??? AAS
>>1
7: 2012/10/19(金)19:53 ID:??? AAS
質問は?
8(2): 2012/10/30(火)16:10 ID:??? AAS
>>5の人とは別人ですが質問がありますのでお願いします
拒否したいワード例
・ばか
・ばっかやろー
・ばーか
掲示板の拒否ワード機能を使って上のような言葉を
^(ばか|ばっか|ばーか)
このようにまとめているのですが、
もっと効率よくまとめられるような気がしています
^ば(0または任意の1文字)か
以上のように、
まとめることは可能でしょうか?
9(1): 2012/10/30(火)17:54 ID:??? AAS
ば.?か
ばいか(売価)とかも入るけどねー
10(1): 2012/10/30(火)21:28 ID:??? AAS
〜ばかり
ばっかり
ばんから
11(1): 2012/10/31(水)08:02 ID:??? AAS
ばんかい
バイカム
こういうのは>>8の指定の方が間違いがないね
12(1): 8 2012/10/31(水)12:31 ID:??? AAS
まさに、>>9のようにまとめるられる書式を知りたかったのです!が…
皆さんご指摘のことを読むと確かにおっしゃるとおりですよねー
ば.?か、のような書式で運用できるかできないか、
掲示板のログとにらめっこしてみることにします
ともあれ、お答えくださった皆さん、とても参考になり助かりました
ありがとうございました
13(2): 2013/01/29(火)08:17 ID:??? AAS
せめて同じ文字はまとめるか
^(ば(か|っか|ーか))
14(3): 2013/02/10(日)11:51 ID:m9q+FHWZ(1) AAS
パスワードの登録で
半角アルファベットと半角数字の組み合わせで8文字以上
という条件を考えてるんですが、以下じゃダメですよね?
preg_match('/^[a-zA-z0-9]{8,}$/', $s);
アルファベットと数字の組み合わせ(アルファベットも数字もどちらもある)とするには
どうしたら良いでしょうか?
15(1): 2013/02/10(日)12:46 ID:??? AAS
>>14みたいな正規表現のちょっとしたテクニック集とかどっかにまとまってないかね?
16(1): 2013/02/13(水)23:30 ID:??? AAS
/^(?=(.*\d[a-zA-Z].*)|(.*[a-zA-Z]\d.*))\w{8,}$/
数字英字 もしくは 英字数字という並びが存在する英数字8文字以上
17: 2013/02/14(木)00:13 ID:??? AAS
>>16を1回チェックするのと、
>>14と「英字を含む」「数字を含む」の計3回チェックするのとで、どのくらい
ここまで書いたところで自分でいろいろ試してみた。
$s = '3066058kczgr9784685fwn874fos847fos8djtkcrzu9q58nzfc';
for($i=0; $i<1000000 && preg_match('/^(?=(.*\d[a-zA-Z].*)|(.*[a-zA-Z]\d.*))\w{8,}$/', $s); $i++){} //2.3948659897 sec.
for($i=0; $i<1000000 && preg_match('/^[a-zA-z0-9]{8,}$/', $s) && preg_match('/[a-zA-z]/', $s) && preg_match('/[0-9]/', $s); $i++){} //5.7406949997 sec.
for($i=0; $i<1000000 && preg_match('/^[a-zA-z0-9]{8,}$/', $s) && !preg_match('/^[0-9]+$/', $s); $i++){} //3.9960801601 sec.
for($i=0; $i<1000000 && 8<=strlen($s) && ctype_alnum($s) && !ctype_digit($s); $i++){} //2.2285568714 sec.
$s = '1';
for($i=0; $i<1000000 && preg_match('/^(?=(.*\d[a-zA-Z].*)|(.*[a-zA-Z]\d.*))\w{8,}$/', $s); $i++){} //0.0000748634 sec.
for($i=0; $i<1000000 && preg_match('/^[a-zA-z0-9]{8,}$/', $s) && preg_match('/[a-zA-z]/', $s) && preg_match('/[0-9]/', $s); $i++){} //0.0000240803 sec.
for($i=0; $i<1000000 && preg_match('/^[a-zA-z0-9]{8,}$/', $s) && !preg_match('/^[0-9]+$/', $s); $i++){} //0.0000209808 sec.
for($i=0; $i<1000000 && 8<=strlen($s) && ctype_alnum($s) && !ctype_digit($s); $i++){} //0.0000181198 sec.
おもしろかった。
18: 2013/03/04(月)01:35 ID:??? AAS
>>13
これはひどい
19(1): 2013/03/09(土)22:12 ID:??? AAS
^([a-z]|[A-Z]|[0-9]){8,}$
はダメ?
20: 2013/03/09(土)23:24 ID:??? AAS
ダメ
21: 2013/03/10(日)23:50 ID:??? AAS
>>19
大文字と小文字を区別したいってことなら
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]{8,}$
でおk
22(2): 2013/03/18(月)20:02 ID:XSCUuGgi(1/2) AAS
すっごい初歩的だったらすまそ
外部リンク[php]:www.rider-n.sakura.ne.jp
で試す限りはうまくいくんだけどPHP上でうまくいかない。
スクリプト SJIS
マッチング文字列 SJIS
PHP内部文字エンコ SJIS
の環境下で
【サッカー】xxxxx【野球】
で最初のサッカーだけをマッチングしたいので
/^【([^】])】/i
としているんだけど、サッカーの時はマッチしない。
【テニス】xxxxx【卓球】ならちゃんとテニスがマッチする。
なんで?(´・ω・`)
23(1): 2013/03/18(月)20:21 ID:??? AAS
>>22
それだとテニスもマッチしないはずだが
[^】] は「 】」以外の1文字ってことになる
それとShift_JISなんて捨ててUTF-8使おうぜ
24: 2013/03/18(月)22:12 ID:XSCUuGgi(2/2) AAS
>>23
すません、[^】]+です。
SJISで何とか…
25: 2013/03/19(火)00:22 ID:??? AAS
mb_regex_encoding("sjis");
mb_ereg ("^【([^】]+)】" ,$txt,$ret);
pregはSJIS使えません
26: 2013/03/24(日)00:53 ID:??? AAS
>>22
文字列をアスキーコードに変換してから検索しろ
27: 2013/05/16(木)11:13 ID:??? AAS
javascriptでの正規表現で質問があります。
/^(?:(?:http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)*$/
上記はURLをチェックする簡単な正規表現だと思うのですが
そのURLがRSSかどうかチェックする正規表現にしたいのです
RSSの拡張子は .rss .rdf .xml です。
URLの最後の拡張子にこの文字列が入ってるかチェック出来るようにしたいのですが
どうすればいいでしょうか?
お願いします。
28(1): 2013/05/16(木)11:28 ID:??? AAS
最後をこれに差し替え
\.(rss|rdf|xml)$/
29: 2013/05/16(木)11:38 ID:??? AAS
>>28
レスありがとうございます
ただこれに差し替えるだけだと
外部リンク[rss]:www.example.com
これも正常として判断されてしまうのですがどうしたら良いでしょうか?
よろしくお願いします。
30(1): 2013/05/16(木)11:47 ID:??? AAS
[^\\/:,;*?"<>|]\.(rss|rdf|xml)$
31: 2013/05/17(金)09:33 ID:??? AAS
>>30
お礼遅くなってすいません
ありがとうございます!
うまくいきました!
32(1): 2013/07/20(土) NY:AN:NY.AN ID:75R8ikZF(1) AAS
PHPのpregでの正規表現について質問です。
<a href="外部リンク:www.test.jp title="test"><img src="test.png" alt="ALT" title="TITLE" /></a>
上記のようなHTMLを正規表現でヒットさせ、
<li>TITLE</li>
に変換させたいのですが、正規表現ではどう表したらいいのでしょうか?
33: 2013/07/21(日) NY:AN:NY.AN ID:??? AAS
保守
34(2): 2013/07/25(木) NY:AN:NY.AN ID:2TH+2Iiw(1) AAS
正規表現で解決できるのではと思い、こちらで質問させてください。
"ver.2 test.Test"という文字列を"ver.2 test. Test"のように
ピリオドの次の文字が大文字のときに限り半角スペースを挿入したいのですが
良い方法はないでしょうか?
35: 34 2013/07/25(木) NY:AN:NY.AN ID:??? AAS
>>34です。
正規表現のグループ化を用いることで解決できました。
安易に質問を投稿してしまい申し訳ございませんでした。
36: 2013/07/25(木) NY:AN:NY.AN ID:??? AAS
せっかくなのでその正規表現を書いておきますねくらいの気持ちが必要だ。
37: 2013/07/25(木) NY:AN:NY.AN ID:??? AAS
>>34
preg_replace('/\.(?=[A-Z])/','. ',$str);
38: 2013/09/06(金)20:12 ID:??? AAS
>>32
見ての通り超手抜きだけど例の通りか属性値のダブルクォートが無いぐらいならこれで大丈夫
検索文字列: /^(.+<img.+title=\")(.+)(\" \/><\/a>)$/
置換文字列: <li>$2</li>
外部リンク:regex101.com
> PHPのpregでの正規表現
実はPHP分からないんだけど↓みたいな感じ?w
preg_replace("/^(.+<img.+title=\")(.+)(\" \/><\/a>)$/i", "<li>$2</li>", $input_lines);
39(2): 2013/09/14(土)18:05 ID:0qKO1mtd(1) AAS
質問です。
PHP5で
preg_match ("/.*'.*/s", $_POST["value"])
としたときにvalueに「'」があってもマッチしない場合があるらしいのですがどういう文字列の場合でしょうか?
preg_matchはPCRE関数でPerl互換です。マルチバイトに対応していないのでその辺りに落し穴があるのかなと思うのですが。
40(1): 2013/09/14(土)19:42 ID:QgtFjJm6(1) AAS
FireFoxでRSSリーダにFeedlyを使っています。
NGワードフィルターが正規表現なのですが教えて頂けないでしょうか。
"韓国"というキーワードをフィルタリングしたいです。
外部リンク:userscripts.org
41(1): 2013/09/15(日)10:40 ID:??? AAS
>>39
マッチしない場合があるとは思えないけど、一応マッチしない場合があると言った人に聞いてみれば?
まぁ、$_POST["value"]が送信されて来なければ話は別だけど・・
ちなみにそれは preg_match("/'/", $_POST["value"]) のようにシンプルに書くこともできる
42: 2013/09/15(日)10:43 ID:??? AAS
>>40
使ったこと無いけど、"韓国"だったら完全一致なのでそのまま正規表現使わずに書けると思うけど
43: 2013/09/15(日)15:21 ID:??? AAS
2ch専ブラにおける2chmateのデバッグ用文字列のみの書き込みをNGにしたいです
2chMate 0.8.5.6 dev/HTC/HTL21/4.1.1
2chMate 0.8.5.4/SHARP/SBM003SH/2.3.4
↑こんなやつです
一応専ブラはjanestyleということでどなたか教えていただけませんでしょうか
44: 2013/09/16(月)04:52 ID:V1KLg8Lz(1) AAS
韓|トンスル|ニダ|
45: 39 2013/09/16(月)18:13 ID:??? AAS
>>41
マッチしない場合は無いようでした。
phpの設定の問題でpreg_matchがマッチできずfalseを返す場合があるらしいです。
46(2): 2013/09/19(木)16:03 ID:XGTpu0pg(1) AAS
最近2ちゃんで同じ文字列を数行繰り返す荒らしがいますが
最近2ちゃんで同じ文字列を数行繰り返す荒らしがいますが
最近2ちゃんで同じ文字列を数行繰り返す荒らしがいますが
↑こんな感じです
改行を挟まない場合もあります
Janeでこれをあぼーんしたいんですが
同じ文字列が数行続いたかを調べられる正規表現はありませんか
47(1): 2013/09/19(木)19:40 ID:??? AAS
>>46
1行文の2連投
外部リンク[html]:thinkarc.blogspot.jp
んでこれ以上は下で NGEx.txtを晒すスレ4
外部リンク:mattari.plusvip.jp
48: 46 2013/09/19(木)23:50 ID:??? AAS
>>47
ありがとうございます
無事あぼーん出来ました
直前の自分のレスも消えてます
49(2): 2013/09/22(日)00:52 ID:PBzP1rLU(1) AAS
下の文字列から最短で「NN are_VBP strongly_RB supported_VBN」を抜き出すのに
NN\s.*?VBNでうまくいかない(最長マッチが返ってくる)のですが、何が悪いのでしょうか?
In_IN Israel_NNP ,_, freedom_NN of_IN opinion_NN and_CC risk_NN taking_NN are_VBP strongly_RB supported_VBN ._.
50(3): 2013/09/22(日)02:25 ID:V8cai0+K(1) AAS
それだと最初に出現するNN\s位置からマッチングが始まって、
最短で後続するVBNまでがマッチする
こうじゃないか?
.*(NN\s.*?VBN)
51: 49 2013/09/22(日)08:30 ID:??? AAS
>>50
ありがとうございます。
しかし、、、.*(NN\s.*?VBN) だと、今度は、行全体がマッチしてしまいます。。。
ムムム
52(1): 2013/09/22(日)14:36 ID:??? AAS
NN arからじゃ駄目なん?
NNじゃ>>50の言うとおり最初のNNからマッチするんだし
53(1): 49 2013/09/22(日)15:17 ID:??? AAS
>>50
>>52
ありがとうござしました。
プログラム板でも聞いてみたところ、下のような表現を教えてもらいました。
NN\s((?!NN).)*?VBN
54: 2013/09/22(日)20:33 ID:??? AAS
>>53
結果教えてくれてありがと
前方参照否定位置指定子かー
NNが来ないNN空白〜VBNにマッチするのね
55: 2013/09/23(月)15:50 ID:??? AAS
ええい、お前はもう下がっておれ
webprog板の面汚しめ
56: 2013/09/23(月)21:29 ID:??? AAS
php使いが鼻で笑われる所以(´・ω・`)
57(1): 2013/09/23(月)21:37 ID:??? AAS
(´・ω・`)←この顔文字、3年ぶりぐらいに見たw
58: 2013/09/25(水)21:08 ID:??? AAS
>>57
女友達いないの?
59: 2013/10/07(月)05:09 ID:??? AAS
PHP5.4です。
'hoge山田
太郎2様hoge'
(2の数字は色々変わります)
の中から'太郎2様'をマッチさせたいのですが
/山田[\s\S]*?(/太郎.*?様/u)様/u
でうまくいかないです。どなたか教えて下さいまし。。。
60(1): 2013/10/07(月)15:52 ID:??? AAS
太郎\d+様
61: 2013/10/07(月)16:36 ID:??? AAS
>>60
なんとー
ありがとうございます
62: 2013/10/09(水)23:36 ID:??? AAS
行の最後に[a-z0-9]が9文字、はどう指定するんでしょうか
([a-z0-9]){9}$
$(([a-z0-9]){9})
と思ったのですが、うまくいかないです。
63: 2013/10/10(木)10:38 ID:??? AAS
[a-z0-9]{9}$
64: 2013/10/10(木)11:09 ID:??? AAS
ありがとうございます!
65: 2013/10/31(木)18:34 ID:GYE7WPbH(1) AAS
ab(cd)efg
とある時
(.*?)
で"(cd)"は返ってきますが、
"cd" とカッコの中身だけを取りたい時はどうすればいいでしょうか
"(" と ")" を置換するしかないですか?
66: 2013/10/31(木)18:49 ID:??? AAS
言語、、つか環境は?
67: 2013/10/31(木)21:18 ID:odoD21Ul(1) AAS
エスケープしろよ
68: 2013/11/29(金)11:12 ID:??? AAS
PHP5で
パターンは、/<a>.*<\/a>/
対象文字列は、<a>テスト1</a><a>テスト2</a>
preg_match('/<a>.*<\/a>/', '<a>テスト1</a><a>テスト2</a>', $result)
でマッチした文字列は、
$result[0]:<a>テスト1</a>
$result[1]:<a>テスト2</a>
となることを期待しているのですが、
実際は、
$result[0]:<a>テスト1</a><a>テスト2</a>
となりました。
<a></a>は独自タグで間に入る文字列長、フォーマットは不定です。
どうすれば期待通りの振る舞いに出来るでしょうか?
69: 2013/11/29(金)11:36 ID:??? AAS
68です。
すみません。訂正します。
× preg_match('/<a>.*<\/a>/', '<a>テスト1</a><a>テスト2</a>', $result)
○ preg_match_all('/<a>.*<\/a>/', '<a>テスト1</a><a>テスト2</a>', $result)
70: 2013/11/30(土)00:49 ID:ykQSlGiP(1) AAS
?
71(1): 2013/11/30(土)23:20 ID:??? AAS
正規表現の練習になるお題ください
72(1): 2013/12/04(水)06:52 ID:??? AAS
>>71
お題が欲しけりゃJaneのReplaceStr.txtとかNGEx.txtとか自分でいじってみればいいんじゃないの?
練習はReplaceStr Toolでやれるから。
グループ化を使って解析させると幾分わかりやすくなる。
73: 2013/12/08(日)20:14 ID:1LHzvpJQ(1) AAS
おしえてください。
テーブルタグで囲っている、下記のような
HTMLの表があります。
名前 | ふなっしー
住所 | 東京都港区赤坂
電話番号 | 090-0000-0000
ふなっしー
東京都港区赤坂
090-0000-0000
という結果を期待して
名前(.*)
住所(.*)
電話番号(.*)
と書いたんですが、使い方を間違っているのか?
うまくいきません。
他の記述方法はないでしょうか?
74(2): 2013/12/20(金)03:59 ID:JjVtc12l(1) AAS
ム板の本スレが新しくなったため報告させていただきます。
■本スレ
Regular Expression(正規表現) Part12
2chスレ:tech
■注意
工作員がわざと重複させて立てた偽スレを本スレだと偽って宣伝に来る可能性があります。
本スレは上記のみですので十分ご注意ください。
75(1): 2013/12/22(日)03:59 ID:??? AAS
>>72
ReplaceStr Toolって?ググったが出てこない
76: 2013/12/22(日)08:24 ID:??? AAS
>>75
これだろ。
外部リンク[zip]:1st.geocities.jp
77: 2014/01/12(日)01:41 ID:??? AAS
質問は>>74のスレにどうぞ。
保守。・・のついでに私的メモを書いていくかも。
檜山正幸のキマイラ飼育記
外部リンク:d.hatena.ne.jp
78: 2014/01/13(月)23:30 ID:??? AAS
IT PRO - 形式言語とオートマトンを学ぶ (3/4)
外部リンク:itpro.nikkeibp.co.jp
79: 2014/01/15(水)23:08 ID:??? AAS
質問は>>74のスレにどうぞ。
外部リンク[html]:www1.adachi.ne.jp
会社の新人研修でオートマトンの講義を担当した。
80: 2014/01/16(木)03:06 ID:??? AAS
計算機数学 町田 元
外部リンク:www.amazon.co.jp
大阪大学 - コンピュータ数学
外部リンク:koan.osaka-u.ac.jp
&func=function.syllabus.ex.refer&nendo=2009&j_s_cd=09&j_cd=090508&langkbn=j
※ 全部正規表現に関係するリンクなんで荒らしではないです。
正規表現に関わるオートマトンの知識を付けたい方には参考になると思います。
81: 2014/01/18(土)22:50 ID:??? AAS
有限オートマトンと正規表現 (ヤギ 野菜 狼)
外部リンク[pdf]:www.i.kyushu-u.ac.jp
82(1): 2014/01/19(日)07:18 ID:??? AAS
ある文字列を含まないものにマッチする正規表現
(?:(?!foo).)*
^(?:(?!foo).)*o$ → 「foo」 にマッチ出来ない。
先読みを使わない正規表現ならマッチ出来る。
→ (?:(?!foo).)* は厳密には間違い。
Q、では先読みを使って正しく動作させるにはどう書くべきか?
83(1): 2014/01/19(日)11:23 ID:??? AAS
お望みの先読み使って書くなら /fo(?!o)/
だろうが、
こんなの使うくらいなら
if (/foo/) {
} else {
※ここに書いたほうがいいに決まってる
}
で、もはや正規表現使うコストももったいないくらいだから
普通は strpos()みたいな関数使うべきだろう。
84: 2014/01/19(日)15:12 ID:U6WWS19r(1) AAS
先頭一致とか後方一致はsubstr使ってる
iオプション必要なら代わりにlc
85: 2014/01/19(日)15:26 ID:??? AAS
c
86: 2014/01/19(日)17:13 ID:??? AAS
>>83
>>82の内容を理解出来てないね・・
(?:(?!foo).)* → fo にマッチ
o$ → o にマッチ
これ足して foo にマッチ「する」のが期待する文字列否定の動作。
fo の中に foo は含まれていないので fo にはマッチしなければならない。
>関数使うべき
マラソン選手に車使うべきって言ってるようなもん。
87: 2014/01/21(火)04:23 ID:??? AAS
正解はこちら↓
Perl正規表現雑技 - ある文字列を含まないものにマッチする正規表現
外部リンク[htm]:www.din.or.jp
88: 2014/01/24(金)01:21 ID:??? AAS
うーむ、オートマトンの勉強というか、まだ触りしか学んでないんだが
既に文字列否定の正規表現を簡単に作れるようになってしまった。
チャリの運転と同じで、一旦出来るようになるとなんてことないね。
89: 2014/01/24(金)05:08 ID:??? AAS
(次のお題)
abc かつ def を含まない文字列を表す正規表現を作れ。ただし先読みはNG。
90(1): 2014/01/25(土)14:00 ID:peRg4Ln+(1) AAS
お題が提示されておりますが、質問よろしいでしょうか。
言語は Java(Android開発) です。
やりたいことは、
・'a', 'b', 'c', '*' の4つの文字が使われた文字列を分割する
・'a*', 'b*', 'c*' は1文字として扱い、'*'のみの物は無い
になります。
例えば "aba*cb*" の場合は
a
b
a*
c
b*
に分割したいです。
どのように書けば良いのでしょうか、ご教授願います。
91(1): 2014/01/25(土)17:37 ID:VUYYCfMh(1) AAS
([abc]\*?)
92(1): 2014/01/26(日)00:17 ID:??? AAS
このスレは道場と名の付いてる通り正規表現のスキルアップを目指すスレです。
糞質問・キチガイは↓こちらにお願いします。
Regular Expression(正規表現) Part12
2chスレ:tech
93: 90 2014/01/26(日)13:40 ID:??? AAS
>>91
ありがとうございました。勉強になります。
>>92
>>1も読めない糞は2chには向いていないと思うよ。
もう何十年も居座っていると予想されるが、そろそろ自覚しなよ。
94: 2014/01/26(日)23:09 ID:??? AAS
ここはもう荒らしの本拠地になってるから仕方がないよ。
わざわざ煽りにム板まで出張してきてるし。
95: 2014/01/27(月)00:48 ID:??? AAS
こちらは精神異常者の隔離スレとなっております
96: 2014/01/27(月)05:05 ID:??? AAS
じゅんじゅんのきまぐれ
外部リンク:d.hatena.ne.jp
おや、あわわさんとやらが俺の代わりに知らせに行ってくれてたのか。
あわわさん乙。ありがとう。
正規表現 Part11
2chスレ:tech
ってあれ?あわわさんのほうが6時間早い。CPU時計の時差?
97: 2014/01/29(水)03:59 ID:??? AAS
レベル高いスレにただいま。
98: 2014/01/29(水)04:05 ID:??? AAS
荒らしの住み処
ただのクソスレ
99(1): 2014/01/29(水)05:11 ID:??? AAS
ところで向こうの267は雑技たんなのかな?266、雑技のネタに使ってもよかですたい。
100(1): 2014/01/29(水)08:45 ID:??? AAS
>>99
当たりw
266の書き方は考えたけど,今回のケースでは267の書き方で大丈夫と考えた.
そういや質問者は「1」を含まないって書いてあるのに,なぜ「123」? とは思ったなw
後ろに他の正規表現を続けたりするとバックトラックして,
271の通りの可能性があるから初心者には266の方がいいのは確か.
ただ,他にもいろいろ考え出すと,最も内側のものだけ削除したいのなら,
ABC(?:(?!123|ABC|DEF).)*DEF
と書いた方がいいとかもある.
ちなみに266のミソは↓の辺りで微妙に使っていたりする.
外部リンク[htm]:www.din.or.jp
101(1): 2014/01/29(水)15:23 ID:??? AAS
>>100
ああ、考えてみればABCも入れたほうがいいね。質問者の対象データが対になってる
データだったから必要性を感じなかったが入れるべきだった、さすが雑技たん。
>なぜ「123」?
1というのは実データとは違う省略形と考えた。
初心者には文字と文字列の違いが分からないから文字列のつもりで1と書いてしまった
可能性がある。そこで文字列に対応しておけば1文字にも対応出来るってわけ。
>ABC(?:(?!123|ABC|DEF).)*DEF
これが基本形やね。高速化するなら*+とか、もっとやるなら[^1AD]*+使ってごちゃごちゃ書いたり。
>NoEnd
ミソは否定の中に分岐を入れることだからそれとはちょっと違うw
それと <\2> だと <font> になってしまうで・・ <\2\b やね。
102(1): 2014/01/30(木)00:29 ID:??? AAS
>>101
>1というのは実データとは違う省略形と考えた。
なるほど.確かに,初心者ほど状況説明が下手だからね.
>それと <\2> だと <font> になってしまうで・・ <\2\b やね。
単純なミスだな.指摘ありがとう.
103(2): 2014/01/30(木)07:11 ID:??? AAS
・範囲内で文字列を含まない正規表現
$_ = "zzzABC XYDEFzzDEFz";
if ( m/
# Perl 5.10 以降で有効
ABC
[^XAD]*
(?:
(?!XYZ|ABC|DEF).
[^XAD]*
)*
(*PRUNE) # バックトラックステートの削除
(*SKIP) # 次回の走査開始位置をここに飛ばす
(?:XY?)? # XYZとDEFの競合を想定した取りこぼし回収
DEF
/xgsiaap )
{ print "match! <".${^MATCH}.">"; }
else
{ print "no match."; }
>>102
修正乙!
104(1): 2014/01/30(木)13:46 ID:??? AAS
修正乙の後でアレなんだけど、実際に動かしてみたらだいぶおかしいから手直ししてみたよ、と。
while ($html =~ /
<(NOBR|CODE|B|PRE|FONT)\b
(?=
(
(?:(?!<\/\1>).)*?
(?:<\1\b|$)
)
)
/sixg
) {
print "<".$1.$2, "\n";
}
------------- perl.htm -------------
<b><font><pre><b>aaa
------------- perl.htm -------------
*? はなるべく使いたくないなぁ・・ [^<]*+ を使って最適化したいw
105(1): 2014/01/31(金)02:30 ID:??? AAS
>>103
(*VERB:ARG) ってのは知らなかったなぁ.
今回のケースだと(*PRUNE)は(?>pattern)で置き換えができると思うが,
マニュアルの 「(*PRUNE) は (?>pattern) 単独では表現できないケースを扱うために使えます。」ってのがどういうケースなのか想像できん.
>>104
修正ありがと.
元のやつだと後ろを吸い込んじゃうからマッチ位置が先に進んでしまう.
そうならないように先読みを使うと,先読み部分は後方参照に含まれなくなるから,先読みの中で改めて補足が必要って感じだね.
106(1): 2014/01/31(金)04:37 ID:??? AAS
>>105
>単独では
・・・ ( ・・・ (*PRUNE) )
みたいに ( ) で分断されてる場合とか? (?> だと2つ以上必要になる。
>マッチが先に
当たり〜。printのとこは""の中にまとめて書いても大丈夫だったのか、勉強になりますた。
改めて修正乙。
107(1): 2014/01/31(金)10:29 ID:??? AAS
>>103
「XYZとDEFの競合」ってのはXYZの後半部分がDEFの前半部分と同じ場合ってことかな?
例えば,xydとdef,とか,xdeとdefみたいな
もしそういう,後半部分と前半部分が重なる場合を考え出すと,話がもう少しややこしくなる.
つまり,ABCDとCDEFがキーだったときに,ABCDEFという文字があったら,
それはABCD+EFと解釈するのか,AB+CDEFと解釈するのか,という問題.
その解釈がすべて前方優先なのか,すべて後方優先なのか,それともキーの相互の優先度で決まるのか,
あるいは,あらゆる可能性を許すのか,あらゆる可能性を許さないのか.
キー自身が重なる場合もある.
例えば,ABCABみたいなキーだったとき,ABCABCABは,ABCAB+CABなのか,ABC+ABCABなのか.
108(1): 2014/01/31(金)10:34 ID:??? AAS
>>106
>・・・ ( ・・・ (*PRUNE) )
なるほど,括弧の深いところで使うと,(?> で表現するのは大変そうだ.
しかも,もしそれが中間レベルで分岐してたりすると,(?> では表現しきれないかな.
109: 2014/01/31(金)16:13 ID:??? AAS
>>107
ぶっちゃけその辺は何も考えてない。試作品とかテンプレートみたいな感じで作っただけ。
競合対策の部分は普通の使い方をするならいらないね、HTMLやXMLタグで挟まれた文字列にマッチさせるときとか。
こういうの以外に使い道が思い当たらないし。(だったら付けるな)
>>108
>分岐
なるほど、(?> ではお手上げだ。俺も年末に覚えたばかりでよく分かってない。
110: 2014/02/01(土)16:48 ID:??? AAS
## (*COMMIT)
$_ = "12";
if (
m/^1((*COMMIT)3|2)/
){ print "match!\n"; }
# 分岐の中で踏まれると以後ほかの分岐要素を走査することがなくなる。
# 現在の分岐要素がマッチ失敗したら全体もマッチ失敗となり検索はそこで完全終了する。
m/^1(*COMMIT)(3|2)/
# 下位層の分岐は走査され、マッチが成功する。
$_ = "12";
@test = $_ =~ m/^1(*COMMIT)A|\d/g;
print "@test\n";
# /g でも次位置からの走査は行われない。
@test = $_ =~ m/^1(*COMMIT)|\d/g;
# 結果 = 1 2 。マッチが成功した場合は走査を止めることはない。(失敗したときだけ止める)
111(1): 2014/02/01(土)17:24 ID:??? AAS
Q、(*COMMIT) とは逆にマッチが成功したときだけ /g を止める最も簡単な手段は何か?
$_ = "123";
@test = $_ =~ m/1|2|3/g;
print "@test\n";
↑2 がマッチ成功したときに /g を止め、3がマッチしないようにする。
フラグ変数を用意、チェックすれば可能だがもっと手軽な手段はないか。
112(2): 2014/02/02(日)07:59 ID:??? AAS
う〜ん、/g はループなのに break する方法が用意されていない。
COMMIT があるのにこれがないのはとても不可解だ。
# 先読みの中の (*SKIP) は機能しない。
@test = $_ =~ m/1|2(?=.*(*SKIP))|3/g;
# while 文の last を使う。
$_ = "123";
while ( m/1|2|3/gp )
{ print "${^MATCH}\n";
last; } # 1 で止まる。
# (?{code}) で last → 効果なし
while ( m/1|2(?{ last; })|3/gp )
# while 文に名前を付けて (?{code}) で last → 効果なし
TEST : while ( m/1|2(?{ last TEST; })|3/gp )
perl陣営に言えば新しいコマンド作ってくれそうだなぁ。
113: 2014/02/02(日)08:47 ID:??? AAS
# (?-g) → 効果なし
while ( m/1|2(?-g)|3/g )
# 苦肉の策 (現実的でない)
while (
m/(1)|(2).*|(3)/g
)
{ print "${^N}\n"; }
# 苦肉の策 + 最後の空文字列にマッチしない対策 (現実的でない)
while (
m/\z(*COMMIT)(*F)|(1)|(2).*|$/g
)
{ print "match! ${^N}\n"; }
114(1): 2014/02/02(日)10:19 ID:??? AAS
>>111
>>112 >>123
/g がループというのはちょっと違う.
リストコンテキストで評価したときはループと言えるが,スカラーコンテキストで評価したときはループではなく,
単に前回マッチした場所を覚えていて続きからマッチングを行うというだけ.
この問題はリストコンテキストで /g を評価したときに,マッチ成功後に途中で止めるいい方法はないかって言う問題だと解釈した.
スカラーコンテキストで評価したときに止めるんなら last を使えば簡単に止まる話.
つまり,while を使っていいんなら,
while (/1|2(*:STOP)|3/g) {
push(@test, $&);
last if $REGMARK eq 'STOP';
}
print "'@test'\n";
リストコンテキストで評価したときに途中で止めるには,かなり条件が限定されるが,
@test = $_ =~ m/(?(?<=2)\G(*COMMIT)(*FAIL))(?:1|2|3)/g;
ぐらいしか思いつかなかった.
これではフラグを使った方が簡単だろう.
115: ◆QzqhRqBYxktP 2014/02/02(日)14:00 ID:??? AAS
>>114
>ループというのはちょっと違う
そのへんはちゃんと理解してるから大丈夫。foreachとか<>みたいなつもりで書いてるから。
>リストコンテキストで /g を評価したときに,マッチ成功後に途中で止めるいい方法はないか
その通り。
>(*:STOP)
これはフラグ変数を使うやり方とまったく同じだからボツ・・。{ } の中で last するのはナシ。
m/ / の中で止められないか、という話だから。
しかも$REGMARKと$REGERRORは予期しない動きをすることがあるから
普通にフラグを使ったほうが確実。(後述)
>これではフラグを使った方が簡単だろう
やっぱそうかぁ、雑技たんでもダメなら無理そうだね。考えてくれてありがとう。
116: 2014/02/02(日)14:08 ID:??? AAS
## $REGERROR
# マッチ失敗でも$REGERRORが偽を返す例
$_ = "11";
m/^(*MARK:NAME)12/;
if ($REGERROR){ print "yes\n" }else{ print "no\n"; };
結果 → no
# 2 を (?!) や (*FAIL) に変えると・・?
m/^(*MARK:NAME)1(?!)/;
結果 → yes
2 を $ にすると no のまま。
117(1): 2014/02/02(日)14:12 ID:??? AAS
あれ、$REGMARK が予期しない動作になるデータはないや。
ごめん、使えないのは $REGERROR だけかも。
118(1): 2014/02/02(日)14:30 ID:??? AAS
>単に前回マッチした場所を覚えていて続きからマッチングを行うというだけ
あ、ちゃう、これ分かってなかった。場所覚えてるだけだったのか、違和感感じてたんだけど
やっと理解出来たよ、ありがとう。
あと雑技たんのサイトだけど
>回文にマッチする正規表現 # 再帰版
× (??{$palindrome})*
○ (??{$palindrome})?
だね。前者だと回文を繋げた文字列 121454989・・・ みたいなのを拾ってしまう。
119(1): 2014/02/02(日)20:34 ID:??? AAS
>>117
確かに $REGERROR は期待通りに動かないな.
>>118
回文の間違い指摘ありがとう.
120: ◆QzqhRqBYxktP 2014/02/02(日)20:50 ID:??? AAS
おや、出来ちゃった・・
# リストコンテキスト + /p のマッチング中に break する。
$_ = "123";
@test = $_ =~ m/
1
|2
(?{ $last = "${^MATCH}"; })
(*COMMIT)(*F)
|3
/xgp;
push(@test,$last);
print "@test\n";
# リストコンテキスト + /p のマッチング中に break する。( push版 )
push(@test,
m/
1
|2
(?{ $last= ${^MATCH}; })
(*COMMIT)(*F)
|3
/xgp
,
$last
);
>>119
仕事はやっ!修正乙〜
121: ◆QzqhRqBYxktP 2014/02/03(月)07:41 ID:??? AAS
↑× /p のマッチング中に → /g の間違い
----------------------------------------------
# 先読みの中の (*SKIP) は正しく機能する。(× >>112)
$_ = "123";
@test = $_ =~ m/1|2(?=.*\z(*SKIP)(*F))|3/g;
print "@test\n";
# 結果 → 1
# 先読みの中の (*SKIP) が失敗する例もある
@test = $_ =~ m/1|2(?=.*\z(*SKIP))(*F)|3/g;
# 結果 → 1 3
# perl内部の最適化の影響により (?=) より早く (*F) が判定されている?
# $REGERROR が期待通りに動かない原因も最適化が犯人? (最適化は 詳説 正規表現 参照)
----------------------------------------------
# \z で始まる正規表現 + while( /g )
while (
m/\z(?{ print "in code\n"; })/g
)
{ print "match!\n"; }
<結果>
in code
match!
in code
2回走査されてる。2回目は走査しといてマッチ失敗。/g により1つ先に進む動作の副作用?
(?{code}) が2回実行されるのでプログラムが想定外の動作になる可能性。
/g を忘れると走査開始位置が毎回先頭に戻り、無限ループになる。
122: 2014/02/03(月)17:57 ID:??? AAS
# リストコンテキスト + /g のマッチング中に break する。(perl 旧verl対応版)
$_ = "12223";
@test = $_ =~ m/
1
|2
(?{ $last = "$&"; })
.*\z # 余った文字列を全部マッチさせる。
|3
/xgs;
$test[$#test] = $last; # 最後の要素の入れ替え
print "@test\n";
これらを "break出来てる" と言うのはちょっとおこがましいかも知れない。やはり break コマンドが欲しい。
123(1): ◆QzqhRqBYxktP 2014/02/04(火)13:37 ID:??? AAS
・$REGERROR を (?{code}) と入れ替えて実験
my $cnt = 0;
$_ = "11";
m/^(?{ $cnt++;})1(*F)/;
print "$cnt\n";
# 結果 → 1
my $cnt = 0;
$_ = "11";
m/^(?{ $cnt++;})12/;
print "$cnt\n";
# 結果 → 0
$REGERROR さんに無罪判決。冤罪でした。
124(2): 2014/02/04(火)13:39 ID:??? AAS
皆様、こんにちは 質問させてください
テキスト内の文字を置き換えるアプリ(Devas)で作業をしています
正規表現で文字検索と置き換えしたいのですが表現法がわかりませんので
詳しい方アドバイス下さいませんでしょうか?
テキスト内には
.(ドット)abc"IMG
.(ドット)def"IMG
.(ドット)ghr"IMG
など . と "IMG で囲まれた数パターンの文字列がありこれに元文字列を利用し .photo を付け加えたいのです
.(ドット).photo.abc"IMG
.(ドット).photo.def"IMG
.(ドット).photo.ghr"IMG
検索、置き換え 共に正規表現が使えるアプリなのですがそれぞれどう表現して良いのか教えてくださいませんか?
よろしくお願いいたします
125(3): ◆QzqhRqBYxktP 2014/02/04(火)13:41 ID:??? AAS
・開始タグと閉じタグの間に文字列を含まない正規表現 (正規表現 否定 除く)
$_ = "ABC ABC DEF ABCDEF";
while ( m/
# Perl 5.10 以降で有効
ABC
[^ADX]* # 先頭の文字を使った高速処理
(?:
(?:
DEF (*ACCEPT) # マッチ成功
|\K ABC # 今までマッチした文字列を捨ててリスタート
|XYZ (*PRUNE) (*SKIP) (*F) # NGワード検出、マッチ失敗
|. # ↑の3つ以外の1文字
)
[^ADX]*
)*
(*COMMIT) (*F) # DEFで閉じられないまま終端に到達。
/xgsiaap )
{ print "match! <${^MATCH}>\n"; }
# NGワード、開始タグ、閉じタグの競合は想定していない。
# 例、NGワード="</" 、 閉じタグ="</div>"
126: 2014/02/04(火)20:09 ID:xuvSG1oC(1) AAS
s/^\./.photo./g
行頭限定の場合
127: ◆QzqhRqBYxktP 2014/02/05(水)16:22 ID:??? AAS
>>124
<検索>
\.([a-z\d]{1,4}"IMG\b)
<置換>
..photo.$1
\. を ( ) に入れてないのは処理効率を上げるため。
「abc」の部分は拡張子と考えて数字も許可した。(1文字以上4文字以下の英数字)
何かまずかったら遠慮なく。
128(1): 124 2014/02/06(木)18:00 ID:??? AAS
たくさんレスいただきましてありがとうございます
お礼が遅れまして申し訳ありません
127様の \.([a-z\d]{1,4}"IMG\b) で無事検索できることができました
しかし置き換えでは マッチした文字列が ..photo.$1 に置き換わるだけで $1にマッチした語句が適応されません
検索結果
○○○○○○.abc" IMG が ○○○○○○..photo.$1 となります
希望では
○○○○○○.photo.abc" IMG となることです(単純に .拡張子 前に .photo を入れたい)
先の書き込みでの訂正がありました 申し訳ありません
検索したい文字列には " と IMG の間に半角スペースがありました
半角があっても上手く検索にひっかっかっていますが
上手く置き換えができないのはこの半角が原因なのでしょうか?
引き続きご指導いただければ幸いです よろしくお願いいたします
129(1): ◆QzqhRqBYxktP 2014/02/06(木)20:27 ID:??? AAS
>>128
ごめんなさい、こちらにも見落としがいくつかありました。
( Devasにはメジャーな正規表現エンジンが使われていると考えて作りましたが違ったようです )
・通常版 (上行=検索、下行=置換)
\.[a-zA-Z\d]{1,4}" ?IMG\b
.photo\0
・拡張子を小文字に変換する版 (例 .JPG → .jpg )
\.([a-zA-Z\d]{1,4})(" ?IMG\b)
.photo.\L\1\E\2
・ 「"」 と IMG の間のスペースがあっても無くてもスペース1個にする版
\.([a-zA-Z\d]{1,4})" ?IMG\b
.photo.\L\1\E" IMG
# \L と \E を削除すれば拡張子の小文字変換はしなくなります。
# 本当は .photo.photo.jpg のような複数回置換による重複を防ぎたかったんですが
# この正規表現エンジンでは無理なようです。(>_<)
上下前次1-新書関写板覧索設栞歴
あと 264 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.790s*