正規表現 Part11
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/03/20(水) 17:54:00.46質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。
正規表現 Part10
http://toro.2ch.net/test/read.cgi/tech/1340383120/
天ぷら等2以降
0314デフォルトの名無しさん
2013/12/26(木) 06:07:22.43print "match!" if "A" =~ m/\w/; # マッチする
print "match!" if "A" =~ m/\w/a; # マッチしない
0315デフォルトの名無しさん
2013/12/26(木) 06:39:44.16$_ = "12345";
s/12(*ACCEPT)345/match/;
print;
結果: match345。s/12/match/ と同義。
0316デフォルトの名無しさん
2013/12/26(木) 06:44:59.79print "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>>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.12http://www.fileformat.info/info/unicode/char/212a/index.htm
0319デフォルトの名無しさん
2013/12/27(金) 02:59:04.700320デフォルトの名無しさん
2013/12/27(金) 03:12:37.95"\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"\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/aia
/aai
どれでもokだった。
0323デフォルトの名無しさん
2013/12/27(金) 04:10:24.46"\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.320325デフォルトの名無しさん
2013/12/31(火) 15:00:54.91use 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## /l
use locale;
$re = qr/[ア-オ]/;
-------------------
no locale;
$re = qr/[ア-オ]/l;
print $re;
-------------------
両者から出力される正規表現は同じ。
0327デフォルトの名無しさん
2014/01/01(水) 05:51:58.61http://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> ・・・
> ([^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.29https://twitter.com/ohzak1
0330デフォルトの名無しさん
2014/01/01(水) 08:29:02.24http://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.360332デフォルトの名無しさん
2014/01/01(水) 14:15:29.97たぶんエストニア語の適用も出来てないし、そのテーブルとやらも使えてません。
まだロケールのことを知ったばかりで右も左も分からない状態なんでググりまくって調べてみます。
0333デフォルトの名無しさん
2014/01/01(水) 16:56:39.850334デフォルトの名無しさん
2014/01/01(水) 20:32:10.97アカウント取ってツイートしてみた。
0335デフォルトの名無しさん
2014/01/01(水) 23:33:47.34ツイート確認しました.
もともと転載してきたものだったので,自分ではちゃんと確認していませんでした.
そのうち本文の方は修正しますが,とりあえず,手元で求め直したものです↓
([^x]|x(x|yx)*([^xy]|y[^xz]))*(x(x|yx)*y?)?
0336デフォルトの名無しさん
2014/01/02(木) 05:33:17.28おお、ありがとうございます。動作もバッチリでした。すみませんでした、元旦から・・^^;
今年もよいお年を!
0337デフォルトの名無しさん
2014/01/03(金) 07:15:15.50http://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.07http://homepage2.nifty.com/jr-kun/hidemaru_qa/4_regulr.html
> 検索文字列(改良版): /\*/?([^/]|[^*]/)*\*/
これも間違い。先読みを使わない文字列否定ってそんなに難しいのかな・・
0339デフォルトの名無しさん
2014/01/03(金) 17:08:36.17<!--(.|\n)*-->|<[^>]*>
これも酷いなぁ..
しかもちょっと上に
>正規表現の「最長一致のルール」を 思い出しましょう。
って自分で書いてるのに..
0340デフォルトの名無しさん
2014/01/03(金) 17:15:28.37作者も本望だろう
0341デフォルトの名無しさん
2014/01/03(金) 17:21:24.34俺は10年に一人のスーパーハカーってか・・
0342デフォルトの名無しさん
2014/01/03(金) 17:29:19.060343デフォルトの名無しさん
2014/01/03(金) 17:30:08.87あるんだな、それが。これを知ってれば2文字の否定と長い文字の否定の難易度は同じ。
0344デフォルトの名無しさん
2014/01/03(金) 17:33:06.01サイト主さんは今でもブログやってるから連絡すれば修正してくれるんじゃね。
0345デフォルトの名無しさん
2014/01/03(金) 17:41:29.100346デフォルトの名無しさん
2014/01/03(金) 17:45:19.400347デフォルトの名無しさん
2014/01/03(金) 17:45:55.48もしくは裸コートをはだける感じ
0348デフォルトの名無しさん
2014/01/03(金) 17:47:03.120349デフォルトの名無しさん
2014/01/03(金) 17:49:19.870350デフォルトの名無しさん
2014/01/03(金) 17:50:07.270351デフォルトの名無しさん
2014/01/03(金) 17:55:18.460352デフォルトの名無しさん
2014/01/03(金) 17:57:14.430353デフォルトの名無しさん
2014/01/03(金) 18:00:52.760354デフォルトの名無しさん
2014/01/03(金) 18:27:54.76内気でなければ生きていけない
0355デフォルトの名無しさん
2014/01/03(金) 18:28:29.89スーパーハッカーなら正解も書いてよ
0356デフォルトの名無しさん
2014/01/04(土) 04:47:28.67/* *// */
これに全体がマッチする。これで何がいけないか分かるだろ。
0357デフォルトの名無しさん
2014/01/04(土) 17:11:40.50こう?/\*/?([^/]|[^/*]/)*\*/
0358デフォルトの名無しさん
2014/01/04(土) 20:36:30.29yx『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.940361デフォルトの名無しさん
2014/01/05(日) 07:21:31.32正解。先読みを使わない文字列否定では [^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.82Regular Expression(正規表現) Part12
http://toro.2ch.net/test/read.cgi/tech/1387257592/
0364停止しました。。。
NGNG■ このスレッドは過去ログ倉庫に格納されています