Regular Expression(正規表現) Part14at TECH
Regular Expression(正規表現) Part14 - 暇つぶし2ch694:デフォルトの名無しさん
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", ";"]]

924:デフォルトの名無しさん
19/07/17 13:38:56.68 FD/sfaX1.net
小飼って糖尿病で死んだんだっけ

925:デフォルトの名無しさん
19/07/17 14:01:11.32 fOq5lc1d.net
質問させてください。
PCRE や bregonig で大文字・小文字の区別なしで\x{017F}がsやSにマッチしてしまうのは仕様ですか?

926:デフォルトの名無しさん
19/07/17 15:07:35.98 Jmalh7Yl.net
>>889
>('>' + str + '<').replace(/>[^<]*</,'>bar<').slice(1,-1)
おぉ、perlの正規表現なら正規表現だけで大抵のことは出来るから
自分には前処理をするという発想がなかった、目からうろこでした
今回のケースもこの方法でデータの前後に ; を付ければ簡単になりましたね
>>899
\w が あ にマッチするくらいなので仕様なのでは
オプションでマッチしなくしたり出来るのでオプションのヘルプを見ましょう

927:デフォルトの名無しさん
19/07/17 20:30:56.60 2/Bgill9.net
>>896
ないね。
聞いたこと無いし、JavaScriptで試した限り ([@;]|^)[^@;]* でも結果は同じだった。
ただ、確かに普通に考えたら左優先でいいし、上記入れ替えで @time をキャプチャ出来るようになるべきではある。
言われてみれば優先順位が決まってないことに驚きだ。

928:デフォルトの名無しさん
19/07/17 20:37:09.24 RL7WDafS.net
>>901
ちょっと知識が深まったよ サンクス

929:デフォルトの名無しさん
19/07/17 20:40:11.08 2/Bgill9.net
>>897
お前は毎回Rubyの話をどのスレにも持ち込んでいる荒らしだろ。
何か言いたいことがあるのなら必ず結論を書け。
何が言いたいのか分からないのでウザイ。だから荒らしなんだよ。

+ に変えて空文字マッチをなくし、結果、希望の文字列を得る、という運用で回避するのはありだ。
ただ、その場合は、プログラマにそう分かるように、
「Rubyの正規表現エンジンは空文字マッチ周りにバグがあるので、注意してください。
空文字マッチがある正規表現を与えた場合、予期せぬ動作になることがあります。」とアナウンスしないといけない。
事実上空文字マッチが使えないが、事実なんだからそうするしかないだろ。
Rubyはこういう事を全くしないからゴミなんだよ。Rubyは滅ぶべくして滅んで行ってるだけ。
JavaScriptは少なくとも仕様に明記はしてる。
ただそれだと弱いからMDNにも書け、というの�


930:ェ俺の主張であり、JavaScriptスレに勝手に依頼しておいた。 以前RegExp.testの件で同様に依頼したら追記されたから、そうなるのを願っている。 そういう、「落とし穴」は共同して塞いでいかないと駄目なんだよ。 完璧な言語なんてない。だから多少バグがあるのは仕方ないとして、 それを未来永劫新規プログラマに押しつけて「キャハハー、お前も落ちたか!」なんてやっているようでは駄目なんだ。 Rubyはプログラマに対してリスペクトが全くない。だから廃れるし、俺もそうなることを願っている。 お前はRubyを吹聴しさえすれば布教出来ると勘違いしているようだが、そんなことはない。 当たり前だが新人にとってはこんなバグにつき合わされること自体大迷惑でしかないんだよ。 今回のでもPCREが一番ましだし、Rubyなんて選ばれる理由がないだろ。 ゴミだと分かっているものを広めるのは、単なる詐欺師でしかないぞ。 お前はお前の行為によってRubyへの反感を得ているだけなことを自覚した方がいい。 あちこちのスレでお前は相当ウザがられてる。 そういうのではなくて、バグを修正するとか、仕様書に明記するとか、 何でそういう建設的な方向に努力出来ないんだ? こういう地道な積み重ねを全くやってないからRubyの現状はあるわけでさ。



931:デフォルトの名無しさん
19/07/18 16:11:19.79 Y8yxmCyC.net
今の複雑化した正規表現エンジンってエンジンを作った人ですらどう動くのか
予測が難しいところがあるのでは
バグと言えばバグだけど総合的に考えてみてこの動作が最適だからこのままにしよう
という部分もたくさんあると思う
だから怠慢という言葉はちょっと違う気がするなぁ
あとrubyの正規表現エンジンは空文字マッチが~の件は
つまりonigmoのことを言ってるんだけどonigmo自体は空文字マッチに
対応してると記憶してるからrubyモードの仕様なんじゃないかな

932:デフォルトの名無しさん
19/07/18 20:03:10.71 PnG1z3PK.net
>>904
Ruby周りにはお前みたいなクズしかいないから駄目なんだよ。
プログラミング出来ないのなら黙ってろ。
今のお前が為すべきは、お前が持っているonigmo環境で該当パターンを試し、結果を共有することだ。
Rubyの評判を気にすることではない。
Ruby+onigmoの組み合わせでばっちり動くのなら、
「他環境はゴミです!みなさんの悩みはRubyで解決出来ます!この機会に乗り換えてください!」と言えばいいだけだ。
動くんじゃないかな、みたいなお前の希望的観測なんて何の役にも立たない。
或いは、onigmo単独では動くがRubyのバグ互換モードでは動かない、というのが事実なら、
「Rubyは次のメジャーアップデートでここが対策されます!みなさんご期待ください!」
と言えばいいだけだ。
実際、正規表現の方言/バグに参っている連中はいるんだから、それで乗り換えてくれるだろうさ。
実際、Rubyの奴らはこういう事を全くしない。
そしてRubyの評判だけを気にしているからRubyはゴミのままなんだよ。

