18/09/27 02:58:15.53 TOnM2DUW.net
>prolog
なるほど、"xyを含まない正規表現" のところに grail って書いてあったのは
prologとやらの実行ソフト名だったのか
URLリンク(github.com)
これの使い方を調べれば謎が解けそうですね
暇なときに試してみます、ありがとう
662:デフォルトの名無しさん
18/10/06 17:50:41.16 0JYIRqz1.net
検索対象文字 <test>a="akari"desu</test>
正規表現 a="*"
で、検索結果が「a="akari"」でなく、「a="」しか取得できないのはなぜでしょうか?
663:デフォルトの名無しさん
18/10/06 17:56:12.23 e52HQVrn.net
馬鹿には無理
664:デフォルトの名無しさん
18/10/06 18:01:22.57 FAIH8E2E.net
a=\".*\"
メタ文字(ダブルクォート)をバックスラシュでエスケープ
.(ピリオド)で任意文字で0文字以上(アスタリスク)をつければ
とりあえずイケル
それでも意図どおりにマッチングしないことは予見できる
665:デフォルトの名無しさん
18/10/06 18:14:31.01 OZkGL/sg.net
ワイルドカードと混同しちゃってるのか
ワイルドカードと正規表現を同時に使えるTresGrepなら動くかも
666:デフォルトの名無しさん
18/10/06 18:16:35.11 OZkGL/sg.net
正規表現っぽいIDになった?
667:デフォルトの名無しさん
18/10/06 18:23:52.49 OZkGL/sg.net
OZk G L /sg
ohzakiさんゲームのリンク
な気がしたので貼る、最近更新したばっかりやん
ゲーム関係のリンク
URLリンク(www.din.or.jp)
668:デフォルトの名無しさん
18/10/14 12:53:05.30 zaukh1NH.net
>>645
ワロタw
正規表現の*とワイルドカードは違うぞ。詳しくはググれ。
多分a="[^"]*"でいけると思うけど詳しくはググれ。
669:デフォルトの名無しさん
18/10/14 14:33:15.06 eP/1gSav.net
ちょいと質問させて
a="[^"]*"
と書くことが多いんだけど
a=".*?"
と書くのとで結果に違いでるのかな? <
670:デフォルトの名無しさん
18/10/14 14:56:27.64 EqzxaMkD.net
""のなかに改行が含まれてた場合、違いが出るよ
671:デフォルトの名無しさん
18/10/14 15:11:22.83 zaukh1NH.net
あと、.*?は使えない正規表現の処理系があるんじゃなかったっけか。詳しくは(ry
672:デフォルトの名無しさん
18/10/14 15:27:34.24 eP/1gSav.net
>>653-654
なるほど、ありがとうございました
673:デフォルトの名無しさん
18/10/14 22:51:29.78 yTLvFK6H.net
1、<test>a="[^\"]*"</test>
2、<test>a=".*?"</test>
この2つが↓これにどうマッチするか試してごらん
---------------------------------------------------------------------------
<test>a="pokemon"(^-^)</test> <test>a="doramon"</test>
----------------------------------------------------------------------------
674:650
18/10/14 23:38:50.12 wMwKNjnw.net
>>656
サンプルありがとう
でも、そういった検索/置換対象の場合だったら .*? は最初から考えないとは思う
675:デフォルトの名無しさん
18/10/15 00:13:04.80 fKW/Yset.net
この誤爆のことに注意を払えているなら .*? で問題ないよ
[^"] はそういう心配をしなくて良くなるからこっちを予防的に使うのもあり
676:デフォルトの名無しさん
18/10/15 22:36:58.63 fKW/Yset.net
# 文字列 xy を含まない正規表現
$states = 3;
@matrix = ( # E A p q ※ A は求める答え
[qw(X X E E)], # A = p + q = pε + qε
[qw(E X [^x] [^xy])], # p = p[^x] + q[^xy] + ε
[qw(X X x x)], # q = px + qx
);
677:デフォルトの名無しさん
18/10/15 22:37:39.83 fKW/Yset.net
# 文字列 xyz を含まない正規表現
$states = 4;
@matrix = ( # E A p q r ※ A は求める答え
[qw(X X E E E)], # A = p + q + r = pε + qε + rε
[qw(E X [^x] [^xy] [^xz])], # p = p[^x] + q[^xy] + r[^xz] + ε
[qw(X X x x x)], # q = px + qx + rx
[qw(X X X y X)], # r = qy
);
678:デフォルトの名無しさん
18/10/18 14:54:58.45 s3Db0e4D.net
y*(x*[^xy]y*)*x* について考察
左右対称形、後ろから読めば yx を含まない正規表現になる
x の後ろでは [^xy] しかマッチ出来ないようになっている
{[^x]|x+[^xy]}*x* # 状態遷移図から導かれる正規表現
# ※ ここでは見やすいように ( ) を { } としている
# 最後の x* は状態 0 から状態 1 への遷移を表している
[^x]*{x+[^xy][^x]*}*x* # 分岐の繰り返し ( | )* の展開
([^xy]|y)*{x+[^xy]([^xy]|y)*}*x* # [^x] を ([^xy]|y) に分解
y*{x*[^xy]y*}*x* # x+ を x* にすると中央の [^xy] が分解した [^xy] と
# 同じを動作するので分解した [^xy] を消せる、完成
679:デフォルトの名無しさん
18/10/18 23:54:36.85 s3Db0e4D.net
こっちのほうがスマートだ..
# 状態遷移図から導かれる正規表現
([^x]|x+[^xy])*x*
# [^x] を分解し、[^xy] と y にする
([^xy]|y|x+[^xy])*x*
# [^xy] と x+[^xy] を1つにまとめる
(y|(x+)?[^xy])*x*
# (x+)? は x* に書き換えられる
(y|x*[^xy])*x*
# 分岐ループを展開して完成
y*(x*[^xy]y*)x*
680:デフォルトの名無しさん
18/10/20 20:45:04.19 WB0b2hD6.net
(a|b|c)* の展開についての考察
# (b|c) を1つのパーツと考えて {a|(b|c)}* を展開する
a*{(b|c)a*}*
# 分配の法則
a*{ba*|ca*}*
# 再び (x|y)* の形が現れたのでここを展開する
a*(ba*)*{ca*(ba*)*}*
a=123、b=456、c=789 とすると
^(123)*(456(123)*)*(789(123)*(456(123)*)*)*$
681:デフォルトの名無しさん
18/10/21 19:43:06.22 7AODCPK7.net
(a|b|c|d)* の展開についての考察
a*(ba*)*{ca*(ba*)*}* の a は全て a* の形になっているのでこれを利用する
a を (a|d) に置き換えることで分岐を1つ増やす
(a|d)* = a*(da*)* なので a* を a*(da*)* に置き換えるだけで答えが求まる
a*(da*)*(ba*(da*)*)*(ca*(da*)*(ba*(da*)*)*)*
(a|b|c|d|f)* を求めたいときは同じように a* を置き換えるだけで求まる
このように a* は分岐を無限に増やす入り口のような役割をする
682:デフォルトの名無しさん
18/10/21 23:04:31.26 mkrTRrBN.net
このスレで名前が挙がってたTresGrep、気が付いたらbregonig.dllにも対応してるじゃん
プルダウンのモード切替で.NETの正規表現と切り替えられるのもいい感じ
もうこれでサクラエディタのGrepはお役御免にできるかもしれない
なんだけど・・・rubyの正規表現が全部使えるわけじゃないのに
「鬼雲検索」
を名乗るのはどうなんだろう
683:662
18/10/22 01:40:50.08 oA8lJo/T.net
>>665
ちょろっと試してみたけど戻り読みも後方参照も再帰もちゃんと動いたよ?
動かないのがあるならこちらで検証するよ~
684:名無しさん@そうだ選挙に行こう! Go to vote!
18/10/22 07:15:14.86 nc1bV2B+.net
全角スペースを\u3000と書いた場合とか
bregonigだとperl互換じゃない書き方は受け入れてもらえないわけで
685:662
18/10/22 14:03:03.71 oA8lJo/T.net
自分は文字コードの知識が無いので迂闊なことは言えないから
ちょっと調べたことだけ書いておくね
ここで
URLリンク(k-takata.o.oo7.jp)
\u0149 を検索してみるとbregonigでも使えてそうなことが書かれてたよ
686:662
18/10/22 21:23:16.87 oA8lJo/T.net
サクラエディタでいろいろ実験してたら \s が全角スペースにマッチした
サクラエディタ向けの正規表現を作るときには気を付けないといけないな
687:デフォルトの名無しさん
18/10/22 23:33:25.25 aIOUU5bU.net
bregonigは鬼雲の機能限定版(perl互換の正規表現だけが動く)って話をどこかで読んだ記憶があったんだよね
どうせやるなら本家onigmoのRuby版正規表現も全部動くようにすればいいのに、って思っただけなんだ
ちょっと難癖に近いなとは自分でも思ってる
\sもそうだけど\dに全角数字がマッチしちゃって痛い目に合うのもまれによくあること
サクラに限らないんじゃないかね
688:デフォルトの名無しさん
18/10/23 00:10:38.63 W9szHIq5.net
I/Fの問題だろう
Onigmoの仕様では、\sは
Unicode以外の場合:
\t, \n, \v, \f, \r, \x20
Unicodeの場合:
0009, 000A, 000B, 000C, 000D, 0085(NEL),
General_Category -- Line_Separator
-- Paragraph_Separator
-- Space_Separator
ASCII外の文字を含むかどうかは ONIG_OPTION_ASCII_RANGE オプションに依存する。
とある
実際、サクラエディタで試すと、
2028(LS),2029(PS),
0009,000a,000b,000c,000d,0085,
0020,00a0,1680,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,200a,202f,205f,3000(SS)
がマッチする
なので、サクラエディタはUnicodeで鬼雲を使ってると思われる
Janeの場合でも、StyleはSJISであり、XenoはUnicodeなので
スレリンク(software板:515番)
に対して、\d{6}がマッチするのはXenoのみである
689:662
18/10/23 00:11:35.27 FESm7ID8.net
なるほど、dll からは ONIG_SYNTAX_PERL しか使えないから
ruby を使い慣れてる人にとっては歯がゆいと..
> \dに全角数字がマッチしちゃって
ですね~、(?a) で防げるようなので覚えておきます
690:デフォルトの名無しさん
18/10/23 00:18:39.55 FESm7ID8.net
レスが被ってしまった..
>>671
ありがとうございます
サクラエディタはUnicode仕様で動いているんですね
う~ん、文字コードの話は難しいなぁ
691:デフォルトの名無しさん
18/10/23 00:24:56.92 W9szHIq5.net
なおUnicodeの空白でも、上記のCc(0009~0085)、LS,PS,Zs(Space Separator)
以外のCf(200b,200c,200d,FEFF)だとどうかなと試したが案の定マッチしなかった
さすがは仕様どおりだ
692:デフォルトの名無しさん
18/10/23 01:02:05.21 FESm7ID8.net
> 200b,200c,200d,FEFF
サクラエディタにIMEパッドから打ち込んで試してみたら同じくマッチせず
# 主要部
(?&sp)
# 定義部
(|(?!)
(?<sp>
(?u)
[\x{200b}\x{200c}\x{200d}\x{FEFF}\s]
)
)
自分がこれ使うことは永遠になさそうだけどとりあえず..
693:デフォルトの名無しさん
18/10/23 03:03:21.50 FESm7ID8.net
>>3
ジオから移転
正規表現パズル
URLリンク(oraclesqlpuzzle.ninja-web.net)
694:デフォルトの名無しさん
18/10/25 14:38:08.86 4OmhnPU0.net
あるファイルパスがありディレクトリのN階層目までのみを抽出したいのですが、正規表現について教えてください
例えばこんな入力のリストがある場合
aaa
aaa/bbb/ccc
aaa/bbb/ccc/ddd/eee/fff
で各リストに対して2階層目までを取得したい場合
aaa
aaa/bbb
aaa/bbb
となるのが期待値です。
((?:¥w+¥/?){1,2})とかしてみたんですが上手くいきませんでした、お手数ですがよろしくお願いします
695:デフォルトの名無しさん
18/10/25 15:23:45.93 RdSksp9Y.net
>>677
正規表現はプログラム言語や正規表現オブジェクトのオプションによって
動作がけっこう変化するので質問するときはそういうの書いてね
[^/]+(?:/[^/]+)?
ただしこれは正しいパスが与えられることを前提としているので注意
696:デフォルトの名無しさん
18/10/25 15:29:23.12 ZE3NVml1.net
/ の数が、0~2
697:デフォルトの名無しさん
18/10/25 15:39:26.06 5Cy/pQlU.net
./ で始まってたらどう数えるん
/ で始まってたら?
698:デフォルトの名無しさん
18/10/25 17:47:09.80 4OmhnPU0.net
>>678
ありがとうございます、perlが希望でしたので次回から書くようにします
例は2階層で固定のようですが、ちなみにn階層目とか可変で書くような場合は下記のような感じで良いでしょうか?
[^/]+(?:/[^/]+){0,n-1}
699:デフォルトの名無しさん
18/10/25 18:40:41.61 RdSksp9Y.net
ああ、N階層までのマッチという質問だったのか、ごめんね
それで合ってるよb
700:デフォルトの名無しさん
18/10/26 10:18:13.83 MwloQati.net
暇つぶしに鬼雲の再帰処理に欠陥がないか探してみたけど見つからなかった
例、\1 を空文字にマッチさせて再帰の無限ループを狙う
()(?<name>a|\1\g<name>c)
例2、<x> を複数使ってマッチするのが空文字ではないように見せかける
(?<x>)(?<x>text)(?<name>a|\g<x>\g<name>c)
701:デフォルトの名無しさん
18/10/26 23:39:01.03 MwloQati.net
・perl 5.22
if ( "a" =~ /^\Fa\E$/ )
{ print "match.\n"; }
else
{ print "no.\n"; }
# 結果: match.
・ サクラエディタ + bregonig.dll (ONIG_SYNTAX_PERL)
検索欄: ^\Fa\E$
テキスト: a
結果: 見つかりませんでした
\F の意味が知りたい..
702:デフォルトの名無しさん
18/10/26 23:58:52.37 MwloQati.net
URLリンク(perldoc.jp)
> \F \E まで畳み込み文字にします
bregonig.dll は Perl 5.14 ほぼ準拠だからまだ未対応らしい
703:デフォルトの名無しさん
18/10/28 00:53:19.71 ZnGbnC1U.net
URLリンク(jane2ch.net)
レス241からの高速化の話題を検証してみた
レス243
>1は例えば (?:http://)~ と、始めの数バイトをグループ化してやると速くなる
検証結果: 速度変わらず
レス245
> : の部分で一旦切れるようにすれば条件は平等になると思う
> (?:http:|ttp:|tp:) が速いわけではないと分かる
検証結果:
1. 10.345 ms
2. 10.560 ms
3. 05.130 ms
結論: (?:http:|ttp:|tp:) は速かった
704:デフォルトの名無しさん
18/10/28 01:36:44.44 ZnGbnC1U.net
<鬼雲のリファレンス>
(?<element> \g<stag> \g<content>* \g<etag> ){0}
(?<stag> < \g<name> \s* > ){0}
(?<name> [a-zA-Z_:]+ ){0}
(?<content> [^<&]+ (\g<element> | [^<&]+)* ){0}
(?<etag> </ \k<name+1> >){0}
\g<element>
<とんこ式記述法>
\g<element>
(?!(?!)tonco
(?<element> \g<stag> \g<content>* \g<etag> )
(?<stag> < \g<name> \s* > )
(?<name> [a-zA-Z_:]+ )
(?<content> [^<&]+ (\g<element> | [^<&]+)* )
(?<etag> </ \k<name+1> >)
)
リファレンス方式は後ろの {0} を読むまでそこが定義だと分からない
main部と定義部の境がはっきりせず読みにくい
対してとんこ式は (?!(?!)tonco 以降が定義部だと分かるので読みやすい
(?!(?!)tonco を とんこ で辞書登録しておけば {0} をコピペしなくて済む
とんこ式の とんこ とは発案者の名前とのこと
705:デフォルトの名無しさん
18/10/28 14:53:16.06 ZnGbnC1U.net
これらの記述法には1つ弱点があり
(?<name>ほにゃらら){0}
より前に
\k<name>
が出現すると文法エラーになる
例、
(?<tag>foo \k<name> bar){0}
(?<name>ほにゃらら){0}
\g<tag>
このため定義する順序が限定されてしまう、これは解消されるべき問題である
706:デフォルトの名無しさん
18/10/28 15:07:39.92 ZnGbnC1U.net
↑これの例はおかしいな、このレスは取り消し
707:デフォルトの名無しさん
18/10/28 15:36:10.31 ZnGbnC1U.net
昨日、詳説 正規表現の本を枕の下に置いて寝た
寝ている間に正規表現のパワーがもらえると思ったからだ
すると.. 夢に正規表現の神様が現れた
神様 「 \1 はな、 ${1} と書いてもマッチするんじゃよ」
朝、目覚めると飛び起きてperlを動かしてみた
if ( "aa" =~ /(a)${1}/ )
{ print "match!!\n"; }
else
{ print "no match..\n"; }
実行結果を見た私は奇跡を見ていた
708:デフォルトの名無しさん
18/10/28 20:54:51.63 ZnGbnC1U.net
revilog.com/2012/08/7939.html
> a?[a-z] という正規表現は [b-z]|aa? という正規表現と
> 等価であり置換可能
前者は ab にマッチするが後者は...
> 同様に[a-z]?[A-z]という正規表現は [A-Z]|([a-z][a-z]?)
> という正規表現と 等価であり置換可能
前者は aA にマッチするが後者は...
709:デフォルトの名無しさん
18/10/29 00:52:40.24 BYis7ms7.net
・ perl 5.22
use strict;
use warnings;
use encoding "cp932";
binmode STDERR, ':encoding(cp932)';
if ( "アイウエオ" =~ /\p{Katakana}/ ){ print "match!! <$&>\n"; }
else { print "no match..\n"; }
# 結果: match!! <ア>
・ bregonig.dll (shift_jis)
検索:\p{Katakana}
対象:アイウエオ
結果:見つかりません
サクラエディタ (unicode) ではマッチした
(?a)\p{Katakana} でもマッチ
710:デフォルトの名無しさん
18/10/29 01:00:01.03 BYis7ms7.net
perl がマッチするのはもしかしたら内部的にunicodeになってるとかかな
自分はプログラマじゃないんでさっぱり
711:デフォルトの名無しさん
18/10/29 01:09:53.75 BYis7ms7.net
どうやら当たりらしい、unicodeに変換してからマッチしてた
if ( "あ" =~ /\x{3042}/ ) # true
if ( "あ" =~ /\x{82A0}/ ) # false
712:デフォルトの名無しさん
18/10/29 19:52:31.20 BYis7ms7.net
・再帰の穴を狙う2
(str)
(?<name>
(?(1)yes|no)
\g<name>
|inner)
↓これに書き換えると
(?(1)yes) → 文法エラー
(?(1)|no) → 文法エラー
ガードが鉄壁ですごい、ほんと良く出来てるな~
713:デフォルトの名無しさん
18/10/31 16:56:37.48 ZWlmxwfj.net
(?(条件)真の式|偽の式) の不具合を発見
() に "?:" を付けるかどうかで結果が変わってしまう
対象テキスト: 13 に対し、
1、
\A(?<name>1)(?(<name>)(2|3))\z
結果:マッチ
2、
\A(?<name>1)(?(<name>)(?:2|3))\z
結果:みつかりません
bregonig.dll (shift_jis, unicode 両方で確認)
ちなみに対象テキストを 12 にするとどちらもマッチする
714:デフォルトの名無しさん
18/10/31 17:14:05.35 ZWlmxwfj.net
やっぱりこれ欲しいなぁ
検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) )
置換:\k'color'
対象テキスト: blue
置換結果:青
これの有無で便利度が数段変わるんだよね
これの代わりに複数回の置換を行うと \G を使うときに困る
同じものを複数回検索するので速度低下に繋がる
715:デフォルトの名無しさん
18/10/31 19:55:08.08 ZWlmxwfj.net
・ (?'name=~' )
変数name の中身をマッチテストする先読みの親戚のようなもの
(?'name' <div> .*? </div> )
(?:
(?'name=~' \A .* abc .* \z)
pattern1 # タグの間に abc があるとき
|
(?'name=~' \A .* def .* \z)
pattern2 # タグの間に def があるとき
|
pattern3 # それ以外のとき
)
これもあると便利だけど (?(name) | ) で代用出来るから必要度は低い
716:デフォルトの名無しさん
18/11/01 00:56:07.61 +M+OiFJp.net
動画を正規表現に変換
URLリンク(www.youtube.com)
検索: ^(.*)タマ(.*)タマ(.*)
717:$ 置換: $1$2$3
718:デフォルトの名無しさん
18/11/01 01:35:03.88 zrOHiVOt.net
ニュタマーハタマーフ
719:デフォルトの名無しさん
18/11/01 17:25:34.93 +M+OiFJp.net
(*^-^*)
720:デフォルトの名無しさん
18/11/01 17:34:43.67 +M+OiFJp.net
>>696 のバグがrubyでも起こることを確認
ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32]
原因は bregonig.dll でなく Onigumo にあるようだ
これは気付きやすい部類のバグだと思うんだけど
今までバグ報告が無かったようなのが不思議
takata神はここ見てるのかな
721:デフォルトの名無しさん
18/11/01 17:41:25.59 +M+OiFJp.net
# ruby動作確認用コード
if '13' =~ /\A(?<name>1)(?(<name>)(?:2|3))\z/
# if '13' =~ /\A(?<name>1)(?(<name>)(2|3))\z/
p 'yes'
else
p 'no'
end
722:デフォルトの名無しさん
18/11/01 23:04:15.23 dBKH7CcG.net
>>693
perlの場合、Encode::decode()でperl内部処理用文字コード(utf8の亜種っぽい何か)に
正しく復号しないと正規表現クラスを正しく使えない。
723:デフォルトの名無しさん
18/11/02 01:26:49.16 XP4jtOby.net
>>704
解説ありがとうございます
ということは今まで自分はperl内部の独自の文字コードにエンコードされた文字列に
対して正規表現を使っていたわけですね、恥ずかしながら初めて知りました
724:デフォルトの名無しさん
18/11/05 20:41:07.84 SJelCvn/.net
>>685
畳み込み文字ってなんですか?
725:デフォルトの名無しさん
18/11/05 23:47:01.14 xCFT0arz.net
(?:
( V ) > (0 -1)
|
( . ) > (1 0)
)
俺も分からん
726:デフォルトの名無しさん
18/11/06 18:39:37.29 4TN3vyid.net
<正常>
(1)?
(?(1)(?:2|3)|4)
(1)?
(?(1)(?:2|3)|(?:4|5))
(1)?
(?(1)2|(?:3|4))
(1)?
(?(1)(2|3))
(1)?
(?(1)(?>2|3))
----------------------------
<異常>
(1)?
(?(1)(?:2|3))
727:デフォルトの名無しさん
18/11/06 19:30:27.97 4TN3vyid.net
<異常>
(1)?
(?(1)(?:2|(3)))
置換: [$2]
対象テキスト: 3
結果: [3]
-----------
<正常>
(1)?
(?(1)(?>2|3)|4)
(1)?
(?(1)(?>2|3)|(?>4|5))
728:デフォルトの名無しさん
18/11/06 19:36:59.61 4TN3vyid.net
>>709 の実験でバグの原因が分かった
1、不要なカッコを取り除く処理が (?: ) を取り去った
2、分岐の "|" の意味合いが変わってしまった
ということだね、原因が分かれば回避が簡単なのでこのまま放置でも良さそう
729:デフォルトの名無しさん
18/11/09 18:21:43.84 BZlL2mTg.net
perl5.14
# 1文字が2文字にマッチ
if ( "fi" =~ /\A\x{fb01}\z/i ){ print "true\n"; } else { print "false\n"; }
730:デフォルトの名無しさん
18/11/09 18:52:26.91 BZlL2mTg.net
if ( "K" =~ /\A\x{212A}\z/i ) true
if ( "K" =~ /\A\x{212A}\z/il ) false
731:デフォルトの名無しさん
18/11/09 21:22:21.15 BZlL2mTg.net
if ( "\x{212A}" =~ /[[:print:]]/ ) true
if ( "\x{212A}" =~ /[[:print:]]/a ) false
732:デフォルトの名無しさん
18/11/10 00:04:00.21 EY2CMtcP.net
\d{0,32766}
# ok
\d{0,32767}
# error "Quantifier in {,} bigger than 32766 in regex;"
733:デフォルトの名無しさん
18/11/10 00:21:29.46 EY2CMtcP.net
# \d{0,} は 32766回 を超えてマッチ可能
my $str = "";
for ( $count = 0; $count < 33000; $count++)
{ $str = $str."0"; }
print "\$str\.length = " , length($str) , "\n";
if ( $str =~ /\A\d{0,}\z/ )
{ print "true\n"; } else { print "false\n"; }
# 結果
# $str.length = 33000
# true
734:デフォルトの名無しさん
18/11/10 18:21:06.77 EY2CMtcP.net
# 検索表現の途中にある \G をマッチさせる
my $str = 'abcde';
$str =~ /abc/g;
if ($str =~ /abc\Gd/){ print "true\n"; } else { print "false\n"; }
735:デフォルトの名無しさん
18/11/13 00:16:05.06 QabZTjVa.net
# (?1) の直前に (?i) を置いても効かない
if ( "Aa" =~ m/(?i)(A)(?1)/ )
{ print "true <$1>\n"; } else { print "false\n"; }
# 結果:true <A>
if ( "Aa" =~ m/(A)(?i)(?1)/ )
{ print "true <$1>\n"; } else { print "false\n"; }
# 結果:false
736:デフォルトの名無しさん
18/11/13 05:19:20.83 QabZTjVa.net
## (?{code}) を使って >>697 の置換
if ( "ybrybrb" =~ /
\A
(?|
(?<赤>r)(?{ "aka"; })
| (?<青>b)(?{ "ao"; })
| (?<黄>y)(?{ "ki"; })
)*
brybrb ## バックトラックに対応出来るか試す
\z
/x )
{ print "true. Color <${1}> is <${^R}> .\n"; } else { print "false.\n"; }
## 結果: true. Color <r> is <aka> .
## バックトラックの対応、成功
737:デフォルトの名無しさん
18/11/13 21:32:36.34 QabZTjVa.net
# 仲間外れを探せ
if ("\x{1990}" =~ /
\N{U+1990}
#\N{1990}
#\N{NEW TAI LUE LETTER HIGH NA}
/x){ print "match.\n"; } else { print "false.\n"; }
738:デフォルトの名無しさん
18/11/14 10:41:07.07 Hh1ptiAj.net
717
739:デフォルトの名無しさん
18/11/14 14:37:49.07 duOGmOFb.net
ワロタw
740:デフォルトの名無しさん
18/11/14 18:45:40.17 I91AeKub.net
このクイズだか検証だかよくわからんの書き連ねてるのは何なの?
一人で無意味に書き連ねてるの?誰かとやりとりしてるの?
741:デフォルトの名無しさん
18/11/14 23:41:31.78 cpUdYoRF.net
正規表現の勉強をしながら気付いたことをメモってるだけです
基本的には一人でやってます
仲間が欲しい...
742:デフォルトの名無しさん
18/11/14 23:44:34.67 CNd6PM4x.net
ここはお前のチラシの裏なのか
ある程度まとまってんならともかくメモ書きなら他所でやれよ
743:デフォルトの名無しさん
18/11/15 00:11:59.19 Ow4iH1sO.net
需要ないかな?無いならやめます
744:デフォルトの名無しさん
18/11/15 22:32:34.48 IM0UsOCP.net
無いよ
745:デフォルトの名無しさん
18/11/16 17:20:00.59 eADG8kUk.net
bregonig.dll の (?a)\w の処理速度が遅い
(?u)\w と同じ速さ
\s や \d や [a-zA-Z_] より4倍の遅い
改善の余地ありそうだね
746:デフォルトの名無しさん
18/11/17 03:22:15.33 YADh6pBI.net
## (?(R1)yes|no) のサンプルコード
if ("abc23yz" =~ /
\A
( # $1
( # $2
a(?1)z
|
b(?2)y
|
c(?(R1)1|2)(?(R2)3|4)
) # $2
) # $1
/x){ print "match. <$&> \n"; } else { print "false.\n"; }
# 結果: match. <abc23yz>
# aとzの間にあるcは (?1) の中でマッチしているが
# bとyの間でもあるため (?2) の中でもある
# この場合はcを直接覆っている (R2) だけがyesになる
# 直接でない (R1) はnoになる
747:デフォルトの名無しさん
18/11/17 12:49:09.25 Oiq/x6oK.net
いつまで続くの?
748:デフォルトの名無しさん
18/11/21 19:34:31.80 CU3gUCH4.net
●Regular Expressionの使用環境
C#
●検索か置換か?
置換
●説明
先頭の全角スペースのみを置換したい
先頭の全角スペースは1文字の場合もある
●対象データ
ああああ あ あ あ あ あ
●希望する結果
空空空ああああ あ あ あ あ あ
749:デフォルトの名無しさん
18/11/21 23:39:43.26 UsYfXb0d.net
>>730
Regex.Replace(str, @"(?<=^\s*)\s", "空");
750:デフォルトの名無しさん
18/11/21 23:41:52.91 UsYfXb0d.net
あ全角スペースか
\sを全角スペースに変えて
751:デフォルトの名無しさん
18/11/22 01:15:55.43 YNRtrxPu.net
可変長の戻り読みは便利だけどコールバックで処理するのが普通じゃないかな
URLリンク(ideone.com)
752:729
18/11/22 03:09:11.69 YAZbwzDX.net
>>733
たしかにそっちの方が倍くらい速かった
ちなみに正規表現関係ないけど
var trimed = str.TrimStart(' ');
var replaced = new string('空', str.Length - trimed.Length) + trimed;
とか
var sb = new StringBuilder(str);
for(int i = 0; i < sb.Length; i++) if (sb[i] == ' ') sb[i] = '空'; else
753:break; とかにするとさらに10倍以上速かった 正規表現使わないでもいい時はなるべく使わないほうがええね
754:デフォルトの名無しさん
18/11/22 11:43:47.30 sD3Vu3lJ.net
>>731-734
どうもありがとうございました
755:デフォルトの名無しさん
18/11/26 03:08:54.11 bvNwlvbS.net
Regex.Replace(str, @"\G ", "空");
でもいけるよ
756:デフォルトの名無しさん
18/11/26 06:49:56.12 OBhrl1nm.net
>>736
・・・っ、すごい。サクラエディタとかでも使える。
\Gのありがたみ知らなかった。私は、まだまだ精進が足りないようだ。
757:デフォルトの名無しさん
18/11/27 00:09:50.92 5gbDlA47.net
\Gを知らないのに正規表現を使いこなせるということはproxomitronのユーザーさんかな
758:デフォルトの名無しさん
18/11/28 15:10:22.46 N4CCGDXj.net
\Gの使い方を覚えたら>>716が面白く感じるかもね
知ってれば今更感しかないが
759:デフォルトの名無しさん
18/11/29 02:42:35.12 Fz25AUlj.net
>>507-508
すごい
こういう書き込みが初心者の質問とその回答で埋もれてしまうのはもったいない
質問スレとは別に正規表現の本スレらしいスレがあるといいな
760:デフォルトの名無しさん
18/11/29 02:52:05.30 rs9fzmaE.net
頑張ったなぁとは思うけど URLリンク(regex101.com) じゃあかんかったか?とも思う
というかリンク貼れんの? URLリンク(goo.gl)
761:デフォルトの名無しさん
18/11/29 08:19:27.68 nDdllTwV.net
自分で立てればいいのになんで他人頼みなの?
762:デフォルトの名無しさん
18/12/02 03:28:37.05 s0yCsMa3.net
>>740
じゃあ俺が立てるわ、テンプレの準備にちょっとかかるが
763:デフォルトの名無しさん
18/12/08 16:06:50.58 7G2k61ed.net
twitter.com/munesuk
enya_go/status/1071188833515954176
先輩w
764:デフォルトの名無しさん
18/12/08 20:04:57.14 RNQqcEtu.net
アンド検索をしたいのですが、どう書けばいいでしょうか
^(?=.*あああ)(?=.*かかか).*$
このコードを見つけました
あああ と かかか の含まれる行がヒットします
ただ、ロジックがちょっとわかりません
先読みをつかっているのですが、先読み対象の語が指定されていません
これはどういうことでしょうか
分かりやすい解説サイトでもあれば教えてください
765:デフォルトの名無しさん
18/12/08 20:32:25.49 Dx33rAX6.net
このへんかな
>正規表現で論理積(AND)を実現する
>URLリンク(qiita.com)
自分流のちょっと乱暴な理解解釈だと
1. (?=検索対象) は、この条件が満たされないと後続のマッチを調べない
2. (?=検索対処) 自体は、この条件が満たされてた時点である意味消滅したかのようにふるまう
って動きを取るような感じ
ちなみにAND検索ができるgrepツール(TresGrep)がどんな正規表現を組み立てるか調べてみたら
「xxx&yyy&zzz」
↓
「xxx.*?(yyy.*?zzz|zzz.*?yyy)|yyy.*?(xxx.*?zzz|zzz.*?xxx)|zzz.*?(xxx.*?yyy|yyy.*?xxx)」
なんてのを吐き出した
安直だけどまあこれも間違ってはいない
766:デフォルトの名無しさん
18/12/08 20:35:48.50 Dx33rAX6.net
あ、先読み対象の語は「^」だけで
「行頭から始まるという条件さえ満たせば何でもよ
767:い」と指定してる
768:デフォルトの名無しさん
18/12/08 22:19:09.33 7G2k61ed.net
環境が分からない
何を検索したいのか分からない
>先読みをつかっているのですが、先読み対象の語が指定されていません
??? 指定されてないって何のことだろう、意味不明
正規表現うんぬんの前にまともな質問の仕方を学ぶべき
769:デフォルトの名無しさん
18/12/08 22:26:59.96 RNQqcEtu.net
>>746
先読み対象は行頭ということですね
^(?=.*あああ)
これだと意味としては
「あああの前に行頭が存在すればヒット」
ということになると思います
これってもう少しかみ砕いた表現にできませんか?
まだ、理解が追い付いてないです
行頭が存在すればヒットということは、「行の中にあああがあればヒット」と同じことですか?
770:デフォルトの名無しさん
18/12/08 23:05:31.04 hZepSGXS.net
>>749
^は検索位置を示すもので、先頭を表す記号、
(?=)は先読みで検索開始位置を移動しないもの
つまり、
^(?=.*あああ)
は、先頭から(改行までの間に)文字列「あああ」がある場合
(先読みなのでマッチ後も次の検索開始位置はまだ先頭のまま)
よって
^(?=.*あああ)(?=.*かかか)
は、先頭から(改行までの間に)「あああ」があり、且つ先頭から「かかか」がある場合
.*$は不要だが、付けると、改行が存在すると絶対マッチしなくなる点が異なる
771:デフォルトの名無しさん
18/12/09 06:54:41.50 C3Qast1U.net
↑かっこを二つならべると、()と()という感じで、アンドになるんでしょうか?
あと
(?=)は先読みで検索開始位置を移動しないもの
の部分なんですが、検索開始位置を移動しないというのはどういうことでしょうか
?=キーワード
で設定した場合、キーワードの相対位置から前を検索する、という認識でした
772:デフォルトの名無しさん
18/12/09 08:43:46.17 UT294bNs.net
質問者は正規表現の基礎知識が足りてないと思われる
たとえるなら、(?=)の先読みは高校受験レベルで求められる英文法だとすると
質問者の場合は入門レベル(そもそもの基本ルールとか「.*」とか)の知識がごそっと抜けてる
なのでここまで出てきた説明を読んでもちんぷんかんぷんにしかならないのだろう
ちょっと遠回りになるけどちゃんと正規表現の基礎を理解したほうがいい
URLリンク(qiita.com)
あたりを最終回(その4)まで読め
それでも理解できないなら、貴方には正規表現を扱うのは無理だからあきらめろ
773:デフォルトの名無しさん
18/12/09 09:50:40.98 vJutpfX/.net
>>751
()()でandになるわけではなく、()の次に()があるかどうかとなる(順序関係ができている)
^(a)(b)と書くと、abにはマッチするがaやbやbaにはマッチしない
これは、^(a)がマッチした時点で検索位置がaの次に移動しているためである
^(?=a)(b)と書くと、何もマッチしなくなる
これは先頭からaが見つかった場合、検索開始位置が移動しないため(?=a)を検索する前のまま(つまり先頭)になっている
次にbが先頭にあればいいわけだがそこにはaがあるからマッチしない
774:デフォルトの名無しさん
18/12/09 10:39:42.84 bsA2M6bZ.net
ID:vJutpfX/
頭が良すぎて教えるのが下手なパターン
バカ語で話さないと通じないよ
775:デフォルトの名無しさん
18/12/09 10:51:59.84 bsA2M6bZ.net
こんな最低限のこともググらず、自分で努力せずに人に聞くようなのに
教えてはいけないと思う、居ついてしまうからエサを与えないで欲しい
776:デフォルトの名無しさん
18/12/09 11:55:43.32 C3Qast1U.net
>>753
動かしながら覚えてみます
ありがとうございます
777:デフォルトの名無しさん
18/12/09 12:38:27.41 H3JhKeet.net
動かしながら覚えるんじゃなくて
>>752でも何でも良いけど、説明読んで覚えて欲しい
中途半端な事してるから、>>751みたいに間違った解釈になるんでしょ
778:744
18/12/09 19:23:00.27 i2SuH64K.net
うーん、一応はレス内容から質問者がどの程度内容を理解したか/理解する気でいるか
透けて見えるんだけどね
>>746のURLの記事を読んだうえでこの程度のレスしか返ってこず、さらに
最終的には>>756のようなリアクションが返ってきたか
回答して残念な気持ちになったよ
779:デフォルトの名無しさん
18/12/09 19:57:20.13 sTKdTIE5.net
位置の理解は言うほど易しくはないとおもわれ
正規表現検索とはテキストエディタでカーソルを1つずつ進めながら
合致する文字を1文字ずつ探っていくようなものだというイメージが必要だけど
そこをちゃんと説明してるものはあまり見かけない
780:デフォルトの名無しさん
18/12/09 20:00:27.58 bzQOhihu.net
知恵遅れに場所を移動したらしい
URLリンク(detail.chiebukuro.yahoo.co.jp)
まずは自習しろよw
781:デフォルトの名無しさん
18/12/09 21:49:11.61 bsA2M6bZ.net
回答した人は親切丁寧に回答出来ていたよ、お疲れ様
上にも書いたように頭のいい人にしか理解出来ない回答になっていた
俗にいう分かってる人にしか分からない説明ってやつ
俺はこういうバカに教えるのは得意だから俺が回答を付ければ理解されたと
思うけど注意をスルーされたのでスルーした
782:デフォルトの名無しさん
18/12/10 14:42:13.07 RU/iAdEK.net
知恵袋で質問を4000件以上やりとりしてる人だったのか
それなのに質問の仕方がまったくダメって
783:デフォルトの名無しさん
18/12/10 17:07:38.24 RU/iAdEK.net
質問のペースがおかしい、1日に質問6つしてる
ググるより先に質問してんのか?
784:デフォルトの名無しさん
18/12/10 17:25:29.04 RU/iAdEK.net
URLリンク(detail.chiebukuro.yahoo.co.jp)
おまえらはこんなの相手に一生懸命教えてたのか
自分を安売りしすぎ、もってけ泥棒状態
785:デフォルトの名無しさん
18/12/10 17:25:37.52 RTUhzLAF.net
そして回答はアダルトカテゴリのみという…
786:デフォルトの名無しさん
18/12/10 17:29:58.71 RU/iAdEK.net
やっぱ質問スレと本スレは分けるべきだな
この流れになると賢い人が来なくなってしまう
787:729
18/12/10 18:14:05.41 PtRqcV9k.net
なんで馬鹿が一匹きただけでそういう話になるんだよ
過剰対応の典型やろ
788:デフォルトの名無しさん
18/12/10 21:59:56.06 RU/iAdEK.net
入門サイトすら読んでないような人の質問とその回答にうんざりして
来なくなった人は大勢いると思うんだがそういう人達が集まれるスレが
あったらひょっとしたらすごいスレになるんじゃないかという期待がある
実際はただ過疎るだけなんだろうけどね
789:デフォルトの名無しさん
18/12/11 02:31:31.29 oKdEGQIj.net
隔離スレなんて作るだけ無駄だろ
機能してるところなんて見たこと無い
790:デフォルトの名無しさん
18/12/11 02:44:05.34 4gYtUlOJ.net
PCサロン板なら迷惑にならなそうなので立ててみた
【PCサロン】正則表現 part1
スレリンク(pc2nanmin板)
基本過疎進行ですが正規表現を使いこなせる人同士で語りたい方はこちらで
791:デフォルトの名無しさん
18/12/13 17:01:35.11 IMhQiOyS.net
回答が付いた。でも微妙におかしい。つっこんであげるべきか?
792:デフォルトの名無しさん
18/12/14 20:59:53.53 DlmPms4F.net
^
(?:
(?!あああ|かかか).
)*+
(?>
(あああ)
|
かかか
)
(?:
(?!あああ|かかか).
)*+
(?(1)かかか|あああ)
.*+$
793:デフォルトの名無しさん
18/12/14 21:11:35.41 DlmPms4F.net
^
(?~あああ|かかか)
(?>
(あああ)
|
かかか
)
(?~あああ|かかか)
(?(1)かかか|あああ)
.*$
794:デフォルトの名無しさん
19/01/10 03:02:56.41 mY602DpM.net
FirefoxやChromeのブックマークにこれ登録して
URLリンク(i.imgur.com)
ブラウザのアドレスバーに
re foo|bar|baz
と入れると
URLリンク(regexper.com)
に飛べるようになる
簡易チェッカーとして便利
795:デフォルトの名無しさん
19/01/10 14:50:11.25 Q3mhk3sM.net
>>774
いいねw まったく思い付きもしなかったアイデアwww
796:デフォルトの名無しさん
19/01/10 15:21:01.00 Q3mhk3sM.net
>>774
chrome on mac だけどブックマークではダメで、設定→検索エンジン→検索エンジンの管理→追加 から登録しないといけなかったわ。
797:デフォルトの名無しさん
19/01/13 18:46:07.60 vFHHKg45.net
URL(http|https)の正規表現って難しいのかね
URLリンク(mathiasbynens.be)
38charsのが好きだわ
798:デフォルトの名無しさん
19/01/26 10:17:12.64 rNPVIr5d.net
否定先読み
と言うのがなかなか理解出来ないのですが、
サンプルを動かすと確かに動作するのですが、
今一つ仕組みが分かりません。
どんなふうに理解すれば良いのでしょうか?
799:729
19/01/26 10:42:36.00 K4a4emwR.net
文字じゃなくて位置(文字と文字の間)に一致すると考えればいい
たとえば
abcdef
が対象の場合
肯定先読み(?=def)は直後にdefがある位置(cとdの間の位置)に一致する
abc[ここ]def
否定先読み(?!def)は直後にdefがない位置に一致する
[ここ]a[ここ]b[ここ]cd[ここ]e[ここ]f[ここ]
行頭の^や行末の$も文字じゃなくて位置に一致する
800:デフォルトの名無しさん
19/01/26 11:13:09.45 yVAkGzul.net
なるほどthx
801:デフォルトの名無しさん
19/01/26 11:53:37.94 mL4if6wW.net
>>779
横からだけど、否定のほうはなるほどだわ
条件を絞るつもりが広げちゃってる場合があるんだな
802:デフォルトの名無しさん
19/01/26 15:19:07.07 exLOU4gz.net
先読みはマッチさせたら、マッチ開始位置に戻るから、
単なる位置指定で、幅を持たない。
単なる条件を追加した、フィルター
否定先読みはマッチしない場合に、マッチ開始位置に戻る
先読みは、マッチ位置の直後の条件を指定するが、
戻り読みは、マッチ位置の直前の条件を指定する
803:デフォルトの名無しさん
19/01/27 10:46:10.47 Th+zYLMn.net
>>779
ありがとうございました。
良く分かりました。
804:デフォルトの名無しさん
19/01/28 10:47:47.80 wg8XKdax.net
.netでの正規表現に迷ってます。
次の文字列のとき、"efgh/1"以降に"/"が含まれないときマッチするような正規表現を書きたいのです。
URLリンク(192.168.1.100) →True
URLリンク(192.168.1.100) →False
URLリンク(192.168.1.100) →True
URLリンク(192.168.1.100) →False
URLリンク(192.168.1.100) →True
次のような正規表現を試してみましたが、数値1文字しか対応できませんでした。
\/efgh\/[0-9]+(?!\/)
805:デフォルトの名無しさん
19/01/28 10:57:25.94 DdBbxYrt.net
\/efgh\/1[^/]*$
ではダメかな
806:デフォルトの名無しさん
19/01/28 12:18:39.25 c4Y7c3OH.net
>>785でいいと思う
あとスラッシュにエスケープは不要だから/efgh/1[^/]*$
否定先読みが使いたいなら /efgh/[0-9]+(?!.*/)
(?!.*/)はそれ以降/が含まれない位置という意味
(?!/)だと直後に/がない位置という意味だから数字が2文字以上続いたらマッチしてしまう
807:デフォルトの名無しさん
19/01/28 12:21:15.63 c4Y7c3OH.net
ごめん1って決まってるならこれでいいな
/efgh/1(?!.*/)
808:782
19/01/28 15:51:48.42 wg8XKdax.net
>>785-787
ありがとうございます!
正しい判断をすることが出来ました。
数値は1以外もありえるため、次の正規表現を使います。
/efgh/[0-9][^/]*$
/efgh/[0-9](?!.*/)
>>786
正規表現の意味まで教えてもらい、本当に助かります。
今後の役に立てていきます。
809:デフォルトの名無しさん
19/01/29 06:11:22.47 mzqJgDrY.net
$1
Windows PowerShell Cookbook
Regular Expressions Cookbook
Perl Cookbook
PHP Cookbook
Android Cookbook
Humble Book Bundle: Programming Cookbooks by O'Reilly (pay what you want and help charity)
URLリンク(www.humblebundle.com)
810:デフォルトの名無しさん
19/01/29 06:32:49.85 mzqJgDrY.net
Tools for Working with Regular Expressions
RegexBuddy
RegexPal
RegexMagic
More Online Regex Testers
RegexPlanet
regex.larsolavtorvik.com
Nregex
Rubular
myregexp.com
More Desktop Regular Expression Testers
Expresso
The Regulator
SDL Regex Fuzzer
PowerGREP
Windows Grep
RegexRenamer
811:デフォルトの名無しさん
19/01/31 16:07:48.62 Sc+6fvIO.net
誰かこの鬼雲のバグ修正PR投げてあげて
URLリンク(github.com)
812:デフォルトの名無しさん
19/01/31 16:08:40.61 Sc+6fvIO.net
URLリンク(github.com)
(?(n) (?: X | Y ) ) and (?(n) X | Y ) behavior is same.
(?: ) is left out.
(?(n) (?: X | Y ) | ) is nomal behavior.
This is a solution to a this bug problem.
ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32]
bregonig.dll Ver.4.12 with Onigmo 6.1.2
813:デフォルトの名無しさん
19/02/13 00:35:05.11 HRhgNpoV.net
鬼雲には鬼雲を知ろうとすればするほど謎のテキストエディタの
情報が集まってくるという不思議な不具合があるがこのフィックスは不可能 :-)
814:デフォルトの名無しさん
19/03/07 20:57:23.09 sEA+6w2y.net
今日元号の改正の準備で日付関連のコード書いてきたんだけど
>>697の置換が出来ると便利だったなという所があった
再帰が使えるのにこれが使えないのはバランス感覚に欠ける気がします
どうしてこうなった?
815:デフォルトの名無しさん
19/03/12 13:14:07.01 vSZ9R6NM.net
先読みの(?=huge)をつけると、後方がキャプチャーされません
そもそも前方に文字のない?=って使い方あってるでしょうか?
ちなみに言語はVB6です
816:デフォルトの名無しさん
19/03/13 00:19:48.81 heD+eXgL.net
Are you japanese?
Your japan language is strange.
Please show me sample codes.
817:デフォルトの名無しさん
19/03/13 01:39:37.63 bUFEpZHr.net
あなたの英語も変ですよ。
日本人はJapaneseとキャピタライズしてください。
日本語もjapan languageではなくJapanese languageです。
Japaneseだけで日本語という意味になりますが、前の文で日本人という意味で使っているのでlanguageを付けるのはいい判断でした。
また最後の文は、どうしても複数の例を見たいことを強調するのでない限りcodesではなくのcodeがふつうです。
不定冠詞のaも付けません。(絶対にただひとつの例だけ欲しいのでない限り)
818:デフォルトの名無しさん
19/03/13 02:16:45.79 heD+eXgL.net
自分の英語力は小学生相当なのでこんなもんです
教えてくれてありがとね
819:デフォルトの名無しさん
19/03/13 02:29:04.73 Z/ka/TFK.net
irregular expression, exactly.
820:デフォルトの名無しさん
19/03/13 08:53:04.20 heD+eXgL.net
I am good at irregular expression.
821:デフォルトの名無しさん
19/03/13 14:12:32.68 ZUOT1OTB.net
nativeのひとに「あなた英語上手ですね」って言われても誉め言葉じゃないからな
その時点で下に観られてる
822:デフォルトの名無しさん
19/03/14 17:54:44.14 k53fNhgw.net
上手ですねと言われる可能性が0なので大丈夫です
823:デフォルトの名無しさん
19/04/22 20:21:53.32 GQt1LKrG.net
sed
置換
1に挟まれたN個以下の0または-で構成された文字列を、同数の1で置き換える
10001→11111
100-1→11111
1---1→11111
10-0-0001→111111111
置換対象と同数の文字列で置換するというところをどう正規表現で表すかわからず、、、
よろしくお願いします
824:デフォルトの名無しさん
19/04/23 05:37:05.12 TbAsj7lM.net
正規表現で数を数えるのは無理
マッチさせて自力で文字を数えるコード書いて入れ替えて
ちなみに\Gが使える正規表現環境なら正規表現単独で可能
825:デフォルトの名無しさん
19/04/23 07:05:11.04 k/th3sVe.net
>>803
sed ':r; s/1[0-]\([0-]*1\)/11\1/; tr'
前方に 1 のある 10 を 11 に置換する
置換に成功したら tラベル で :ラベル の位置に戻って繰り返す
826:デフォルトの名無しさん
19/04/23 08:49:46.57 ef59e0DS.net
>>803
たぶんこれだけでは不要なところを置換しそう
:a;s/1([^0\-]*)(?:[0\-])(.*)1/1$11$21/g;t a
例題をこなすのは確認
827:デフォルトの名無しさん
19/04/23 10:21:33.54 yIB0exXp.net
>>803
100010
とか
1000101
とか
があるのか?
あった場合はどうすべきか
そこは明記しような。
謎だらけの設計書書く奴はIT向いてない。
828:デフォルトの名無しさん
19/04/23 11:46:04.64 ef59e0DS.net
>>807
>>806で> 100010→111110、> 1000101→1111111は確認
というかオレは前後にゴミがつくことは何ら影響がある題とは思わなかった
>>803の「1に挟まれたN個以下の0または-で構成された文字列を、同数の1で置き換える」にはその前後について言及ないから「触らない」と判断
後者を1000101→1111101で求めるかという点は気になるところ
最初の1~1ブロックのみなのか、行中の1~1最長一致ブロックなのか(すべての1~1ブロックを個別処理も同一)
829:デフォルトの名無しさん
19/04/23 12:07:17.02 yIB0exXp.net
>>808
()で囲うとなってれば入れ子のケースは当然問題になるんだから
入れ子を考慮する必要があるかを明確に定義してないのは駄目な仕様。
10-以外が現れた場合の扱いも明記されていない
→現れることはないとみなしている
んだから
100010は現れないと想定して書く選択肢もある。
いずれにしろ、不明瞭な仕様を書く奴は無能だし、
勝手に解釈するのも実際の仕事じゃトラブルの元。
830:デフォルトの名無しさん
19/04/23 12:23:27.03 ZY45SR7V.net
Ruby なら、
re = /1([^1]+)1/ # 1~1 で、はさまれた部分
str = "x10-0y0-1x"
# $1 は、capture 部分で、0-0y0-。この部分を置換する。
# 結果は、x1 (111y11) 1x
p str.sub( re ) { |s| "1" + $1.gsub( /[0-]/, "1" ) + "1" }
831:デフォルトの名無しさん
19/04/23 12:38:52.51 ef59e0DS.net
>>809
反論と取られたのかな
反論でも賛意でもないよ
個人的には>>803が「よい定義や仕様」とは欠片も思わない一方で「ダメダメ」とも思わない
組んでいく中で詳細を詰めていくことも現実としてある
あなたが求めているようながっちり仕様が決まっていたらむしろやることなんてほぼないかも
単に日本語を翻訳する作業になるのでむしろ苦痛かな…
そこまで詰められるなら日本語で指示しないで自分で書けよと思ってしまうかも
スレ的に読み替えればがっちり仕様を出した上で「これは正規表現で可能か?」という命題に繋がるのでスレでがっちり仕様を出すなと言う意味ではないです(念為)
仕事でもなし頭の体操的にてきとーに答えてるだけなんでこれくらいなら気にしない派
832:デフォルトの名無しさん
19/04/23 13:02:53.90 k/th3sVe.net
% printf '100010\n1000101\n' | sed ':r; s/1[0-]\([0-]*1\)/11\1\n/; tr; s/\n//g'
111110
1111101
%
833:801
19/04/23 13:49:39.47 CFFnqXFD.net
問題が曖昧であったため議論を紛糾させてしまいました。すみません。
たしかに入れ子のことや、一致する最初の文字列か、最長か、01-以外の文字の存在などを明確に記載できていませんでした。
今回の問題で聞きたかったことをシンプルに表現すると、検索文字列の文字数(1~N個)に依存した置換が可能なのか、になります。
そこについては先の人が回答してくださった通り、文字数を記憶しておくような処理は不可能であるから正規表現の範疇ではないと思いました。
これまでの意見から当初目的ではないものの多くのヒントをもらいました。ありがとうございました。
問題提示者としていたらないながら、この話はクローズさせていただきます。
834:デフォルトの名無しさん
19/04/23 13:52:46.13 yIB0exXp.net
>>811
反論だなんて受取ってないから妄想やめて。
定義が曖昧過ぎてねえ…
としか言ってないから。
01-以外でいいのか、1.*1でいいのか
などなど要件がこんな不明瞭じゃねえ
と言う話しかしてないのであしからず。
835:デフォルトの名無しさん
19/04/23 13:54:41.14 yIB0exXp.net
>>811
というか、そもそもお前宛じゃないのに
なんでお前が絡んで来てるのか謎。
勝手にお前が批判されたと妄想するなよ。
836:デフォルトの名無しさん
19/04/23 15:45:58.43 ef59e0DS.net
>>815
> というか、そもそもお前宛じゃないのに
ふあ?
>>809(ID:yIB0exXp)で>>808(ID:ef59e0DS)に安価されてるからですよ
んーなんなんかな(´д`)
837:デフォルトの名無しさん
19/04/23 17:14:05.07 yIB0exXp.net
>>816
>>807のことだが。
お前宛じゃないのに絡んで来たのお前だろ。
記憶喪失ワロタw
838:デフォルトの名無しさん
19/04/23 19:20:56.30 GneiHx9I.net
まーまー、ここはわしの顔を立てて双方おとなしくしてくれまいか。
839:デフォルトの名無しさん
19/04/23 19:41:58.96 ef59e0DS.net
>>817
あーきみがいいたいのはそっちか
例題をこなす正規表現を提示している>>805,806宛と捉えたんだよね
すでに>>805,806出てるのになにも提示してないでぐちぐち言ってるんで
まあ気に障ったようなので安価張って絡んだ形になったのは謝るよ
840:デフォルトの名無しさん
19/04/23 19:46:57.33 yIB0exXp.net
>>819
>>807は>>803宛だと明示してるし
>>805>>806なんてどこにも書かれていないのに勝手に勘違いされてもさあ。
どこをどう見たってお前が勝手に絡んで来てるのに
「絡んだ形」とかふざけた言い方すんなよ。
841:デフォルトの名無しさん
19/04/24 19:37:45.85 kN2xWSes.net
質問者の例題は数に応じた置換の簡単なサンプルが欲しくて書いたものだと思う
再帰的に無理やり導くクソコードなんて書かれても迷惑なだけでしょ
842:デフォルトの名無しさん
19/04/24 21:35:46.86 SVxlletW.net
端からは大人と子供
ご愁傷様
843:デフォルトの名無しさん
19/04/25 02:00:13.99 nkf4NYVZ.net
pythonスレで似たテーマ観たからマルチ認定
844:デフォルトの名無しさん
19/04/26 22:15:29.45 pXwlHtT3.net
sedとpythonじゃまるで違うから別件だろうな
>>819
勘違いして迷惑かけた分際で「ぐちぐち」って言葉を使うか普通..
というかこの文体、昔セガBBSにいた南瓜さんという人にそっくりだな
別人だろうけど思い出してワロタ
845:デフォルトの名無しさん
19/04/26 22:34:09.92 7hEPz6dq.net
しばらくぶりにノゾいたらワロタ
ID:yIB0exXp
URLリンク(hissi.org)
846:/read.php/tech/20190423/eUlCMGV4WHA.html 平日の朝から晩まで 内容がとっても抽象的 ネット弁慶クンってホントにいるんだな!w
847:デフォルトの名無しさん
19/04/26 23:09:55.86 DINb0EDe.net
マ板恒例、湿度高めの展開になってきましたー
848:デフォルトの名無しさん
19/04/27 13:12:59.58 W9D3URJl.net
オブジェクト指向最高さんは今回まったく落ち度が無い
迷惑かけといて素直に謝ることも出来ないくそコード製造機はもう来なくていい
849:デフォルトの名無しさん
19/04/27 21:25:24.59 CxhHumup.net
翌日以降もこんな感じですよ
URLリンク(hissi.org)
URLリンク(hissi.org)
URLリンク(hissi.org)
URLリンク(hissi.org)
こちらで引き取ってもらえませんか?
850:デフォルトの名無しさん
19/05/04 22:49:23.33 Wy3P56AZ.net
引き取ってくれてありがとう~(^。^)
851:デフォルトの名無しさん
19/05/29 23:29:43.55 NoMeOMsF.net
よろしくお願い致します。
●Regular Expressionの使用環境
Python 3.7
●検索か置換か?
検索
●説明
3つ目と4つ目のダブルクオートの間の文字列を探す
●対象データ
"文字列1":[1000:"文字列2"]
●希望する結果
文字列2
852:デフォルトの名無しさん
19/05/30 07:22:28.54 NTWA4E5y.net
>>830
Javaの正規表現テストサイト(*1)でしか試してないけど…
(?:[^"]*"){3}([^"]*)"
*1 URLリンク(regex-testdrive.com)
853:デフォルトの名無しさん
19/05/30 08:48:50.22 ZbLZAkBS.net
>>831
文字列1が空だと空振るのでいっそベタ書きするかな
それと対象の規模によっては計算量も30%少なくて済む
"[^"]*"[^"]*"([^"]*)"
くどいーと思ってまとめてみても
"(?:[^"]*"){2}([^"]*)"
若干悪化して15%offくらいに留まる
854:デフォルトの名無しさん
19/05/30 09:14:01.64 js+SNbQS.net
やっぱり可変長の戻り読み使えないなら後方参照で抜き出すしかないよね
というか正規表現以外で抜き出した方が処理軽いんじゃ
855:デフォルトの名無しさん
19/05/30 10:41:49.43 NTWA4E5y.net
>>832
> 文字列1が空だと空振るのでいっそベタ書きするかな
空振るの意味がよくわからん
効率は考えてない
856:デフォルトの名無しさん
19/05/30 16:00:31.98 0UuZnvit.net
>>834
皆様、ありがとうございます。
>>831にてご提案頂いたものに、Pythonのエスケープシーケンスを加えて採用しました。
ほか、ご提案頂いたものも大変勉強になりました。
857:デフォルトの名無しさん
19/06/12 18:51:34.75 8qMgnvIv.net
正規表現で全角記号だけ抜き出す事はできますか?
★ファイル名
みたいにして先頭に来るようにしてたんですが、全角記号はエラーおこすことがあるようです
858:デフォルトの名無しさん
19/06/12 20:16:21.08 ATCcrAWn.net
なんの処理系か書けよな
859:デフォルトの名無しさん
19/06/12 20:18:49.53 0U8oWwW8.net
使用する文字コードも
860:デフォルトの名無しさん
19/06/17 00:16:17.89 ks+4WGLz.net
助けてください。おながいします
●Regular Expressionの使用環境
Sakura Editor
(begonig.dll ver.3.06 with Onigmo 5.15.0)
●検索か置換か?
検索
●説明
日本語の文章の中に、全角英字が混じっています。
「全角英字の単語直後の任意の1文字」をマッチさせたいです。
(?<=[a-zA-Z]+).
でいけると思ったのですが、invalid pattern in look-behindでエラーになってしまいます。
どうもDLLの仕様で肯定後読みの式は固定文字長でなければならないらしく
861:、代替案がないかなーと…… ●対象データ ああいいいabcうABCえおかきくけ ●希望する結果 「う」、「え」の2か所
862:デフォルトの名無しさん
19/06/17 02:22:40.96 FPrxRapn.net
(?<=[a-zA-Z])[^a-zA-Z]
863:デフォルトの名無しさん
19/06/17 06:40:06.13 LXSfy5ij.net
>>839
> 「全角英字の単語直後の任意の1文字」
> ああいいいabcうABCえおかきくけ
bcうBCえ
> 「う」、「え」の2か所
任意とは
864:デフォルトの名無しさん
19/06/17 21:52:38.33 ks+4WGLz.net
>>840
天才!天才!解決しました。大量に感謝
発想が . に囚われていた……勉強になります
>>841
単語というのが1文字じゃなくて英字で構成されたブロックの~という意味でした。わかりにくくてスマソ
865:デフォルトの名無しさん
19/06/18 22:51:14.09 y1gFJJpS.net
ちょっとした疑問
アラビア語のような右書き言葉だと正規表現をどう書くのだろう
文字列も正規表現も右書きだから、/xyz$/ は /$zyx/ ?
(レス不要です)
866:デフォルトの名無しさん
19/06/19 05:02:00.28 tVNS+22r.net
【出資】松本卓朗 人工知能詐欺【注意】
スレリンク(rikei板)
867:デフォルトの名無しさん
19/06/19 14:27:57.27 Yoy0IPRe.net
いし正が左らか右は語本日
868:デフォルトの名無しさん
19/06/23 22:51:37.03 WHM6Ibwm.net
>>836
理論上は
|
で全部やればできる
ちょうど単なる全角(
1文字が2つの幅をもつ
ロシアの言語なども2幅
)
を捉えようとしていたので道具を紹介
URLリンク(i.imgur.com)
正規表現は (.) で1文字を習得し
バイト数が1でないものを拾うロジック
869:デフォルトの名無しさん
19/06/24 06:26:17.63 F4CLQWNj.net
URLリンク(so-zou.jp)
こういうので全角記号だけさっくり選ばせろって事なんだろうけど
全角半角はユニコードだとフォント依存なので曖昧
ascii 以外って意味で言ってるんだろうけど
恐らく"ファイル名"て事からSJisの範疇外の文字って事かなと
870:デフォルトの名無しさん
19/06/24 21:23:57.79 4+LiJo6+.net
一文字決めうち かつ あらっぽいコレクション
vim の :h digraphs には結構ある
[??????????▲△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
871:デフォルトの名無しさん
19/06/24 21:24:32.12 4+LiJo6+.net
[??????????▲△??▼▽??◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
872:デフォルトの名無しさん
19/06/24 21:24:52.95 4+LiJo6+.net
[??????????△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
873:デフォルトの名無しさん
19/06/24 21:28:31.79 4+LiJo6+.net
おわった
NG word 群が正規表現を妨げる
一文字限定なら [] の処理が早い
vim の :h digraphs
には 1300個ぐらいの 記号を含むデータリストがあるから
それから組みたてやすい とおもう
874:デフォルトの名無しさん
19/06/24 21:56:38.71 meJBThiE.net
NGワードと文字化けの区別ができない人は書き込んじゃダメ。
875:デフォルトの名無しさん
19/06/24 23:17:52.70 4+LiJo6+.net
そういえばブラウザに NG word に指定したのは自分だった
あらしが記号を使ってたことがあったので
876:デフォルトの名無しさん
19/06/25 07:18:11.77 0Do2GL77.net
荒らしが記号を使うことと書き込みを制限することに全く関連が無い
877:デフォルトの名無しさん
19/06/25 08:36:20.64 Y04/VZ6Y.net
URLリンク(i.imgur.com)
こう見えていたんだ
左がわひどいね ごめんね
878:デフォルトの名無しさん
19/07/08 00:38:09.05 m6vFYfK4.net
●Regular Expressionの使用環境
サクラ
879:エディタ(か秀丸エディタ) ●検索か置換か? 置換 ●説明 不定回数のパターンを置換したい。 ●対象データ [A=a,A=b,A=c,A=d,・・・・] ・・・・の部分はどこまで続くのかは決まってない。が、多くても20個くらい ●希望する結果 A=a,b,c,d・・・・
880:デフォルトの名無しさん
19/07/08 05:29:01.40 9IE9wmRC.net
(?<!^)A=
881:854
19/07/08 23:27:17.45 Rb/08H3f.net
>>857
ありがとうございます。
否定戻り読みってこうやって使うのですね。
もうちょっと深掘りして以下の場合どのようになるでしょう。
■対象データ
[A=a OR A=b OR A=c OR A=d・・・・]
[B=d OR B=c OR B=b OR B=a・・・・]
[C=a OR C=b OR C=c OR C=d・・・・]
■希望結果
A=a,b,c,d
B=d,c,b,a
C=a,b,c,d
ORの部分が難しくて混乱しています。。
882:デフォルトの名無しさん
19/07/10 08:43:33.27 WA2fRW/e.net
\s++OR\s++.=
,
883:デフォルトの名無しさん
19/07/10 09:18:54.80 StxWbt+s.net
ここの住民の正規表現能力は超人的だ
お節介させてくれ
もし使用環境に perl があれば、
ウルトラ難しい正規表現を理解可能な小さなパーツに分類できる
cat /dev/clipboard
[A=a OR A=b OR A=c OR A=d・・・・]
[B=d OR B=c OR B=b OR B=a・・・・]
[C=a OR C=b OR C=c OR C=d・・・・]
cat /dev/clipboard | perl -ne 'if ( m{^ \[ ( \w+ [=] ) }xcm) {print $1}; { if ( m{ = (\w+) \s }xcg ) {print "$1,"; redo} if ( m{ = (\w+) \S }xc ) {print "$1\n"} }'
A=a,b,c,d
B=d,c,b,a
C=a,b,c,d
884:デフォルトの名無しさん
19/07/10 09:35:40.67 StxWbt+s.net
そして同じような形を処理するのに
必要な正規表現が大きく変わったりしない
cat /dev/clipboard
[A=a,A=b,A=c,A=d,A=e,A=f,A=g,A=h,A=i,A=j]
cat /dev/clipboard | perl -ne 'if ( m{^ \[ ( \w+ [=] ) }xcm) {print $1}; { if ( m{ = ( \w+ [,] ) }cxg ) {print "$1"; redo} if ( m{ = (\w+) [^,] }xc ) {print "$1\n"} }'
A=a,b,c,d,e,f,g,h,i,j
885:854
19/07/11 01:01:12.77 /KpWZOtx.net
>>859
すごい。。
置換できましたありがとうございます。
が、情けない話ですがなぜこういう置換結果になるのかが理解できません。
良ければどなたか解説いただけないでしょうか
>>860
ほんと、超人的ですね。。
Perlでのご教授ありがとうございます。
1度組んでしまえば汎用的に使えそうですね。
886:デフォルトの名無しさん
19/07/11 21:00:44.92 SCYCuKB+.net
>>862
URLリンク(github.com)
887:デフォルトの名無しさん
19/07/13 20:47:25.54 57lWPs8z.net
動作についての質問です。よろしくお願いします。
●Regular Expressionの使用環境
JavaScript (chrome)
●検索か置換か?
検索
●説明
'@time;prop1:style1;prop2:style2'.match(/(^|[@;])[^@;]*/g); が
["", ";prop1:style1", ";prop2:style2"] になる理由が分かりません。私の理解では、
["", "@time",";prop1:style1", ";prop2:style2"] となって欲しいところです。
どなたか説明お願いします。
^は文字列検索位置を「動かさない」と認識しています。
(以前は「動かす」と誤認識していましたが、何かで見解を改められたことを記憶しています)
●対象データ
ID@time;style 形式の指定で、
ID、time、styleの省略は全てありで、timeとstyleの順序は自由(IDは必ず先頭)
@開始はtime指定、それ以外はstyle指定とし、デリミタは ; としています。
この形式で任意の文字列(ユーザー入力)を処理します。
なお、'@time;prop1:style1;prop2:style2'.match(/(^.|[@;])[^@;]*/g); では希望の解
["@time", ";prop1:style1", ";prop2:style2"] を得られていますが、
デバッグ中に上記に引っかかったので、分かりましたらよろしくお願いいたします。
888:デフォルトの名無しさん
19/07/13 23:13:26.72 57lWPs8z.net
正規表現の問題ではなくJavaScript固有の問題のようなので、質問を閉じ、
JavaScriptスレにて質問し直します。
興味のある方は以下をご覧ください。(これからすぐ投稿します)
スレリンク(tech板:341番)-
889:デフォルトの名無しさん
19/07/13 23:31:59.74 57lWPs8z.net
すいません自己解決しましたが一応。以下となりました。
スレリンク(tech板:341番)-342
890:デフォルトの名無しさん
19/07/14 04:59:50.53 XILHsvHP.net
この質問内容ならここで合ってます、jsスレよりもこのスレ向きです
正規表現には統一規格みたいなものは存在しないので環境によって動作が異なります
このスレの住民なら2番目のマッチが t から始まる環境も想定します
["","time", ";prop1:style1", ";prop2:style2"]
詳しい仕様を知らなくても動作を確認するコードを作っていろいろ試すと
どう動く環境なのかだいたい分かってしまうことが多いです
891:デフォルトの名無しさん
19/07/14 08:17:29.28 LdVrbIxu.net
>>867
> 正規表現には統一規格みたいなものは存在しないので環境によって動作が異なります
これは知ってますがBREの範囲だと当然間違いなく動くし、
ほぼPCREに向けて統一中、といったところなのでは?
まあやたら複雑になってバックトラッキング等の問題が発生し、
結果的に速いライブラリに収束して行っているのはいいことだと思いますが。
> このスレの住民なら2番目のマッチが t から始まる環境も想定します
> ["","time", ";prop1:style1", ";prop2:style2"]
これは一応アウトなのでは?正規表現自体はデリミタごと取り込もうとしており、それが出来ていません。
これを言うならJavaScriptもアウトですが。
個人的にはJavaScriptは面白いのですが仕様がイマイチなところが散見されるのが難点ですね。
それが初心者に無用な混乱を引き起こし、上達の妨げになっている。
今回私も数時間無駄にしましたが、これが初心者だと脱出出来なくて誤解したままになってしまう。
そして本人はそれを自覚出来ず、Web上に間違った情報を垂れ流し、馬鹿が再生産されるというループになっている。
この意味では正規表現の現在の状況も同じようなものですが、
正規表現は「実装の幅がものすごくある」と共有されているだけまだましです。
JavaScriptの連中はその間違った実装を「正しい」と思いこんでいたりするので、会話が成立しません。
といってもJavaScriptのString.matchの仕様バグを今更直すことも出来ず、未来永劫このままだと思いますが。
892:デフォルトの名無しさん
19/07/14 10:58:08.46 wR6d2dgQ.net
PCREに向けて統一中なんてどんな根拠で喋ってんだ
regex101で試してみれば分かるけどPCRE使ってるPHP以外のPython, ECMAScript, Goは全滅だぞ
893:デフォルトの名無しさん
19/07/14 12:13:01.78 LdVrbIxu.net
>>869
ゴミという意味でだろ。
逆にお前はどう思ってるんだ?
JavaScriptのString.matchについては単にパッチを実装する場所を間違えただけ。
結果、String.match と RegExp.exec での結果が異なるという、言語内での不一致を引き起こしてる。
そしてこれはもう修正されることはない。
仕様バグとして永久に残り、プログラマに無駄な時間を消費させるだけのものとなる。
結果、言語が腐っていく。
正しくは RegExp.exec 側を修正し、両方とも無限ループにならずに
["", "@time",";prop1:style1", ";prop2:style2"]
を返すべきだった。
RegExp.lastIndex だけで状態管理出来ると「間違えた」からそうなった。
本来は先頭マッチフラグ RegExp.canMatchHead みたいなのが必要で、それを実装すれば両方とも正しい結果を返せた。
それを実装せず、String.match に間違ったパッチを当てたからそうなった。
これは実装者(おそらくブレンダンアイク本人)の判断ミスだ。
正規表現はPerlが再定義したと言っていい状況だ。だからみんなPCREを見てる。
PHPはさっさと取り込んだ。これは正しい判断だ。
JavaScriptはPCREを見てる。というか本来は取り込みたいのだろうが、上記のように今更部分がありすぎる。
Pythonには歴史的経緯があるのだろう、状況は知らん。
Goは最初から既にゴミだ。確実に廃れるだろうし、俺もそれを願っている。
そもそもGoなんてPCREが覇権取ったあとに出てきたのにPCREを採用してない時点でゴミ。
それ以外にもあの言語は独自路線を行き過ぎていて、ユーザーに無駄な勉強時間を強いている。
結果、既に他言語で慣らした強者が近づかず、結果的に馬鹿の楽園になってWeb系の馬鹿共に大受けしてるだけ。
Goの正規表現については詳しくは知らんが、仮にそれが奇妙な振る舞いをしたとして、お前はGo側の怠慢だと思わないのか?
JavaScriptやPython等それなりの歴史があるのならともかく、Goの場合は確実に防げた問題でしかない。
連中はそれを「わざと」やらなかったんだぞ。俺はそんな言語は支持しないし、ゴミだと何度でも断言する。
いずれにしても、今からの初心者が学ぶべきはPCREだろ。
お前は何が言いたいんだ?
894:デフォルトの名無しさん
19/07/14 12:35:52.54 QmWR+pGh.net
ゼロ幅で永久にマッチし続けるのになんで@timeに進めると思うの?
895:デフォルトの名無しさん
19/07/14 13:05:26.62 LdVrbIxu.net
>>871
お前は実装と仕様の違いを理解出来てないタイプだな。
String.matchは「マッチ全部を配列で返す」メソッドだ。
当然、無限ループなんてしてはいけない。
(ただし無限ループしない為に空文字マッチだと一文字進めるパッチだから仕様バグになってるが)
RegExp.execは「gマッチを一つずつ実行し、ユーザーがそこで適宜処理を行う」為のメソッドだ。
当然、何もしなければ順に次のマッチをしていくのが正しく、今現在のように無限ループするようでは駄目だ。
結果、今はユーザーが本来不要なコードを毎回書く羽目になってる。
具体的に言えば、 if (match!=='') が毎回必要になる。これが無駄だ。
JavaScript界隈にはお前みたいな馬鹿が多い。
本来はどうあるべきか、或いは何故この無駄なコードが必要なのか分からず、
今の「実装」が正しいと思いこんでいるタイプだ。
動かさないと分からない、あるいは動いていればいい程度のコードしか書けないからだが。
とはいえ、今回のようなケースに遭遇するとそうなるのも分かる気はするが。
いずれにしても、これはJavaScript環境固有の問題で、ここでは割とどうでもいいと思うが。
お前が正規表現として /(^|[@;])[^@;]*/g を書いたとき、全ての環境で無限ループするべきだ!と思っているのならそれでいいが、
実際はそうではないだろ?なら無駄にいちゃもんつけるなよ。
896:デフォルトの名無しさん
19/07/14 13:21:26.40 XILHsvHP.net
>>868
"t" からマッチは誤りでした、申し訳ない..
タグの外側だけ対象に置換する
URLリンク(www.din.or.jp)
この記事の動作のことを言いたかったんですがうろ覚えのまま
適当に書いてしまいました、ごめんなさい
897:デフォルトの名無しさん
19/07/14 13:28:58.74 wR6d2dgQ.net
>>870
PCREに統一中だという主張の根拠を聞いたんだがそれへの回答はないわけだ
PCREが素晴らしい実装で最初に触っとけばいいというのは同意するが, それが最良だなんてのはあり得ないし単なる妄想だよ
898:デフォルトの名無しさん
19/07/14 14:15:14.24 LdVrbIxu.net
>>873
ああなるほど、Perlも似たようなゴミ実装になってるな。
> そこで,Perl では空文字列に マッチするような場合には,初回は空文字列がマッチするがそれ以降は マッチせずに必ず 1文字分は進むようにマッチしようとする.
これも実装ミスだ
899:な。 正しくは、このフラグを「空文字以外のマッチごとにセット」すればいいだけで、修正は1行で済むのだが、こちらも今更なのだろう。 「初回は」というのが間違いで、「空文字にマッチした直後は」が正しい。 ついでにもっと具体的に言っておくと、「初回は」というのが正しければ、 今の実装は検索起動時にフラグをセットして空文字マッチ後にリセットしているはず。 このフラグを「空文字以外のマッチ後」に毎回セットし直すように1行入れる。これで直る。 君がPERL等のOSSか何かにcontributeする気があって修正案を出してくるのなら見てあげるけど。 (俺自身ではそこまでやる気はない) まあしかし、JavaScriptだけがゴミじゃない、ってのは分かった。 というかもしかしてJavaScriptの実装ってPERL実装互換に敢えてしてる? >>874 お前は何派なんだよ? JavaScriptに関してはMDNでも前は「PCREで大体使えます」みたいな事書いてたぞ。 最近大幅リニューアルしてその記述はなくなったが。 (というより色々見にくくなってあまり確認してない) 鬼車派ならこの手の「実装ミス」をひたすら潰しておけばワンチャンあるかもしれんよ。 JavaScriptにしてもPerlにしてもこの辺のミスは確実に足枷になってる。 具体的に言うと遭遇した全プログラマが数時間ずつ無駄に検索その他をさせられる羽目になってる。 これは「新規プログラマ」からすると上達を妨げる障壁でしかない。 JavaScriptで言うと「IEデハー」な件を全部暗記してて今もそれにすがっている奴のウザさみたいなもんだ。 仕様バグがない、というのはそれなりに武器になる。
900:デフォルトの名無しさん
19/07/14 15:13:19.95 LdVrbIxu.net
>>869
今更regex101で確認してみたが、PCREだけは(これに関しては)正しく通るじゃねえかよ。
Perlの「初回は」というのはつまり g の時だけおかしくなるということであり、今回は当たらないからだが。
だからJavaScriptも仮にPerl実装互換にしようとしたとしてもしくってるな。
>>873
ちなみに
> > と < は後読みと先読みにして外に出すことができるので
の意味分かる?
おそらくはバックトラックを小さくする為(つまり高速化)だと思うのだが、
実際 regex101で試す限り余計に遅くなる。
テストサンプルはそこの下の「XMLタグを加工する」の上側半分のxmlで、こちらだと
(?:^|>)(.*?)(?:$|<) の場合は 29matches, 1277steps だが
(?:^|(?<=>))(.*?)(?:$|(?=<)) の場合は 29matches, 1875stepsで、余計に遅くなってる。
格好良くはないが別に $1$2$3 で置換しても問題ないと思うのだが。
901:デフォルトの名無しさん
19/07/14 15:29:05.53 XILHsvHP.net
>>876
> > と < は後読みと先読みにして外に出すことができるので
これは文字を消費しないための措置
マッチさせたい部分以外の部分にまでマッチしてしまうと次回の
検索開始位置が意図しないところに進んでしまったりするので先読みを
使って消費しないようにします
あとあなたが言ってることにはおおむね同意です
変な挙動は無くなるといいですね、perl6に期待したいところだけど
perl6では出来る限り最長文字数のマッチを目指す挙動になると聞いたような..
自分にとっては処理が重くなるのであまり嬉しくないですね..
902:デフォルトの名無しさん
19/07/14 16:03:14.68 LdVrbIxu.net
>>877
ああなるほど、\G使ってるからずれるのか、確かに。
BRE出身だから個人的には最初から />[^<]*</ が第一選択肢で、
筆者の発想が意味不明だったのだが、確かにそうだな。
ここら辺は正規表現だけで何とか出来る(Perl)思想と、
BREだけではどうにもならないからざっくり切り出して自前でプログラミングする(AWK)思想の違い�
903:セな。 Perl6はガン無視されてる感があるけどね。 今更Perlで組めるかよ、というのはPerlを使っている奴自身が感じていることらしいし。 (もっとも嫌われてる言語がPerl、2017はダントツの一位、 しかし同じStackOverflow実施の2018の結果はVBでperlは落ち着いたようだが) https://stackoverflow.blog/2017/10/31/disliked-programming-languages/ https://news.mynavi.jp/article/20180604-639227/ もしかしてPerl6って徐々に使われだしてる? > perl6では出来る限り最長文字数のマッチを目指す挙動になると聞いたような.. ん? 全てのプログラミング言語では最長マッチがデフォ、 というかそもそも下位の正規表現(BRE等)にはそれしかないが。(non-greedyがない) XPATH等の文書検索側の人かな?だからって別に特に問題はないが。
904:デフォルトの名無しさん
19/07/15 15:22:14.71 y88H95dP.net
Ruby で、
str = "@time;prop1:style1;prop2:style2"
re = /((^|[@;])[^@;]*)/
p results = str.scan( re )
# [["", ""], [";prop1:style1", ";"], [";prop2:style2", ";"]]
[ 0 ]がマッチした部分、[ 1 ]がキャプチャー部分
>>864
の、["", ";prop1:style1", ";prop2:style2"] と同じ結果
905:デフォルトの名無しさん
19/07/15 16:42:33.19 xqOJLOC2.net
>>879
テストしてくれたって事か?なら一応まとめておく。
/(^|[@;])[^@;]*/g に対してテスト文字列 '@time;prop1:style1;prop2:style2' で
PCRE: ["", "@time",";prop1:style1", ";prop2:style2"]
JavaScript, Python, Go, Ruby, : ["",";prop1:style1", ";prop2:style2"]
結論、PCRE以外全部ゴミ
現時点でPCREが最良だ馬鹿タレ >>874
お前が何派か知らんが、PCREが最良でないと言い張るのなら少なくとも通るライブラリを具体的に提示しろ
ただまあこれにはちょっと情状酌量の余地有りで、
おそらく ^ が「先頭文字」ではなく「位置」にマッチすると再定義したのはPerlだ。
そもそもBREには | がない。従って (^| のような「先頭の空文字」マッチなんて書けない。
だからBREだと先頭の「位置」なのか「文字」なのかを厳密に区別する必要がない。
| が導入されたのはEREからだが、EREなんて大して使われてない。
結果、BRE育ちの連中が「位置」だと厳密に認識せずにコーディングすると間違える、というわけ。
そしてJavaScript, Python, Go, Ruby は全滅だ。
JavaScriptに関してはPerlを模倣したわけでもなく、単なるミスだ。言語内不一致を生じているし。
他言語は知らん。
Rubyみたいに「実装が仕様だボケ」と言い張る糞言語ではこの手の仕様バグを永久に修正出来ない。
よって新人は毛嫌いして離れていく。当たり前の話だ。
JavaScriptはおそらくバグだと認識されているが、今更直せない。
Perl6はこの点、仕様と実装を分離したから、バージョンアップと共に確実に修正する。
従って最良は現時点でもPCREだし、今後ともPCREだ馬鹿タレ >>874
906:デフォルトの名無しさん
19/07/15 23:23:32.64 3MPTmFRg.net
BREの正規表現と今の正規表現の使い方の違いの話は面白いなぁ
しかしこの人こんなにすごいスキルとモチベがあるなら質問なんかせずに
自力でなんとか出来たのではw
質問してくれたおかげで面白い話をいろいろ聞けたからこちらは嬉しいけどネ
おかしな挙動と言えばperl5とOnigmoでは\Gの挙動に違いが
あってどちらかが違和感のある動作をしたはず
\Gの概念自体が微妙に違ったはずだけどメモるの忘れた
興味のある人はぐぐってね
907:デフォルトの名無しさん
19/07/16 15:24:59.03 wQsYVdH6.net
ネット弁慶がイキりたかっただけでしょ
908:デフォルトの名無しさん
19/07/16 16:08:47.84 cpfSTA9t.net
>JavaScript, Python, Go, Ruby, : ["",";prop1:style1", ";prop2:style2"]
深くて理解できないことが多いが、これはやばい気がする
909:デフォルトの名無しさん
19/07/16 17:23:30.54
910:hAAouWtx.net
911:デフォルトの名無しさん
19/07/16 18:30:33.69 AvaVqNzm.net
一所懸命挑発的に書いてるのに全然乗ってもらえなくてかわいそう
912:デフォルトの名無しさん
19/07/16 19:27:45.24 hAAouWtx.net
言ってることに説得力がありすぎて聞き入ってしまってたよ
どんどん言いたいことを言って欲しい
昔のdanさんを思い出すなぁ
913:デフォルトの名無しさん
19/07/16 20:41:55.62 bFMew56o.net
入力フォーマットが正しいという前提で /@?[^@;]+/ の方が好み
そもそも正規表現使うより ; でsplitした方が良くね?とおm
914:デフォルトの名無しさん
19/07/16 21:03:17.33 hMJFhr7R.net
>>883
深くはない、単にバグってるだけ。
そしてそれはやばいどころではなく、全く話にならないレベルの物だ。使い物にならない。
例えば、図書館の蔵書をユーザーにも検索出来るようにしたとして、正規表現検索も選べるとしよう。
この場合、検索結果に現れないケースが発生することになり、使い物にならない。
プログラミング言語内の正規表現エンジンは「今までのプログラムが動かなくなる」危険があるからそうそう交換出来ないが、
図書館DBの検索フロントエンド内のエンジンなんて即交換可能なんだから、問題があればすぐ乗り換えられる。
PCREが気に入らないのならこんなところで無駄吠えするのではなく、
PCREがバグっているケース(例のタグ外側マッチとか)でもばっちり動く検索エンジンを提供して、乗り換えを待てばいいだけ。
現状、PCRE以外全部バグっているのだから救いようがないが。
JavaScriptの場合はatomエディターなる物があって、htmlやプログラムソースコードを編集出来るが、
JavaScriptの場合はreplaceもバグっているので、命中すれば、全置換しても全置換出来てないケースが発生する。
リファクタ等で変数名を変えるとき、手でやるとバグるので、当然エディタ機能で全置換させるわけだが、この場合にもバグる訳だ。
そしてユーザーはこのときに置換漏れが発生するとは全く思わないので、かなり手間取ることになる。
(atomでは対策されていると信じたい)
JavaScriptの場合はこのバグも「仕様」としてしまっているので、
逆に言えば仕様通りならバグに命中したときの挙動も確定してる。だから対策は出来るが、
Rubyみたいに「実装が仕様だ」と言い張る糞言語だとどういう挙動か確認してみなければ分からず、対策が出来ない。
ここらへんもRubyの思想は数周遅れている。
いずれにしてもこんな基本的なところのバグはあっても迷惑でしかなく、さっさと直せ、でしかない。
「速い」以前に「ヒットしない」エンジンなんて使い物にならないだろ。
エンジン競争しているつもりの馬鹿共も、方向性を完全に間違ってる。
「間違いなく動作する」エンジンを提供すれば、文書検索側の人間はサクッと乗り換えてくれるだろうさ。
速い遅いはその後の話だ。
915:デフォルトの名無しさん
19/07/16 21:18:41.35 hMJFhr7R.net
>>881
BREの場合はやりきる前提ではないので、例えば例のタグ外側マッチだと、
元の文字列に > と < を足してしまって置換し、出力時に削る、みたいなことをする。
具体的には以下。
('>' + str + '<').replace(/>[^<]*</,'>bar<').slice(1,-1)
だからBREしか使えないAWKでも意外と何とかなったりする。
ただしこれはプログラミング出来る前提であって、
Webページに検索窓だけ提供されているような状態ではどうにもならないが。
>>887
それは正しい。実際俺もそれに近いことをしている。
デリミタが最初に出現もあり、最後に付加もあり、つまり
';prop:style1' や
'prop:style1;prop:style2;' もありなので、
結局 /(^|[@;])[^@;]*/g だと後のコードが綺麗に書けなかった。 /(^.|[@;])[^@;]*/g でも同じ。
意味的には @ もデリミタ扱いしているだけなので、実もフタもないが、@を ;@にしてsplitした。
具体的には以下。
str.replace(/@/g,';@').split(';').filter(v=>v)
916:デフォルトの名無しさん
19/07/16 22:42:20.32 P37s1FHo.net
一度言った内容は繰り返さなくていいです
917:デフォルトの名無しさん
19/07/17 08:28:41.50 2/Bgill9.net
>>875訂正
俺は俺のケースだけ考えていたが、これだと871内URLの筆者のケースと合致しない。
そこで一応、両方とも合致する実装を考えてみた。
(といってもバグってる実装について推測すること自体はあまり意味がないが)
Perlはおそらく、^のフラグではなくて、空文字マッチ後のそのマッチ区間の*を+にしてる。
(というより筆者もそう言っているのだが俺が早とちりしてしまった)
871のケースだと、正規表現 (?:^|>)(.*?)(?:$|<) に対して、
1回目:(?:^|>)(.*?)(?:$|<)
2回目:(?:^|>)(.+?)(?:$|<)
というわけだ。結果、2回目は「先頭、<含んだ1文字、次の<まで、となり、
その筆者の説明通り先頭タグを含んで次タグ或いは文末まで伸びることになる。
俺のケースでは、正規表現 (^|[@;])[^@;]* に対して、
1回目:(^|[@;])[^@;]*
2回目:(^|[@;])[^@;]+
だから '@time;prop1:style1;prop2:style2' に対して @time のマッチも正しく取れることになる。
こういった場合、実装者は安全側に倒したくなる物だが、
現実は安全側に倒しすぎて余分なケースを含んでしまい、結果、バグっているというわけだ。
JavaScriptは最高に安全な実装、「空文字マッチは1文字進める」とした。(おそらくRubyその他もそう)
これだと絶対に無限ループはしないが、俺のケースでバグる。
Perlの実装だと俺のケースは通るが、871内URLの筆者のケースでバグる。
その他バグケースも出してくれれば俺の推測で合っているかどうかは答える。
918:デフォルトの名無しさん
19/07/17 08:28:59.00 2/Bgill9.net
正しい実装は、「経路全体」(つまりツリーのリーフ)に対してフラグを持たないといけない。
Perlは「区間」(=経路の一部)に対してフラグをつけてしまったところが間違いだ。
871のケース、単純化する為に (A0|A1)B(C0|C1)として、
1回目:A0BC1 で空文字マッチ
そして空文字マッチの場合はこれを記録し、これと同一の場合は次回以降はスキップする。
結果、2回目:最初に A0BC1 がマッチするがこれは捨てられ、次に A1BC0またはA1BC1となる。
そして非空文字マッチとなったので、この記録を全破棄して、同様にループを繰り返せばいい。
実装の修正は、探索関数そのものにだいぶ手を入れないといけないのでそれなりに大変だ。
まずは全部の最終段に「最終チェック」を入れて上記リストと照合、記載有ればマッチ失敗として探索継続、としなければならないが、
おそらくこれが1ヶ所では済まない。
ただしこれはリターンパスを辿ればいいので何らかのツールが有ればほぼ自動でいけるかもしれない。
次に上記リストを作成する為に全経路を出力させなければならない。
デバッグ用にこれが既にあればラッキーだが、なければ自前で作らなければいけない。
といっても内容はツリーのノードを辿るだけなので、ツリーのフォーマットが分かればすぐだが、
ゴリゴリに高速化とかしていると割と意味不明なコードになっていることが多いので、
その状態で確認するのは結構辛いとは思う。
リストの管理は、空文字マッチなら追記、非空文字マッチならクリア、なので、これはやるだけだ。
リストの管理も探索関数にやらせて、探索関数は
今:マッチ場所とマッチ長さを返す
修正後:マッチ場所とマッチ長さを含んだ『配列』を返す、とし、
「空文字マッチの場合は自動で継続、非空文字マッチまたは終了まで探索、まとめて配列で結果を返す」とするのがいいだろう。
919:デフォルトの名無しさん
19/07/17 08:29:16.56 2/Bgill9.net
なおPerlの実装だと『上位関数のみ』で対策できるため、
「取り敢えず1時間で直せ」と言われたらこうなるのも分からなくはない。
しかしいまだにそのままだというのは怠慢でしかないが。
JavaScript等も同様、『上位関数のみ』で対策出来るところで留まっている点からも、これは言える。
しかし現時点で世界中のプログラマがどれだけ無駄な時間を消費することになっているのかを考えれば、
こんなのは手間であろうがさっさと直せ、でしかないが。
いずれにしても、俺が修正してやる、修正案はこれだ!と具体的に出してくるのならレビューはする。
我こそは!という奴は頑張れ。
920:デフォルトの名無しさん
19/07/17 09:46:24.93 u050lnGw.net
話を単純化すると、
1. ある文字、例えば@ から、次の@ の直前の文字まで
2. 先頭が、@ でなければ、先頭から、@ の直前の文字まで。
つまり、先頭が、@ でなければ、先頭文字を、@ とみなして処理する
つまり、ルール1・2は、同時に適用させず、先にルール1を適用し、
ルール1に適用しないものだけを、ルール2に使う
(^|[@;])[^@;]*
だから、この正規表現がおかしい。
定義があいまいになる、解釈を含んでいる!
OR の部分が、並列ではない。
ルール1を優先すべき!
921:892
19/07/17 09:51:38.77 u050lnGw.net
(^|[@;])[^@;]*
OR を使うと、両方に該当する場合に、どちらの処理がされるのか、あいまい!
つまり、先頭文字が@; の場合に、両方に該当するので、処理があいまい!
A|B
A, B 両方に該当する場合に、A,B どちらの処理がされるのか、あいまい!
922:デフォルトの名無しさん
19/07/17 09:53:34.46 RL7WDafS.net
左側優先とかないのかこれ?
923:877
19/07/17 10:06:18.04 u050lnGw.net
>>891
Ruby で、
str = "@time;prop1:style1;prop2:style2"
re = /((^|[@;])[^@;]*)/
p results = str.scan( re )
# [["", ""], [";prop1:style1", ";"], [";prop2:style2", ";"]]
[ 0 ]がマッチした部分、[ 1 ]がキャプチャー部分
>>864
の、["", ";prop1:style1", ";prop2:style2"] と同じ結果
# * を、+ に変えた。
re_2 = /((^|[@;])[^@;]+)/
p results_2 = str.scan( re_2 )
# [["@time", "@"], [";prop1:style1", ";"], [";prop2:style2", ";"]]