- 1 名前:デフォルトの名無しさん [2017/03/15(水) 02:04:35.47 ID:e01p03UP.net]
- Regular Expressionスレです。
質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。 前スレ Regular Expression(正規表現) Part13 echo.2ch.net/test/read.cgi/tech/1415149975/ 次スレは>>980宜しく 天ぷら等2以降
- 684 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2018/10/22(月) 07:15:14.86 ID:nc1bV2B+.net]
- 全角スペースを\u3000と書いた場合とか
bregonigだとperl互換じゃない書き方は受け入れてもらえないわけで
- 685 名前:662 mailto:sage [2018/10/22(月) 14:03:03.71 ID:oA8lJo/T.net]
- 自分は文字コードの知識が無いので迂闊なことは言えないから
ちょっと調べたことだけ書いておくね ここで k-takata.o.oo7.jp/mysoft/bregonig.html \u0149 を検索してみるとbregonigでも使えてそうなことが書かれてたよ
- 686 名前:662 mailto:sage [2018/10/22(月) 21:23:16.87 ID:oA8lJo/T.net]
- サクラエディタでいろいろ実験してたら \s が全角スペースにマッチした
サクラエディタ向けの正規表現を作るときには気を付けないといけないな
- 687 名前:デフォルトの名無しさん mailto:sage [2018/10/22(月) 23:33:25.25 ID:aIOUU5bU.net]
- bregonigは鬼雲の機能限定版(perl互換の正規表現だけが動く)って話をどこかで読んだ記憶があったんだよね
どうせやるなら本家onigmoのRuby版正規表現も全部動くようにすればいいのに、って思っただけなんだ ちょっと難癖に近いなとは自分でも思ってる \sもそうだけど\dに全角数字がマッチしちゃって痛い目に合うのもまれによくあること サクラに限らないんじゃないかね
- 688 名前:デフォルトの名無しさん mailto:sage [2018/10/23(火) 00:10:38.63 ID: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なので https://egg.5ch.net/test/read.cgi/software/1536058236/515 に対して、\d{6}がマッチするのはXenoのみである
- 689 名前:662 mailto:sage [2018/10/23(火) 00:11:35.27 ID:FESm7ID8.net]
- なるほど、dll からは ONIG_SYNTAX_PERL しか使えないから
ruby を使い慣れてる人にとっては歯がゆいと.. > \dに全角数字がマッチしちゃって ですね〜、(?a) で防げるようなので覚えておきます
- 690 名前:デフォルトの名無しさん mailto:sage [2018/10/23(火) 00:18:39.55 ID:FESm7ID8.net]
- レスが被ってしまった..
>>671 ありがとうございます サクラエディタはUnicode仕様で動いているんですね う〜ん、文字コードの話は難しいなぁ
- 691 名前:デフォルトの名無しさん mailto:sage [2018/10/23(火) 00:24:56.92 ID:W9szHIq5.net]
- なおUnicodeの空白でも、上記のCc(0009〜0085)、LS,PS,Zs(Space Separator)
以外のCf(200b,200c,200d,FEFF)だとどうかなと試したが案の定マッチしなかった さすがは仕様どおりだ
- 692 名前:デフォルトの名無しさん mailto:sage [2018/10/23(火) 01:02:05.21 ID:FESm7ID8.net]
- > 200b,200c,200d,FEFF
サクラエディタにIMEパッドから打ち込んで試してみたら同じくマッチせず # 主要部 (?&sp) # 定義部 (|(?!) (?<sp> (?u) [\x{200b}\x{200c}\x{200d}\x{FEFF}\s] ) ) 自分がこれ使うことは永遠になさそうだけどとりあえず..
- 693 名前:デフォルトの名無しさん mailto:sage [2018/10/23(火) 03:03:21.50 ID:FESm7ID8.net]
- >>3
ジオから移転 正規表現パズル https://oraclesqlpuzzle.ninja-web.net/regex/index.html
- 694 名前:デフォルトの名無しさん [2018/10/25(木) 14:38:08.86 ID:4OmhnPU0.net]
- あるファイルパスがありディレクトリのN階層目までのみを抽出したいのですが、正規表現について教えてください
例えばこんな入力のリストがある場合 aaa aaa/bbb/ccc aaa/bbb/ccc/ddd/eee/fff で各リストに対して2階層目までを取得したい場合 aaa aaa/bbb aaa/bbb となるのが期待値です。 ((?:¥w+¥/?){1,2})とかしてみたんですが上手くいきませんでした、お手数ですがよろしくお願いします
- 695 名前:デフォルトの名無しさん mailto:sage [2018/10/25(木) 15:23:45.93 ID:RdSksp9Y.net]
- >>677
正規表現はプログラム言語や正規表現オブジェクトのオプションによって 動作がけっこう変化するので質問するときはそういうの書いてね [^/]+(?:/[^/]+)? ただしこれは正しいパスが与えられることを前提としているので注意
- 696 名前:デフォルトの名無しさん mailto:sage [2018/10/25(木) 15:29:23.12 ID:ZE3NVml1.net]
- / の数が、0〜2
- 697 名前:デフォルトの名無しさん [2018/10/25(木) 15:39:26.06 ID:5Cy/pQlU.net]
- ./ で始まってたらどう数えるん
/ で始まってたら?
- 698 名前:デフォルトの名無しさん [2018/10/25(木) 17:47:09.80 ID:4OmhnPU0.net]
- >>678
ありがとうございます、perlが希望でしたので次回から書くようにします 例は2階層で固定のようですが、ちなみにn階層目とか可変で書くような場合は下記のような感じで良いでしょうか? [^/]+(?:/[^/]+){0,n-1}
- 699 名前:デフォルトの名無しさん mailto:sage [2018/10/25(木) 18:40:41.61 ID:RdSksp9Y.net]
- ああ、N階層までのマッチという質問だったのか、ごめんね
それで合ってるよb
- 700 名前:デフォルトの名無しさん mailto:sage [2018/10/26(金) 10:18:13.83 ID:MwloQati.net]
- 暇つぶしに鬼雲の再帰処理に欠陥がないか探してみたけど見つからなかった
例、\1 を空文字にマッチさせて再帰の無限ループを狙う ()(?<name>a|\1\g<name>c) 例2、<x> を複数使ってマッチするのが空文字ではないように見せかける (?<x>)(?<x>text)(?<name>a|\g<x>\g<name>c)
- 701 名前:デフォルトの名無しさん mailto:sage [2018/10/26(金) 23:39:01.03 ID: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 名前:デフォルトの名無しさん mailto:sage [2018/10/26(金) 23:58:52.37 ID:MwloQati.net]
- perldoc.jp/docs/perl/5.16.1/perlreref.pod#ESCAPE32SEQUENCES
> \F \E まで畳み込み文字にします bregonig.dll は Perl 5.14 ほぼ準拠だからまだ未対応らしい
- 703 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 00:53:19.71 ID:ZnGbnC1U.net]
- jane2ch.net/community/kako/1299/12999/1299979723.html
レス241からの高速化の話題を検証してみた レス243 >1は例えば (?:http://)〜 と、始めの数バイトをグループ化してやると速くなる 検証結果: 速度変わらず レス245 > : の部分で一旦切れるようにすれば条件は平等になると思う > (?:http:|ttp:|tp:) が速いわけではないと分かる 検証結果: 1. 10.345 ms 2. 10.560 ms 3. 05.130 ms 結論: (?:http:|ttp:|tp:) は速かった
- 704 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 01:36:44.44 ID: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 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 14:53:16.06 ID:ZnGbnC1U.net]
- これらの記述法には1つ弱点があり
(?<name>ほにゃらら){0} より前に \k<name> が出現すると文法エラーになる 例、 (?<tag>foo \k<name> bar){0} (?<name>ほにゃらら){0} \g<tag> このため定義する順序が限定されてしまう、これは解消されるべき問題である
- 706 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 15:07:39.92 ID:ZnGbnC1U.net]
- ↑これの例はおかしいな、このレスは取り消し
- 707 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 15:36:10.31 ID:ZnGbnC1U.net]
- 昨日、詳説 正規表現の本を枕の下に置いて寝た
寝ている間に正規表現のパワーがもらえると思ったからだ すると.. 夢に正規表現の神様が現れた 神様 「 \1 はな、 ${1} と書いてもマッチするんじゃよ」 朝、目覚めると飛び起きてperlを動かしてみた if ( "aa" =~ /(a)${1}/ ) { print "match!!\n"; } else { print "no match..\n"; } 実行結果を見た私は奇跡を見ていた
- 708 名前:デフォルトの名無しさん mailto:sage [2018/10/28(日) 20:54:51.63 ID: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 名前:デフォルトの名無しさん mailto:sage [2018/10/29(月) 00:52:40.24 ID: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 名前:デフォルトの名無しさん mailto:sage [2018/10/29(月) 01:00:01.03 ID:BYis7ms7.net]
- perl がマッチするのはもしかしたら内部的にunicodeになってるとかかな
自分はプログラマじゃないんでさっぱり
- 711 名前:デフォルトの名無しさん mailto:sage [2018/10/29(月) 01:09:53.75 ID:BYis7ms7.net]
- どうやら当たりらしい、unicodeに変換してからマッチしてた
if ( "あ" =~ /\x{3042}/ ) # true if ( "あ" =~ /\x{82A0}/ ) # false
- 712 名前:デフォルトの名無しさん mailto:sage [2018/10/29(月) 19:52:31.20 ID:BYis7ms7.net]
- ・再帰の穴を狙う2
(str) (?<name> (?(1)yes|no) \g<name> |inner) ↓これに書き換えると (?(1)yes) → 文法エラー (?(1)|no) → 文法エラー ガードが鉄壁ですごい、ほんと良く出来てるな〜
- 713 名前:デフォルトの名無しさん mailto:sage [2018/10/31(水) 16:56:37.48 ID: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 名前:デフォルトの名無しさん mailto:sage [2018/10/31(水) 17:14:05.35 ID:ZWlmxwfj.net]
- やっぱりこれ欲しいなぁ
検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) ) 置換:\k'color' 対象テキスト: blue 置換結果:青 これの有無で便利度が数段変わるんだよね これの代わりに複数回の置換を行うと \G を使うときに困る 同じものを複数回検索するので速度低下に繋がる
- 715 名前:デフォルトの名無しさん mailto:sage [2018/10/31(水) 19:55:08.08 ID:ZWlmxwfj.net]
- ・ (?'name=~' )
変数name の中身をマッチテストする先読みの親戚のようなもの (?'name' <div> .*? </div> ) (?: (?'name=~' \A .* abc .* \z) pattern1 # タグの間に abc があるとき | (?'name=~' \A .* def .* \z) pattern2 # タグの間に def があるとき | pattern3 # それ以外のとき ) これもあると便利だけど (?(name) | ) で代用出来るから必要度は低い
- 716 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 00:56:07.61 ID:+M+OiFJp.net]
- 動画を正規表現に変換
https://www.youtube.com/watch?v=em8UvwCTWwk 検索: ^(.*)タマ(.*)タマ(.*)
- 717 名前:$
置換: $1$2$3 [] - [ここ壊れてます]
- 718 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 01:35:03.88 ID:zrOHiVOt.net]
- ニュタマーハタマーフ
- 719 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 17:25:34.93 ID:+M+OiFJp.net]
- (*^-^*)
- 720 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 17:34:43.67 ID:+M+OiFJp.net]
- >>696 のバグがrubyでも起こることを確認
ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32] 原因は bregonig.dll でなく Onigumo にあるようだ これは気付きやすい部類のバグだと思うんだけど 今までバグ報告が無かったようなのが不思議 takata神はここ見てるのかな
- 721 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 17:41:25.59 ID:+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 名前:デフォルトの名無しさん mailto:sage [2018/11/01(木) 23:04:15.23 ID:dBKH7CcG.net]
- >>693
perlの場合、Encode::decode()でperl内部処理用文字コード(utf8の亜種っぽい何か)に 正しく復号しないと正規表現クラスを正しく使えない。
- 723 名前:デフォルトの名無しさん mailto:sage [2018/11/02(金) 01:26:49.16 ID:XP4jtOby.net]
- >>704
解説ありがとうございます ということは今まで自分はperl内部の独自の文字コードにエンコードされた文字列に 対して正規表現を使っていたわけですね、恥ずかしながら初めて知りました
- 724 名前:デフォルトの名無しさん [2018/11/05(月) 20:41:07.84 ID:SJelCvn/.net]
- >>685
畳み込み文字ってなんですか?
- 725 名前:デフォルトの名無しさん mailto:sage [2018/11/05(月) 23:47:01.14 ID:xCFT0arz.net]
- (?:
( V ) > (0 -1) | ( . ) > (1 0) ) 俺も分からん
- 726 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 18:39:37.29 ID: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 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 19:30:27.97 ID:4TN3vyid.net]
- <異常>
(1)? (?(1)(?:2|(3))) 置換: [$2] 対象テキスト: 3 結果: [3] ----------- <正常> (1)? (?(1)(?>2|3)|4) (1)? (?(1)(?>2|3)|(?>4|5))
- 728 名前:デフォルトの名無しさん mailto:sage [2018/11/06(火) 19:36:59.61 ID:4TN3vyid.net]
- >>709 の実験でバグの原因が分かった
1、不要なカッコを取り除く処理が (?: ) を取り去った 2、分岐の "|" の意味合いが変わってしまった ということだね、原因が分かれば回避が簡単なのでこのまま放置でも良さそう
- 729 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 18:21:43.84 ID:BZlL2mTg.net]
- perl5.14
# 1文字が2文字にマッチ if ( "fi" =~ /\A\x{fb01}\z/i ){ print "true\n"; } else { print "false\n"; }
- 730 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 18:52:26.91 ID:BZlL2mTg.net]
- if ( "K" =~ /\A\x{212A}\z/i ) true
if ( "K" =~ /\A\x{212A}\z/il ) false
- 731 名前:デフォルトの名無しさん mailto:sage [2018/11/09(金) 21:22:21.15 ID:BZlL2mTg.net]
- if ( "\x{212A}" =~ /[[:print:]]/ ) true
if ( "\x{212A}" =~ /[[:print:]]/a ) false
- 732 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 00:04:00.21 ID:EY2CMtcP.net]
- \d{0,32766}
# ok \d{0,32767} # error "Quantifier in {,} bigger than 32766 in regex;"
- 733 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 00:21:29.46 ID: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 名前:デフォルトの名無しさん mailto:sage [2018/11/10(土) 18:21:06.77 ID:EY2CMtcP.net]
- # 検索表現の途中にある \G をマッチさせる
my $str = 'abcde'; $str =~ /abc/g; if ($str =~ /abc\Gd/){ print "true\n"; } else { print "false\n"; }
- 735 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 00:16:05.06 ID: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 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 05:19:20.83 ID: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 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 21:32:36.34 ID: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 名前:デフォルトの名無しさん [2018/11/14(水) 10:41:07.07 ID:Hh1ptiAj.net]
- 717
- 739 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 14:37:49.07 ID:duOGmOFb.net]
- ワロタw
- 740 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 18:45:40.17 ID:I91AeKub.net]
- このクイズだか検証だかよくわからんの書き連ねてるのは何なの?
一人で無意味に書き連ねてるの?誰かとやりとりしてるの?
- 741 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 23:41:31.78 ID:cpUdYoRF.net]
- 正規表現の勉強をしながら気付いたことをメモってるだけです
基本的には一人でやってます 仲間が欲しい...
- 742 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 23:44:34.67 ID:CNd6PM4x.net]
- ここはお前のチラシの裏なのか
ある程度まとまってんならともかくメモ書きなら他所でやれよ
- 743 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 00:11:59.19 ID:Ow4iH1sO.net]
- 需要ないかな?無いならやめます
- 744 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 22:32:34.48 ID:IM0UsOCP.net]
- 無いよ
- 745 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 17:20:00.59 ID:eADG8kUk.net]
- bregonig.dll の (?a)\w の処理速度が遅い
(?u)\w と同じ速さ \s や \d や [a-zA-Z_] より4倍の遅い 改善の余地ありそうだね
- 746 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 03:22:15.33 ID: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 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 12:49:09.25 ID:Oiq/x6oK.net]
- いつまで続くの?
- 748 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 19:34:31.80 ID:CU3gUCH4.net]
- ●Regular Expressionの使用環境
C# ●検索か置換か? 置換 ●説明 先頭の全角スペースのみを置換したい 先頭の全角スペースは1文字の場合もある ●対象データ ああああ あ あ あ あ あ ●希望する結果 空空空ああああ あ あ あ あ あ
- 749 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 23:39:43.26 ID:UsYfXb0d.net]
- >>730
Regex.Replace(str, @"(?<=^\s*)\s", "空");
- 750 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 23:41:52.91 ID:UsYfXb0d.net]
- あ全角スペースか
\sを全角スペースに変えて
- 751 名前:デフォルトの名無しさん mailto:sage [2018/11/22(木) 01:15:55.43 ID:YNRtrxPu.net]
- 可変長の戻り読みは便利だけどコールバックで処理するのが普通じゃないかな
https://ideone.com/4l8abQ
- 752 名前:729 mailto:sage [2018/11/22(木) 03:09:11.69 ID: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 名前:デフォルトの名無しさん mailto:sage [2018/11/22(木) 11:43:47.30 ID:sD3Vu3lJ.net]
- >>731-734
どうもありがとうございました
- 755 名前:デフォルトの名無しさん mailto:sage [2018/11/26(月) 03:08:54.11 ID:bvNwlvbS.net]
- Regex.Replace(str, @"\G ", "空");
でもいけるよ
- 756 名前:デフォルトの名無しさん [2018/11/26(月) 06:49:56.12 ID:OBhrl1nm.net]
- >>736
・・・っ、すごい。サクラエディタとかでも使える。 \Gのありがたみ知らなかった。私は、まだまだ精進が足りないようだ。
- 757 名前:デフォルトの名無しさん mailto:sage [2018/11/27(火) 00:09:50.92 ID:5gbDlA47.net]
- \Gを知らないのに正規表現を使いこなせるということはproxomitronのユーザーさんかな
- 758 名前:デフォルトの名無しさん mailto:sage [2018/11/28(水) 15:10:22.46 ID:N4CCGDXj.net]
- \Gの使い方を覚えたら>>716が面白く感じるかもね
知ってれば今更感しかないが
- 759 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 02:42:35.12 ID:Fz25AUlj.net]
- >>507-508
すごい こういう書き込みが初心者の質問とその回答で埋もれてしまうのはもったいない 質問スレとは別に正規表現の本スレらしいスレがあるといいな
- 760 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 02:52:05.30 ID:rs9fzmaE.net]
- 頑張ったなぁとは思うけど https://regex101.com/ じゃあかんかったか?とも思う
というかリンク貼れんの? https://goo.gl/M2Fn68.info
- 761 名前:デフォルトの名無しさん mailto:sage [2018/11/29(木) 08:19:27.68 ID:nDdllTwV.net]
- 自分で立てればいいのになんで他人頼みなの?
- 762 名前:デフォルトの名無しさん mailto:sage [2018/12/02(日) 03:28:37.05 ID:s0yCsMa3.net]
- >>740
じゃあ俺が立てるわ、テンプレの準備にちょっとかかるが
- 763 名前:デフォルトの名無しさん mailto:sage [2018/12/08(土) 16:06:50.58 ID:7G2k61ed.net]
- twitter.com/munesuk
enya_go/status/1071188833515954176 先輩w
- 764 名前:デフォルトの名無しさん mailto:sage [2018/12/08(土) 20:04:57.14 ID:RNQqcEtu.net]
- アンド検索をしたいのですが、どう書けばいいでしょうか
^(?=.*あああ)(?=.*かかか).*$ このコードを見つけました あああ と かかか の含まれる行がヒットします ただ、ロジックがちょっとわかりません 先読みをつかっているのですが、先読み対象の語が指定されていません これはどういうことでしょうか 分かりやすい解説サイトでもあれば教えてください
- 765 名前:デフォルトの名無しさん mailto:sage [2018/12/08(土) 20:32:25.49 ID:Dx33rAX6.net]
- このへんかな
>正規表現で論理積(AND)を実現する >https://qiita.com/n4o847/items/dbcd0b8af3781d221424 自分流のちょっと乱暴な理解解釈だと 1. (?=検索対象) は、この条件が満たされないと後続のマッチを調べない 2. (?=検索対処) 自体は、この条件が満たされてた時点である意味消滅したかのようにふるまう って動きを取るような感じ ちなみにAND検索ができるgrepツール(TresGrep)がどんな正規表現を組み立てるか調べてみたら 「xxx&yyy&zzz」 ↓ 「xxx.*?(yyy.*?zzz|zzz.*?yyy)|yyy.*?(xxx.*?zzz|zzz.*?xxx)|zzz.*?(xxx.*?yyy|yyy.*?xxx)」 なんてのを吐き出した 安直だけどまあこれも間違ってはいない
- 766 名前:デフォルトの名無しさん mailto:sage [2018/12/08(土) 20:35:48.50 ID:Dx33rAX6.net]
- あ、先読み対象の語は「^」だけで
「行頭から始まるという条件さえ満たせば何でもよ
- 767 名前:い」と指定してる []
- [ここ壊れてます]
- 768 名前:デフォルトの名無しさん mailto:sage [2018/12/08(土) 22:19:09.33 ID:7G2k61ed.net]
- 環境が分からない
何を検索したいのか分からない >先読みをつかっているのですが、先読み対象の語が指定されていません ??? 指定されてないって何のことだろう、意味不明 正規表現うんぬんの前にまともな質問の仕方を学ぶべき
- 769 名前:デフォルトの名無しさん mailto:sage [2018/12/08(土) 22:26:59.96 ID:RNQqcEtu.net]
- >>746
先読み対象は行頭ということですね ^(?=.*あああ) これだと意味としては 「あああの前に行頭が存在すればヒット」 ということになると思います これってもう少しかみ砕いた表現にできませんか? まだ、理解が追い付いてないです 行頭が存在すればヒットということは、「行の中にあああがあればヒット」と同じことですか?
- 770 名前:デフォルトの名無しさん mailto:sage [2018/12/08(土) 23:05:31.04 ID:hZepSGXS.net]
- >>749
^は検索位置を示すもので、先頭を表す記号、 (?=)は先読みで検索開始位置を移動しないもの つまり、 ^(?=.*あああ) は、先頭から(改行までの間に)文字列「あああ」がある場合 (先読みなのでマッチ後も次の検索開始位置はまだ先頭のまま) よって ^(?=.*あああ)(?=.*かかか) は、先頭から(改行までの間に)「あああ」があり、且つ先頭から「かかか」がある場合 .*$は不要だが、付けると、改行が存在すると絶対マッチしなくなる点が異なる
- 771 名前:デフォルトの名無しさん mailto:sage [2018/12/09(日) 06:54:41.50 ID:C3Qast1U.net]
- ↑かっこを二つならべると、()と()という感じで、アンドになるんでしょうか?
あと (?=)は先読みで検索開始位置を移動しないもの の部分なんですが、検索開始位置を移動しないというのはどういうことでしょうか ?=キーワード で設定した場合、キーワードの相対位置から前を検索する、という認識でした
- 772 名前:デフォルトの名無しさん mailto:sage [2018/12/09(日) 08:43:46.17 ID:UT294bNs.net]
- 質問者は正規表現の基礎知識が足りてないと思われる
たとえるなら、(?=)の先読みは高校受験レベルで求められる英文法だとすると 質問者の場合は入門レベル(そもそもの基本ルールとか「.*」とか)の知識がごそっと抜けてる なのでここまで出てきた説明を読んでもちんぷんかんぷんにしかならないのだろう ちょっと遠回りになるけどちゃんと正規表現の基礎を理解したほうがいい https://qiita.com/jnchito/items/893c887fbf19e17d3ff9 あたりを最終回(その4)まで読め それでも理解できないなら、貴方には正規表現を扱うのは無理だからあきらめろ
- 773 名前:デフォルトの名無しさん mailto:sage [2018/12/09(日) 09:50:40.98 ID:vJutpfX/.net]
- >>751
()()でandになるわけではなく、()の次に()があるかどうかとなる(順序関係ができている) ^(a)(b)と書くと、abにはマッチするがaやbやbaにはマッチしない これは、^(a)がマッチした時点で検索位置がaの次に移動しているためである ^(?=a)(b)と書くと、何もマッチしなくなる これは先頭からaが見つかった場合、検索開始位置が移動しないため(?=a)を検索する前のまま(つまり先頭)になっている 次にbが先頭にあればいいわけだがそこにはaがあるからマッチしない
- 774 名前:デフォルトの名無しさん mailto:sage [2018/12/09(日) 10:39:42.84 ID:bsA2M6bZ.net]
- ID:vJutpfX/
頭が良すぎて教えるのが下手なパターン バカ語で話さないと通じないよ
- 775 名前:デフォルトの名無しさん mailto:sage [2018/12/09(日) 10:51:59.84 ID:bsA2M6bZ.net]
- こんな最低限のこともググらず、自分で努力せずに人に聞くようなのに
教えてはいけないと思う、居ついてしまうからエサを与えないで欲しい
- 776 名前:デフォルトの名無しさん mailto:sage [2018/12/09(日) 11:55:43.32 ID:C3Qast1U.net]
- >>753
動かしながら覚えてみます ありがとうございます
- 777 名前:デフォルトの名無しさん mailto:sage [2018/12/09(日) 12:38:27.41 ID:H3JhKeet.net]
- 動かしながら覚えるんじゃなくて
>>752でも何でも良いけど、説明読んで覚えて欲しい 中途半端な事してるから、>>751みたいに間違った解釈になるんでしょ
- 778 名前:744 mailto:sage [2018/12/09(日) 19:23:00.27 ID:i2SuH64K.net]
- うーん、一応はレス内容から質問者がどの程度内容を理解したか/理解する気でいるか
透けて見えるんだけどね >>746のURLの記事を読んだうえでこの程度のレスしか返ってこず、さらに 最終的には>>756のようなリアクションが返ってきたか 回答して残念な気持ちになったよ
- 779 名前:デフォルトの名無しさん mailto:sage [2018/12/09(日) 19:57:20.13 ID:sTKdTIE5.net]
- 位置の理解は言うほど易しくはないとおもわれ
正規表現検索とはテキストエディタでカーソルを1つずつ進めながら 合致する文字を1文字ずつ探っていくようなものだというイメージが必要だけど そこをちゃんと説明してるものはあまり見かけない
- 780 名前:デフォルトの名無しさん mailto:sage [2018/12/09(日) 20:00:27.58 ID:bzQOhihu.net]
- 知恵遅れに場所を移動したらしい
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10200210065 まずは自習しろよw
- 781 名前:デフォルトの名無しさん mailto:sage [2018/12/09(日) 21:49:11.61 ID:bsA2M6bZ.net]
- 回答した人は親切丁寧に回答出来ていたよ、お疲れ様
上にも書いたように頭のいい人にしか理解出来ない回答になっていた 俗にいう分かってる人にしか分からない説明ってやつ 俺はこういうバカに教えるのは得意だから俺が回答を付ければ理解されたと 思うけど注意をスルーされたのでスルーした
- 782 名前:デフォルトの名無しさん mailto:sage [2018/12/10(月) 14:42:13.07 ID:RU/iAdEK.net]
- 知恵袋で質問を4000件以上やりとりしてる人だったのか
それなのに質問の仕方がまったくダメって
- 783 名前:デフォルトの名無しさん mailto:sage [2018/12/10(月) 17:07:38.24 ID:RU/iAdEK.net]
- 質問のペースがおかしい、1日に質問6つしてる
ググるより先に質問してんのか?
- 784 名前:デフォルトの名無しさん mailto:sage [2018/12/10(月) 17:25:29.04 ID:RU/iAdEK.net]
- https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10200202400
おまえらはこんなの相手に一生懸命教えてたのか 自分を安売りしすぎ、もってけ泥棒状態
|

|