871の件、Perl5.6だがPCREもか?と思って試したが、PCREもだ。
そしてPCREには
> using the same syntax and semantics as Perl 5.
と書いてある。つまりこれが本当ならPerl5のバグも含めて挙動は同一、ということになる。
しかしバグまで含めて同一とするにはPerlがこれを仕様化していないとほぼあり得ない。
そこでPerlを確認してみたが、どうやら以下がそれらしい。
> Repeated Patterns Matching a Zero-length Substring
> URLリンク(perldoc.perl.org)
グダグダ説明はしてあるがPerlは読めんから詳細まで俺の読み通りかは分からんが。
いずれにしても、JavaScriptとPerlは仕様化してる。
Rubyが仕様化しておらず、これが大問題だと認識出来ないのは、Ruby界隈にはまともなプログラマがいないからだよ。

933:デフォルトの名無しさん
19/07/18 20:22:20.04 Y8yxmCyC.net
BREという超シンプルな正規表現エンジンが持っていた明解な動作の分かりやすさを
現代の超複雑な正規表現エンジンに求めることには無理がある
ちょっと挙動が変なところがあるけどこのほうが便利だよねってのが現代の考え方
なんじゃないかな、それに適応してるのが現代のプログラマということだろう
ゼロ幅マッチで1歩進む件もそういう挙動にするメリットがあるから
そうしてるんだろう、どんなメリットなのかは分からないが
コスト的な問題やセキュリティ的な問題かも知れない
時代遅れのプログラマが何を言おうが正直興味ないわ
現代の正規表現で見れば初心者だし
初心者が内部動作の仮説を立てたところで当たるわけがない
しかもたった数例のコードの動作を見ただけでだ、あほらしい

934:デフォルトの名無しさん
19/07/18 20:44:40.06 PnG1z3PK.net
>>904
お前みたいなゴミに回答する意味はないが、一応つけておいてやる。
> 今の複雑化した正規表現エンジンってエンジンを作った人ですらどう動くのか
> 予測が難しいところがあるのでは
そんなわけあるか馬鹿タレ。
今現在もスクリプタはプログラマからすると一段下に見られてて、
「スクリプタをプログラマと呼ぶな」という奴も一定数居るだろ。
その理由がこれだよ。
ガチのプログラマは数年前に他人が記述したコードでも必要あれば修正するしかない。
だからこの為に多大なる手間をかけてコードを整備してる。
スクリプタがやってる、今書いて今動いたら捨てておk、なんて甘い世界ではない。
まともなコードなら未来永劫整備可能だし、また、それを目指しているのがプログラマだ。
実際、Linuxなんて30年越しで整備され続けてるだろ。
数年前にお前が書いたコードすら読めないのは、お前の問題であって、それを全体のように言うな。
だからスクリプタは馬鹿にされるし、嫌われるんだよ。
正規表現エンジンなんてプログラミング全体からするとかなり簡単な部類だ。
動けばいいだけのエンジンなら再帰しまくりで1000行程度だろう。
最悪全交換でいい規模だから、そこまでガチで整備されている事は期待出来ないが、
それにしてもこの程度の規模のプログラムを読めない、ってことはあり得ない。
高速化はプログラムに対して「複雑度」を増すものではない。
具体的に言うと、静的コールグラフを複雑化することはなく、
単に遅い関数を速い関数に入れ替える、というのが基本になる。
だから、正規表現エンジンを読めない、というのなら、書いた奴か読む奴が馬鹿なだけであって、
ちゃんとした奴が書いたエンジンをちゃんとした奴が読めば確実に読める。

935:デフォルトの名無しさん
19/07/18 20:46:26.35 PnG1z3PK.net
> バグと言えばバグだけど
単なるバグだ馬鹿タレ。
> 総合的に考えてみてこの動作が最適だからこのままにしようという部分もたくさんあると思う
非互換になるのでどこでアップデートして修正するかは言語側の選択となる。
だからその前段階、つまり今どこにバグがあってどれくらい問題なのか把握し、
それを広報して共有し、どのタイミングで修正するかを話し合わないといけない。
Rubyはこれが全く出来てない。だからゴミのままなんだよ。
> だから怠慢という言葉はちょっと違う気がするなぁ
バグだと認識した上で、それを仕様として広報するのが最低の義務。
JavaScriptとPerlはそれをやっている。
Rubyの現状はバグに気づいてないか、敢えて黙っているかで、どちらにしても糞でしかない。
> つまりonigmoのことを言ってるんだけどonigmo自体は空文字マッチに
> 対応してると記憶してるから
お前がどんだけ馬鹿なのか分からないが、「バグ」ってのは意図してない動作のことを言うんだぞ。
つまり、対応してるつもりが対応できてないから「バグ」なんだよ。
> rubyモードの仕様なんじゃないかな
そう言うのはちゃんと調べてから言え。希望的観測ではミスリードを大量発生させる。
そしてこれをやりまくっているのがJavaScript界隈で、結果、JavaScripterは馬鹿が再生産されまくってる。
そういうのは止めろ。お互いに得る物がない。

>>906
まあ書いた後に読んだから投稿はしておいた。
話すつもりがないのならさようならでいい。
お前は、自身の問題を認識出来てないタイプだ。まあこのタイプもよくいるが。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch