トップページ⇒tech
364コメント131KB

正規表現 Part11

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/03/20(水) 17:54:00.46
正規表現(Regular Expression)スレです。

質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。

正規表現 Part10
http://toro.2ch.net/test/read.cgi/tech/1340383120/

天ぷら等2以降
0314デフォルトの名無しさん2013/12/26(木) 06:07:22.43
/a → 全角文字をマッチさせない?

print "match!" if "A" =~ m/\w/; # マッチする
print "match!" if "A" =~ m/\w/a; # マッチしない
0315デフォルトの名無しさん2013/12/26(木) 06:39:44.16
(*ACCEPT) 走査を成功として終了させる。

$_ = "12345";
s/12(*ACCEPT)345/match/;
print;

結果: match345。s/12/match/ と同義。
0316デフォルトの名無しさん2013/12/26(木) 06:44:59.79
(*FAIL) (*F) → (?!) と同義。(?!) を最適化したもの。

print "match" if "123" =~ m/123(*F)/;
print "match" if "123" =~ m/123(*FAIL)/;
print "match" if "123" =~ m/123(?!)/;
→ いづれもマッチせず。
0317デフォルトの名無しさん2013/12/27(金) 02:51:54.90
/a /aa

>>314
http://perldoc.jp/docs/perl/5.18.1/perlretut.pod

Perl 5.14 から利用可能の //a 修飾子は、\d, \s, \w を ASCII の範囲に 制限するために
使います。 これは、英語風のテキストを処理したいだけの時にプログラムを不必要に
完全な Unicode (とそれに関連するセキュリティの配慮) にさらされないようにするのに
有用です。 ("a" を重ねて //aa にするとさらに制限されて、ASCII 文字の大文字小文字を
無視したマッチングで非 ASCII 文字にマッチングしなくします; さもなければ、
Unicode の "Kelvin Sign" は "k" や "K" に、大文字小文字を無視したマッチングが
成功します。)
0318デフォルトの名無しさん2013/12/27(金) 02:56:22.12
Unicode の "Kelvin Sign" → \N{U+212A}
http://www.fileformat.info/info/unicode/char/212a/index.htm
0319デフォルトの名無しさん2013/12/27(金) 02:59:04.70
わけがわからん
0320デフォルトの名無しさん2013/12/27(金) 03:12:37.95
"\x{212A}" =~ m/\N{U+212A}(?{print "match!-N\n";})/;
"\x{212A}" =~ m/k(?{print "match!-def\n";})/;
"\x{212A}" =~ m/k(?{print "match!-a\n";})/a;
"\x{212A}" =~ m/k(?{print "match!-ai\n";})/ai;
"\x{212A}" =~ m/k(?{print "match!-aa\n";})/aa;
"\x{212A}" =~ m/k(?{print "match!-aai\n";})/aai;
"\x{212A}" =~ m/K(?{print "match!-K def\n";})/;
"\x{212A}" =~ m/K(?{print "match!-K a\n";})/a;
"\x{212A}" =~ m/K(?{print "match!-K ai\n";})/ai;
"\x{212A}" =~ m/K(?{print "match!-K aa\n";})/aa;
"\x{212A}" =~ m/K(?{print "match!-K aai\n";})/aai;
結果
match!-N
match!-ai
match!-K ai

>>319
unicodeで\w、\s、\dを全角文字にマッチさせるか、させないかを選べるオプション。
0321デフォルトの名無しさん2013/12/27(金) 03:45:21.82
/i リテラルのアルファベットが全角文字にもマッチするようになる。

"\x{212A}" =~ m/k(?{print "match!-k\n";})/;
"\x{212A}" =~ m/k(?{print "match!-k-i\n";})/i; # マッチ

"\x{212A}" =~ m/K(?{print "match!-K\n";})/;
"\x{212A}" =~ m/K(?{print "match!-K-i\n";})/i; # マッチ

これを防ぐには /aai とする必要がある。( /ai では防げない)
0322デフォルトの名無しさん2013/12/27(金) 03:47:11.51
/iaa
/aia
/aai

どれでもokだった。
0323デフォルトの名無しさん2013/12/27(金) 04:10:24.46
\w /i /a

"\x{212A}" =~ m/\w(?{print "match!-\\w-\n";})/; # マッチ
"\x{212A}" =~ m/\w(?{print "match!-\\w-i\n";})/i; # マッチ
"\x{212A}" =~ m/\w(?{print "match!-\\w-a\n";})/a;
"\x{212A}" =~ m/\w(?{print "match!-\\w-ai\n";})/ai;
"\x{212A}" =~ m/\w(?{print "match!-\\w-aa\n";})/aa;
"\x{212A}" =~ m/\w(?{print "match!-\\w-aai\n";})/aai;

デフォで全角にマッチする。/i の有無に影響されない。/aがあると全角にマッチしなくなる。
この動作はunicodeで確認。shift_jisではデフォで全角にマッチせず。
0324デフォルトの名無しさん2013/12/29(日) 02:25:09.32
test
0325デフォルトの名無しさん2013/12/31(火) 15:00:54.91
## ロケール

use locale;
print +(sort grep /\w/, map { chr } 0..255), "\n";

# 結果
_0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZァアィ
スセソタチッツテトナニヌネノハヒフヘホマミムメモャヤュユョヨラリルレロワヲン

----------
no locale;
print +(sort grep /\w/, map { chr } 0..255), "\n";

# 結果
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
0326デフォルトの名無しさん2013/12/31(火) 15:59:32.58
↑前者はshift_jisの並びと違う。

## /l

use locale;
$re = qr/[ア-オ]/;
-------------------
no locale;
$re = qr/[ア-オ]/l;
print $re;
-------------------
両者から出力される正規表現は同じ。
0327デフォルトの名無しさん2014/01/01(水) 05:51:58.61
xyz を含まないものにマッチする正規表現
http://www.din.or.jp/~ohzaki/regex.htm#WithoutXYZ

先のjsだが↑この時点で間違えてるね。

([^x]|x(y?x)*([^xy]|y[^xz]))*(x(y?x)*x?)? → xyで終わる文字列にマッチ出来ない
[^x]*(x+(y|y[^xz][^x]*|[^xy][^x]*))* → めちゃくちゃ。論外。

この人に教える方法って無いのかな、このままじゃご本人も不本意だろう・・。
0328デフォルトの名無しさん2014/01/01(水) 05:59:26.44
> [regexp 60]より
> ・・・
> ([^xyz]|y|z)*x(z([^xyz]|y|z)*x|[^xyz]([^xyz]|y|z)*x|x|yx|y
> [^xyz]([^xyz]|y|z)*x|yy([^xyz]|y|z)*x)*yz

これもxyzを含む文字列にマッチしてしまう。出だしからコケてる模様。
0329デフォルトの名無しさん2014/01/01(水) 06:02:02.29
ツイッター発見。アカウント持ってる方、どうかお願いします。
https://twitter.com/ohzak1
0330デフォルトの名無しさん2014/01/01(水) 08:29:02.24
ウィキペディア - 正規表現
http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE#Basic_Regular_Expression

>エストニア語のアルファベットでは、s の後に z があり、その後は t、u、v、w、x、y と続くので、
>[a-z] ではすべての小文字のアルファベットにマッチしない

↑これを再現したいけど上手くいかない。↓では再現出来ず。(XP、perl 5.16.3)

use strict;
use warnings;
use locale;
use POSIX qw(setlocale LC_ALL);
setlocale(LC_ALL, "et_EE.ISO8859-1");

if ( "STU" =~ m/^[A-Z]+$/ )
{print "match";}
else
{print "no match.";}
0331デフォルトの名無しさん2014/01/01(水) 10:08:50.36
その順で割り当てられているテーブル使ってやらんとダメだろ
0332デフォルトの名無しさん2014/01/01(水) 14:15:29.97
>>331
たぶんエストニア語の適用も出来てないし、そのテーブルとやらも使えてません。
まだロケールのことを知ったばかりで右も左も分からない状態なんでググりまくって調べてみます。
0333デフォルトの名無しさん2014/01/01(水) 16:56:39.85
あの人難儀な性格してるからな
0334デフォルトの名無しさん2014/01/01(水) 20:32:10.97
>>329
アカウント取ってツイートしてみた。
0335デフォルトの名無しさん2014/01/01(水) 23:33:47.34
>>334
ツイート確認しました.
もともと転載してきたものだったので,自分ではちゃんと確認していませんでした.

そのうち本文の方は修正しますが,とりあえず,手元で求め直したものです↓
([^x]|x(x|yx)*([^xy]|y[^xz]))*(x(x|yx)*y?)?
0336デフォルトの名無しさん2014/01/02(木) 05:33:17.28
>>335
おお、ありがとうございます。動作もバッチリでした。すみませんでした、元旦から・・^^;

今年もよいお年を!
0337デフォルトの名無しさん2014/01/03(金) 07:15:15.50
"文字列の否定" って検索してみると間違い載せてるサイト多いね

http://d.hatena.ne.jp/junjun777/20110927/regexp_not_include ^([^x]|x[^y]|xy[^z])*$
http://bynatures.net/wordpress/3317/ ^([^x]|x[^y]|xy[^z])*$
http://sekky.seesaa.net/article/115791006.html ^(?!.*#).+$
http://se-suganuma.blogspot.jp/2008/05/blog-post_31.html ^(([^b]|[^a]b)|[^a]a)+$
コメントの ((?!ab).)+ → 正解は ((?!ab).)*
http://oshiete.goo.ne.jp/qa/4522181.html

これ全部間違い。
0338デフォルトの名無しさん2014/01/03(金) 15:04:39.07
秀丸Q&A
http://homepage2.nifty.com/jr-kun/hidemaru_qa/4_regulr.html
> 検索文字列(改良版):  /\*/?([^/]|[^*]/)*\*/

これも間違い。先読みを使わない文字列否定ってそんなに難しいのかな・・
0339デフォルトの名無しさん2014/01/03(金) 17:08:36.17
>>338
<!--(.|\n)*-->|<[^>]*>

これも酷いなぁ..
しかもちょっと上に

>正規表現の「最長一致のルール」を 思い出しましょう。

って自分で書いてるのに..
0340デフォルトの名無しさん2014/01/03(金) 17:15:28.37
最終更新が10年以上前の内容について語ってもらえれば
作者も本望だろう
0341デフォルトの名無しさん2014/01/03(金) 17:21:24.34
10年間指摘されなかったということか、ある意味すごいな・・
俺は10年に一人のスーパーハカーってか・・
0342デフォルトの名無しさん2014/01/03(金) 17:29:19.06
指摘する=修正されるだと思ってる方が凄いと思う
0343デフォルトの名無しさん2014/01/03(金) 17:30:08.87
>全ての場合に通用する「一般論」は存在しない

あるんだな、それが。これを知ってれば2文字の否定と長い文字の否定の難易度は同じ。
0344デフォルトの名無しさん2014/01/03(金) 17:33:06.01
>>342
サイト主さんは今でもブログやってるから連絡すれば修正してくれるんじゃね。
0345デフォルトの名無しさん2014/01/03(金) 17:41:29.10
そもそもなぜ2chで報告してるんだ?直接作者に言えないシャイな子なのか?
0346デフォルトの名無しさん2014/01/03(金) 17:45:19.40
うん。
0347デフォルトの名無しさん2014/01/03(金) 17:45:55.48
告白できなくて校庭にでっかくスキと書く感じ
もしくは裸コートをはだける感じ
0348デフォルトの名無しさん2014/01/03(金) 17:47:03.12
笛を舐めてた。
0349デフォルトの名無しさん2014/01/03(金) 17:49:19.87
ここは内気なHENTAIが集まる場所。
0350デフォルトの名無しさん2014/01/03(金) 17:50:07.27
バスケットボールのときマークするふりしてくっついてた。
0351デフォルトの名無しさん2014/01/03(金) 17:55:18.46
10年後、新たな男が20年に1人のハカーを名乗るのだった…。
0352デフォルトの名無しさん2014/01/03(金) 17:57:14.43
それ、きっとあんただよ。
0353デフォルトの名無しさん2014/01/03(金) 18:00:52.76
なんだこのスレ
0354デフォルトの名無しさん2014/01/03(金) 18:27:54.76
俺たちはプログラマーだからな
内気でなければ生きていけない
0355デフォルトの名無しさん2014/01/03(金) 18:28:29.89
>>338
スーパーハッカーなら正解も書いてよ
0356デフォルトの名無しさん2014/01/04(土) 04:47:28.67
あれは

/* *// */

これに全体がマッチする。これで何がいけないか分かるだろ。
0357デフォルトの名無しさん2014/01/04(土) 17:11:40.50
>>356
こう?/\*/?([^/]|[^/*]/)*\*/
0358デフォルトの名無しさん2014/01/04(土) 20:36:30.29
>>357
yx『xyを含まない文字列』xy

↑のxを*、yを/に読み変えたものが答え。

xy を含まないものにマッチする正規表現
http://www.din.or.jp/~ohzaki/regex.htm#WithoutXY
0359デフォルトの名無しさん2014/01/04(土) 21:37:38.95
/\*([^*]|\*+[^*/])*\**\*/
こうか。
0360デフォルトの名無しさん2014/01/05(日) 01:13:01.94
\(*^_^*)\
0361デフォルトの名無しさん2014/01/05(日) 07:21:31.32
>>359
正解。先読みを使わない文字列否定では [^xy] という2文字否定の形が必ず入る。
これが無い正規表現は全て間違い。
0362デフォルトの名無しさん2014/01/05(日) 07:33:06.28
あ、全てじゃないか、

例外
http://funcchan.blog16.fc2.com/blog-entry-39.html

これは [^xy] の "x" と "y" が共に "A" だから一文字で済む特異なパターン。
0363デフォルトの名無しさん2014/01/05(日) 13:06:49.82
続きはこちら。

Regular Expression(正規表現) Part12
http://toro.2ch.net/test/read.cgi/tech/1387257592/
0364停止しました。。。NGNG
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
■ このスレッドは過去ログ倉庫に格納されています