- 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以降
- 817 名前:デフォルトの名無しさん mailto:sage [2019/03/13(水) 01:39:37.63 ID:bUFEpZHr.net]
- あなたの英語も変ですよ。
日本人はJapaneseとキャピタライズしてください。 日本語もjapan languageではなくJapanese languageです。 Japaneseだけで日本語という意味になりますが、前の文で日本人という意味で使っているのでlanguageを付けるのはいい判断でした。 また最後の文は、どうしても複数の例を見たいことを強調するのでない限りcodesではなくのcodeがふつうです。 不定冠詞のaも付けません。(絶対にただひとつの例だけ欲しいのでない限り)
- 818 名前:デフォルトの名無しさん mailto:sage [2019/03/13(水) 02:16:45.79 ID:heD+eXgL.net]
- 自分の英語力は小学生相当なのでこんなもんです
教えてくれてありがとね
- 819 名前:デフォルトの名無しさん [2019/03/13(水) 02:29:04.73 ID:Z/ka/TFK.net]
- irregular expression, exactly.
- 820 名前:デフォルトの名無しさん mailto:sage [2019/03/13(水) 08:53:04.20 ID:heD+eXgL.net]
- I am good at irregular expression.
- 821 名前:デフォルトの名無しさん [2019/03/13(水) 14:12:32.68 ID:ZUOT1OTB.net]
- nativeのひとに「あなた英語上手ですね」って言われても誉め言葉じゃないからな
その時点で下に観られてる
- 822 名前:デフォルトの名無しさん mailto:sage [2019/03/14(木) 17:54:44.14 ID:k53fNhgw.net]
- 上手ですねと言われる可能性が0なので大丈夫です
- 823 名前:デフォルトの名無しさん [2019/04/22(月) 20:21:53.32 ID:GQt1LKrG.net]
- sed
置換 1に挟まれたN個以下の0または-で構成された文字列を、同数の1で置き換える 10001→11111 100-1→11111 1---1→11111 10-0-0001→111111111 置換対象と同数の文字列で置換するというところをどう正規表現で表すかわからず、、、 よろしくお願いします
- 824 名前:デフォルトの名無しさん mailto:sage [2019/04/23(火) 05:37:05.12 ID:TbAsj7lM.net]
- 正規表現で数を数えるのは無理
マッチさせて自力で文字を数えるコード書いて入れ替えて ちなみに\Gが使える正規表現環境なら正規表現単独で可能
- 825 名前:デフォルトの名無しさん [2019/04/23(火) 07:05:11.04 ID:k/th3sVe.net]
- >>803
sed ':r; s/1[0-]\([0-]*1\)/11\1/; tr' 前方に 1 のある 10 を 11 に置換する 置換に成功したら tラベル で :ラベル の位置に戻って繰り返す
- 826 名前:デフォルトの名無しさん mailto:sage [2019/04/23(火) 08:49:46.57 ID:ef59e0DS.net]
- >>803
たぶんこれだけでは不要なところを置換しそう :a;s/1([^0\-]*)(?:[0\-])(.*)1/1$11$21/g;t a 例題をこなすのは確認
- 827 名前:デフォルトの名無しさん [2019/04/23(火) 10:21:33.54 ID:yIB0exXp.net]
- >>803
100010 とか 1000101 とか があるのか? あった場合はどうすべきか そこは明記しような。 謎だらけの設計書書く奴はIT向いてない。
- 828 名前:デフォルトの名無しさん mailto:sage [2019/04/23(火) 11:46:04.64 ID:ef59e0DS.net]
- >>807
>>806で> 100010→111110、> 1000101→1111111は確認 というかオレは前後にゴミがつくことは何ら影響がある題とは思わなかった >>803の「1に挟まれたN個以下の0または-で構成された文字列を、同数の1で置き換える」にはその前後について言及ないから「触らない」と判断 後者を1000101→1111101で求めるかという点は気になるところ 最初の1〜1ブロックのみなのか、行中の1〜1最長一致ブロックなのか(すべての1〜1ブロックを個別処理も同一)
- 829 名前:デフォルトの名無しさん [2019/04/23(火) 12:07:17.02 ID:yIB0exXp.net]
- >>808
()で囲うとなってれば入れ子のケースは当然問題になるんだから 入れ子を考慮する必要があるかを明確に定義してないのは駄目な仕様。 10-以外が現れた場合の扱いも明記されていない →現れることはないとみなしている んだから 100010は現れないと想定して書く選択肢もある。 いずれにしろ、不明瞭な仕様を書く奴は無能だし、 勝手に解釈するのも実際の仕事じゃトラブルの元。
- 830 名前:デフォルトの名無しさん mailto:sage [2019/04/23(火) 12:23:27.03 ID: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 名前:デフォルトの名無しさん mailto:sage [2019/04/23(火) 12:38:52.51 ID:ef59e0DS.net]
- >>809
反論と取られたのかな 反論でも賛意でもないよ 個人的には>>803が「よい定義や仕様」とは欠片も思わない一方で「ダメダメ」とも思わない 組んでいく中で詳細を詰めていくことも現実としてある あなたが求めているようながっちり仕様が決まっていたらむしろやることなんてほぼないかも 単に日本語を翻訳する作業になるのでむしろ苦痛かな… そこまで詰められるなら日本語で指示しないで自分で書けよと思ってしまうかも スレ的に読み替えればがっちり仕様を出した上で「これは正規表現で可能か?」という命題に繋がるのでスレでがっちり仕様を出すなと言う意味ではないです(念為) 仕事でもなし頭の体操的にてきとーに答えてるだけなんでこれくらいなら気にしない派
- 832 名前:デフォルトの名無しさん [2019/04/23(火) 13:02:53.90 ID: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 [2019/04/23(火) 13:49:39.47 ID:CFFnqXFD.net]
- 問題が曖昧であったため議論を紛糾させてしまいました。すみません。
たしかに入れ子のことや、一致する最初の文字列か、最長か、01-以外の文字の存在などを明確に記載できていませんでした。 今回の問題で聞きたかったことをシンプルに表現すると、検索文字列の文字数(1〜N個)に依存した置換が可能なのか、になります。 そこについては先の人が回答してくださった通り、文字数を記憶しておくような処理は不可能であるから正規表現の範疇ではないと思いました。 これまでの意見から当初目的ではないものの多くのヒントをもらいました。ありがとうございました。 問題提示者としていたらないながら、この話はクローズさせていただきます。
- 834 名前:デフォルトの名無しさん [2019/04/23(火) 13:52:46.13 ID:yIB0exXp.net]
- >>811
反論だなんて受取ってないから妄想やめて。 定義が曖昧過ぎてねえ… としか言ってないから。 01-以外でいいのか、1.*1でいいのか などなど要件がこんな不明瞭じゃねえ と言う話しかしてないのであしからず。
- 835 名前:デフォルトの名無しさん [2019/04/23(火) 13:54:41.14 ID:yIB0exXp.net]
- >>811
というか、そもそもお前宛じゃないのに なんでお前が絡んで来てるのか謎。 勝手にお前が批判されたと妄想するなよ。
- 836 名前:デフォルトの名無しさん mailto:sage [2019/04/23(火) 15:45:58.43 ID:ef59e0DS.net]
- >>815
> というか、そもそもお前宛じゃないのに ふあ? >>809(ID:yIB0exXp)で>>808(ID:ef59e0DS)に安価されてるからですよ んーなんなんかな(´д`)
- 837 名前:デフォルトの名無しさん [2019/04/23(火) 17:14:05.07 ID:yIB0exXp.net]
- >>816
>>807のことだが。 お前宛じゃないのに絡んで来たのお前だろ。 記憶喪失ワロタw
- 838 名前:デフォルトの名無しさん mailto:sage [2019/04/23(火) 19:20:56.30 ID:GneiHx9I.net]
- まーまー、ここはわしの顔を立てて双方おとなしくしてくれまいか。
- 839 名前:デフォルトの名無しさん mailto:sage [2019/04/23(火) 19:41:58.96 ID:ef59e0DS.net]
- >>817
あーきみがいいたいのはそっちか 例題をこなす正規表現を提示している>>805,806宛と捉えたんだよね すでに>>805,806出てるのになにも提示してないでぐちぐち言ってるんで まあ気に障ったようなので安価張って絡んだ形になったのは謝るよ
- 840 名前:デフォルトの名無しさん [2019/04/23(火) 19:46:57.33 ID:yIB0exXp.net]
- >>819
>>807は>>803宛だと明示してるし >>805>>806なんてどこにも書かれていないのに勝手に勘違いされてもさあ。 どこをどう見たってお前が勝手に絡んで来てるのに 「絡んだ形」とかふざけた言い方すんなよ。
- 841 名前:デフォルトの名無しさん mailto:sage [2019/04/24(水) 19:37:45.85 ID:kN2xWSes.net]
- 質問者の例題は数に応じた置換の簡単なサンプルが欲しくて書いたものだと思う
再帰的に無理やり導くクソコードなんて書かれても迷惑なだけでしょ
- 842 名前:デフォルトの名無しさん mailto:sage [2019/04/24(水) 21:35:46.86 ID:SVxlletW.net]
- 端からは大人と子供
ご愁傷様
- 843 名前:デフォルトの名無しさん [2019/04/25(木) 02:00:13.99 ID:nkf4NYVZ.net]
- pythonスレで似たテーマ観たからマルチ認定
- 844 名前:デフォルトの名無しさん mailto:sage [2019/04/26(金) 22:15:29.45 ID:pXwlHtT3.net]
- sedとpythonじゃまるで違うから別件だろうな
>>819 勘違いして迷惑かけた分際で「ぐちぐち」って言葉を使うか普通.. というかこの文体、昔セガBBSにいた南瓜さんという人にそっくりだな 別人だろうけど思い出してワロタ
- 845 名前:デフォルトの名無しさん mailto:sage [2019/04/26(金) 22:34:09.92 ID:7hEPz6dq.net]
- しばらくぶりにノゾいたらワロタ
ID:yIB0exXp hissi.org
- 846 名前:/read.php/tech/20190423/eUlCMGV4WHA.html
平日の朝から晩まで 内容がとっても抽象的 ネット弁慶クンってホントにいるんだな!w [] - [ここ壊れてます]
- 847 名前:デフォルトの名無しさん mailto:sage [2019/04/26(金) 23:09:55.86 ID:DINb0EDe.net]
- マ板恒例、湿度高めの展開になってきましたー
- 848 名前:デフォルトの名無しさん mailto:sage [2019/04/27(土) 13:12:59.58 ID:W9D3URJl.net]
- オブジェクト指向最高さんは今回まったく落ち度が無い
迷惑かけといて素直に謝ることも出来ないくそコード製造機はもう来なくていい
- 849 名前:デフォルトの名無しさん mailto:sage [2019/04/27(土) 21:25:24.59 ID:CxhHumup.net]
- 翌日以降もこんな感じですよ
ttp://hissi.org/read.php/tech/20190424/M1dYN3QzOXA.html ttp://hissi.org/read.php/tech/20190425/VThrOUNyV3U.html ttp://hissi.org/read.php/tech/20190426/NGZaS2JZWkg.html ttp://hissi.org/read.php/tech/20190427/QzZmMHJVWmE.html こちらで引き取ってもらえませんか?
- 850 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 22:49:23.33 ID:Wy3P56AZ.net]
- 引き取ってくれてありがとう〜(^。^)
- 851 名前:デフォルトの名無しさん mailto:sage [2019/05/29(水) 23:29:43.55 ID:NoMeOMsF.net]
- よろしくお願い致します。
●Regular Expressionの使用環境 Python 3.7 ●検索か置換か? 検索 ●説明 3つ目と4つ目のダブルクオートの間の文字列を探す ●対象データ "文字列1":[1000:"文字列2"] ●希望する結果 文字列2
- 852 名前:デフォルトの名無しさん mailto:sage [2019/05/30(木) 07:22:28.54 ID:NTWA4E5y.net]
- >>830
Javaの正規表現テストサイト(*1)でしか試してないけど… (?:[^"]*"){3}([^"]*)" *1 https://regex-testdrive.com/ja/
- 853 名前:デフォルトの名無しさん mailto:sage [2019/05/30(木) 08:48:50.22 ID:ZbLZAkBS.net]
- >>831
文字列1が空だと空振るのでいっそベタ書きするかな それと対象の規模によっては計算量も30%少なくて済む "[^"]*"[^"]*"([^"]*)" くどいーと思ってまとめてみても "(?:[^"]*"){2}([^"]*)" 若干悪化して15%offくらいに留まる
- 854 名前:デフォルトの名無しさん mailto:sage [2019/05/30(木) 09:14:01.64 ID:js+SNbQS.net]
- やっぱり可変長の戻り読み使えないなら後方参照で抜き出すしかないよね
というか正規表現以外で抜き出した方が処理軽いんじゃ
- 855 名前:デフォルトの名無しさん mailto:sage [2019/05/30(木) 10:41:49.43 ID:NTWA4E5y.net]
- >>832
> 文字列1が空だと空振るのでいっそベタ書きするかな 空振るの意味がよくわからん 効率は考えてない
- 856 名前:デフォルトの名無しさん mailto:sage [2019/05/30(木) 16:00:31.98 ID:0UuZnvit.net]
- >>834
皆様、ありがとうございます。 >>831にてご提案頂いたものに、Pythonのエスケープシーケンスを加えて採用しました。 ほか、ご提案頂いたものも大変勉強になりました。
- 857 名前:デフォルトの名無しさん mailto:sage [2019/06/12(水) 18:51:34.75 ID:8qMgnvIv.net]
- 正規表現で全角記号だけ抜き出す事はできますか?
★ファイル名 みたいにして先頭に来るようにしてたんですが、全角記号はエラーおこすことがあるようです
- 858 名前:デフォルトの名無しさん mailto:sage [2019/06/12(水) 20:16:21.08 ID:ATCcrAWn.net]
- なんの処理系か書けよな
- 859 名前:デフォルトの名無しさん mailto:sage [2019/06/12(水) 20:18:49.53 ID:0U8oWwW8.net]
- 使用する文字コードも
- 860 名前:デフォルトの名無しさん mailto:sage [2019/06/17(月) 00:16:17.89 ID: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 名前:デフォルトの名無しさん mailto:sage [2019/06/17(月) 02:22:40.96 ID:FPrxRapn.net]
- (?<=[a-zA-Z])[^a-zA-Z]
- 863 名前:デフォルトの名無しさん mailto:sage [2019/06/17(月) 06:40:06.13 ID:LXSfy5ij.net]
- >>839
> 「全角英字の単語直後の任意の1文字」 > ああいいいabcうABCえおかきくけ bcうBCえ > 「う」、「え」の2か所 任意とは
- 864 名前:デフォルトの名無しさん mailto:sage [2019/06/17(月) 21:52:38.33 ID:ks+4WGLz.net]
- >>840
天才!天才!解決しました。大量に感謝 発想が . に囚われていた……勉強になります >>841 単語というのが1文字じゃなくて英字で構成されたブロックの〜という意味でした。わかりにくくてスマソ
- 865 名前:デフォルトの名無しさん mailto:sage [2019/06/18(火) 22:51:14.09 ID:y1gFJJpS.net]
- ちょっとした疑問
アラビア語のような右書き言葉だと正規表現をどう書くのだろう 文字列も正規表現も右書きだから、/xyz$/ は /$zyx/ ? (レス不要です)
- 866 名前:デフォルトの名無しさん [2019/06/19(水) 05:02:00.28 ID:tVNS+22r.net]
- 【出資】松本卓朗 人工知能詐欺【注意】
https://rio2016.5ch.net/test/read.cgi/rikei/1560859403/
- 867 名前:デフォルトの名無しさん [2019/06/19(水) 14:27:57.27 ID:Yoy0IPRe.net]
- いし正が左らか右は語本日
- 868 名前:デフォルトの名無しさん mailto:sage [2019/06/23(日) 22:51:37.03 ID:WHM6Ibwm.net]
- >>836
理論上は | で全部やればできる ちょうど単なる全角( 1文字が2つの幅をもつ ロシアの言語なども2幅 ) を捉えようとしていたので道具を紹介 https://i.imgur.com/9l39lUv.jpg 正規表現は (.) で1文字を習得し バイト数が1でないものを拾うロジック
- 869 名前:デフォルトの名無しさん mailto:sage [2019/06/24(月) 06:26:17.63 ID:F4CLQWNj.net]
- ttps://so-zou.jp/software/tech/programming/tech/regular-expression/meta-character/variable-width-encoding.htm
こういうので全角記号だけさっくり選ばせろって事なんだろうけど 全角半角はユニコードだとフォント依存なので曖昧 ascii 以外って意味で言ってるんだろうけど 恐らく"ファイル名"て事からSJisの範疇外の文字って事かなと
- 870 名前:デフォルトの名無しさん mailto:sage [2019/06/24(月) 21:23:57.79 ID:4+LiJo6+.net]
- 一文字決めうち かつ あらっぽいコレクション
vim の :h digraphs には結構ある [??????????▲△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
- 871 名前:デフォルトの名無しさん mailto:sage [2019/06/24(月) 21:24:32.12 ID:4+LiJo6+.net]
- [??????????▲△??▼▽??◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
- 872 名前:デフォルトの名無しさん mailto:sage [2019/06/24(月) 21:24:52.95 ID:4+LiJo6+.net]
- [??????????△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
- 873 名前:デフォルトの名無しさん mailto:sage [2019/06/24(月) 21:28:31.79 ID:4+LiJo6+.net]
- おわった
NG word 群が正規表現を妨げる 一文字限定なら [] の処理が早い vim の :h digraphs には 1300個ぐらいの 記号を含むデータリストがあるから それから組みたてやすい とおもう
- 874 名前:デフォルトの名無しさん mailto:sage [2019/06/24(月) 21:56:38.71 ID:meJBThiE.net]
- NGワードと文字化けの区別ができない人は書き込んじゃダメ。
- 875 名前:デフォルトの名無しさん mailto:sage [2019/06/24(月) 23:17:52.70 ID:4+LiJo6+.net]
- そういえばブラウザに NG word に指定したのは自分だった
あらしが記号を使ってたことがあったので
- 876 名前:デフォルトの名無しさん mailto:sage [2019/06/25(火) 07:18:11.77 ID:0Do2GL77.net]
- 荒らしが記号を使うことと書き込みを制限することに全く関連が無い
- 877 名前:デフォルトの名無しさん mailto:sage [2019/06/25(火) 08:36:20.64 ID:Y04/VZ6Y.net]
- https://i.imgur.com/QA0OVK8.jpg
こう見えていたんだ 左がわひどいね ごめんね
- 878 名前:デフォルトの名無しさん mailto:sage [2019/07/08(月) 00:38:09.05 ID:m6vFYfK4.net]
- ●Regular Expressionの使用環境
サクラ
- 879 名前:エディタ(か秀丸エディタ)
●検索か置換か? 置換 ●説明 不定回数のパターンを置換したい。 ●対象データ [A=a,A=b,A=c,A=d,・・・・] ・・・・の部分はどこまで続くのかは決まってない。が、多くても20個くらい ●希望する結果 A=a,b,c,d・・・・ [] - [ここ壊れてます]
- 880 名前:デフォルトの名無しさん mailto:sage [2019/07/08(月) 05:29:01.40 ID:9IE9wmRC.net]
- (?<!^)A=
- 881 名前:854 mailto:sage [2019/07/08(月) 23:27:17.45 ID: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 名前:デフォルトの名無しさん mailto:sage [2019/07/10(水) 08:43:33.27 ID:WA2fRW/e.net]
- \s++OR\s++.=
,
- 883 名前:デフォルトの名無しさん mailto:sage [2019/07/10(水) 09:18:54.80 ID: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 名前:デフォルトの名無しさん mailto:sage [2019/07/10(水) 09:35:40.67 ID: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 mailto:sage [2019/07/11(木) 01:01:12.77 ID:/KpWZOtx.net]
- >>859
すごい。。 置換できましたありがとうございます。 が、情けない話ですがなぜこういう置換結果になるのかが理解できません。 良ければどなたか解説いただけないでしょうか >>860 ほんと、超人的ですね。。 Perlでのご教授ありがとうございます。 1度組んでしまえば汎用的に使えそうですね。
- 886 名前:デフォルトの名無しさん mailto:sage [2019/07/11(木) 21:00:44.92 ID:SCYCuKB+.net]
- >>862
https://github.com/k-takata/Onigmo/blob/master/doc/RE.ja
- 887 名前:デフォルトの名無しさん mailto:sage [2019/07/13(土) 20:47:25.54 ID: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 名前:デフォルトの名無しさん mailto:sage [2019/07/13(土) 23:13:26.72 ID:57lWPs8z.net]
- 正規表現の問題ではなくJavaScript固有の問題のようなので、質問を閉じ、
JavaScriptスレにて質問し直します。 興味のある方は以下をご覧ください。(これからすぐ投稿します) https://mevius.5ch.net/test/read.cgi/tech/1417749547/341-
- 889 名前:デフォルトの名無しさん mailto:sage [2019/07/13(土) 23:31:59.74 ID:57lWPs8z.net]
- すいません自己解決しましたが一応。以下となりました。
https://mevius.5ch.net/test/read.cgi/tech/1417749547/341-342
- 890 名前:デフォルトの名無しさん mailto:sage [2019/07/14(日) 04:59:50.53 ID:XILHsvHP.net]
- この質問内容ならここで合ってます、jsスレよりもこのスレ向きです
正規表現には統一規格みたいなものは存在しないので環境によって動作が異なります このスレの住民なら2番目のマッチが t から始まる環境も想定します ["","time", ";prop1:style1", ";prop2:style2"] 詳しい仕様を知らなくても動作を確認するコードを作っていろいろ試すと どう動く環境なのかだいたい分かってしまうことが多いです
- 891 名前:デフォルトの名無しさん mailto:sage [2019/07/14(日) 08:17:29.28 ID:LdVrbIxu.net]
- >>867
> 正規表現には統一規格みたいなものは存在しないので環境によって動作が異なります これは知ってますがBREの範囲だと当然間違いなく動くし、 ほぼPCREに向けて統一中、といったところなのでは? まあやたら複雑になってバックトラッキング等の問題が発生し、 結果的に速いライブラリに収束して行っているのはいいことだと思いますが。 > このスレの住民なら2番目のマッチが t から始まる環境も想定します > ["","time", ";prop1:style1", ";prop2:style2"] これは一応アウトなのでは?正規表現自体はデリミタごと取り込もうとしており、それが出来ていません。 これを言うならJavaScriptもアウトですが。 個人的にはJavaScriptは面白いのですが仕様がイマイチなところが散見されるのが難点ですね。 それが初心者に無用な混乱を引き起こし、上達の妨げになっている。 今回私も数時間無駄にしましたが、これが初心者だと脱出出来なくて誤解したままになってしまう。 そして本人はそれを自覚出来ず、Web上に間違った情報を垂れ流し、馬鹿が再生産されるというループになっている。 この意味では正規表現の現在の状況も同じようなものですが、 正規表現は「実装の幅がものすごくある」と共有されているだけまだましです。 JavaScriptの連中はその間違った実装を「正しい」と思いこんでいたりするので、会話が成立しません。 といってもJavaScriptのString.matchの仕様バグを今更直すことも出来ず、未来永劫このままだと思いますが。
- 892 名前:デフォルトの名無しさん [2019/07/14(日) 10:58:08.46 ID:wR6d2dgQ.net]
- PCREに向けて統一中なんてどんな根拠で喋ってんだ
regex101で試してみれば分かるけどPCRE使ってるPHP以外のPython, ECMAScript, Goは全滅だぞ
- 893 名前:デフォルトの名無しさん mailto:sage [2019/07/14(日) 12:13:01.78 ID: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 名前:デフォルトの名無しさん mailto:sage [2019/07/14(日) 12:35:52.54 ID:QmWR+pGh.net]
- ゼロ幅で永久にマッチし続けるのになんで@timeに進めると思うの?
- 895 名前:デフォルトの名無しさん mailto:sage [2019/07/14(日) 13:05:26.62 ID:LdVrbIxu.net]
- >>871
お前は実装と仕様の違いを理解出来てないタイプだな。 String.matchは「マッチ全部を配列で返す」メソッドだ。 当然、無限ループなんてしてはいけない。 (ただし無限ループしない為に空文字マッチだと一文字進めるパッチだから仕様バグになってるが) RegExp.execは「gマッチを一つずつ実行し、ユーザーがそこで適宜処理を行う」為のメソッドだ。 当然、何もしなければ順に次のマッチをしていくのが正しく、今現在のように無限ループするようでは駄目だ。 結果、今はユーザーが本来不要なコードを毎回書く羽目になってる。 具体的に言えば、 if (match!=='') が毎回必要になる。これが無駄だ。 JavaScript界隈にはお前みたいな馬鹿が多い。 本来はどうあるべきか、或いは何故この無駄なコードが必要なのか分からず、 今の「実装」が正しいと思いこんでいるタイプだ。 動かさないと分からない、あるいは動いていればいい程度のコードしか書けないからだが。 とはいえ、今回のようなケースに遭遇するとそうなるのも分かる気はするが。 いずれにしても、これはJavaScript環境固有の問題で、ここでは割とどうでもいいと思うが。 お前が正規表現として /(^|[@;])[^@;]*/g を書いたとき、全ての環境で無限ループするべきだ!と思っているのならそれでいいが、 実際はそうではないだろ?なら無駄にいちゃもんつけるなよ。
- 896 名前:デフォルトの名無しさん mailto:sage [2019/07/14(日) 13:21:26.40 ID:XILHsvHP.net]
- >>868
"t" からマッチは誤りでした、申し訳ない.. タグの外側だけ対象に置換する www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside この記事の動作のことを言いたかったんですがうろ覚えのまま 適当に書いてしまいました、ごめんなさい
- 897 名前:デフォルトの名無しさん [2019/07/14(日) 13:28:58.74 ID:wR6d2dgQ.net]
- >>870
PCREに統一中だという主張の根拠を聞いたんだがそれへの回答はないわけだ PCREが素晴らしい実装で最初に触っとけばいいというのは同意するが, それが最良だなんてのはあり得ないし単なる妄想だよ
- 898 名前:デフォルトの名無しさん mailto:sage [2019/07/14(日) 14:15:14.24 ID:LdVrbIxu.net]
- >>873
ああなるほど、Perlも似たようなゴミ実装になってるな。 > そこで,Perl では空文字列に マッチするような場合には,初回は空文字列がマッチするがそれ以降は マッチせずに必ず 1文字分は進むようにマッチしようとする. これも実装ミスだ
- 899 名前:な。
正しくは、このフラグを「空文字以外のマッチごとにセット」すればいいだけで、修正は1行で済むのだが、こちらも今更なのだろう。 「初回は」というのが間違いで、「空文字にマッチした直後は」が正しい。 ついでにもっと具体的に言っておくと、「初回は」というのが正しければ、 今の実装は検索起動時にフラグをセットして空文字マッチ後にリセットしているはず。 このフラグを「空文字以外のマッチ後」に毎回セットし直すように1行入れる。これで直る。 君がPERL等のOSSか何かにcontributeする気があって修正案を出してくるのなら見てあげるけど。 (俺自身ではそこまでやる気はない) まあしかし、JavaScriptだけがゴミじゃない、ってのは分かった。 というかもしかしてJavaScriptの実装ってPERL実装互換に敢えてしてる? >>874 お前は何派なんだよ? JavaScriptに関してはMDNでも前は「PCREで大体使えます」みたいな事書いてたぞ。 最近大幅リニューアルしてその記述はなくなったが。 (というより色々見にくくなってあまり確認してない) 鬼車派ならこの手の「実装ミス」をひたすら潰しておけばワンチャンあるかもしれんよ。 JavaScriptにしてもPerlにしてもこの辺のミスは確実に足枷になってる。 具体的に言うと遭遇した全プログラマが数時間ずつ無駄に検索その他をさせられる羽目になってる。 これは「新規プログラマ」からすると上達を妨げる障壁でしかない。 JavaScriptで言うと「IEデハー」な件を全部暗記してて今もそれにすがっている奴のウザさみたいなもんだ。 仕様バグがない、というのはそれなりに武器になる。 [] - [ここ壊れてます]
- 900 名前:デフォルトの名無しさん mailto:sage [2019/07/14(日) 15:13:19.95 ID:LdVrbIxu.net]
- >>869
今更regex101で確認してみたが、PCREだけは(これに関しては)正しく通るじゃねえかよ。 Perlの「初回は」というのはつまり g の時だけおかしくなるということであり、今回は当たらないからだが。 だからJavaScriptも仮にPerl実装互換にしようとしたとしてもしくってるな。 >>873 ちなみに > > と < は後読みと先読みにして外に出すことができるので の意味分かる? おそらくはバックトラックを小さくする為(つまり高速化)だと思うのだが、 実際 regex101で試す限り余計に遅くなる。 テストサンプルはそこの下の「XMLタグを加工する」の上側半分のxmlで、こちらだと (?:^|>)(.*?)(?:$|<) の場合は 29matches, 1277steps だが (?:^|(?<=>))(.*?)(?:$|(?=<)) の場合は 29matches, 1875stepsで、余計に遅くなってる。 格好良くはないが別に $1$2$3 で置換しても問題ないと思うのだが。
- 901 名前:デフォルトの名無しさん mailto:sage [2019/07/14(日) 15:29:05.53 ID:XILHsvHP.net]
- >>876
> > と < は後読みと先読みにして外に出すことができるので これは文字を消費しないための措置 マッチさせたい部分以外の部分にまでマッチしてしまうと次回の 検索開始位置が意図しないところに進んでしまったりするので先読みを 使って消費しないようにします あとあなたが言ってることにはおおむね同意です 変な挙動は無くなるといいですね、perl6に期待したいところだけど perl6では出来る限り最長文字数のマッチを目指す挙動になると聞いたような.. 自分にとっては処理が重くなるのであまり嬉しくないですね..
- 902 名前:デフォルトの名無しさん mailto:sage [2019/07/14(日) 16:03:14.68 ID: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 名前:デフォルトの名無しさん [2019/07/15(月) 15:22:14.71 ID: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 名前:デフォルトの名無しさん mailto:sage [2019/07/15(月) 16:42:33.19 ID: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 名前:デフォルトの名無しさん mailto:sage [2019/07/15(月) 23:23:32.64 ID:3MPTmFRg.net]
- BREの正規表現と今の正規表現の使い方の違いの話は面白いなぁ
しかしこの人こんなにすごいスキルとモチベがあるなら質問なんかせずに 自力でなんとか出来たのではw 質問してくれたおかげで面白い話をいろいろ聞けたからこちらは嬉しいけどネ おかしな挙動と言えばperl5とOnigmoでは\Gの挙動に違いが あってどちらかが違和感のある動作をしたはず \Gの概念自体が微妙に違ったはずだけどメモるの忘れた 興味のある人はぐぐってね
- 907 名前:デフォルトの名無しさん mailto:sage [2019/07/16(火) 15:24:59.03 ID:wQsYVdH6.net]
- ネット弁慶がイキりたかっただけでしょ
- 908 名前:デフォルトの名無しさん mailto:sage [2019/07/16(火) 16:08:47.84 ID:cpfSTA9t.net]
- >JavaScript, Python, Go, Ruby, : ["",";prop1:style1", ";prop2:style2"]
深くて理解できないことが多いが、これはやばい気がする
- 909 名前:デフォルトの名無しさん mailto:sage [2019/07/16(火) 17:23:30.54 ID:
]
- [ここ壊れてます]
- 910 名前:hAAouWtx.net mailto: 読んでるだけで何も考えてなかったけど
/(^|[@;])[^@;]*/g この書き方以外の書き方で意図した動作になるように書けないのかな ここの人はこういうの得意だからもしかしたら・・? [] - [ここ壊れてます]
- 911 名前:デフォルトの名無しさん mailto:sage [2019/07/16(火) 18:30:33.69 ID:AvaVqNzm.net]
- 一所懸命挑発的に書いてるのに全然乗ってもらえなくてかわいそう
- 912 名前:デフォルトの名無しさん mailto:sage [2019/07/16(火) 19:27:45.24 ID:hAAouWtx.net]
- 言ってることに説得力がありすぎて聞き入ってしまってたよ
どんどん言いたいことを言って欲しい 昔のdanさんを思い出すなぁ
- 913 名前:デフォルトの名無しさん mailto:sage [2019/07/16(火) 20:41:55.62 ID:bFMew56o.net]
- 入力フォーマットが正しいという前提で /@?[^@;]+/ の方が好み
そもそも正規表現使うより ; でsplitした方が良くね?とおm
- 914 名前:デフォルトの名無しさん mailto:sage [2019/07/16(火) 21:03:17.33 ID:hMJFhr7R.net]
- >>883
深くはない、単にバグってるだけ。 そしてそれはやばいどころではなく、全く話にならないレベルの物だ。使い物にならない。 例えば、図書館の蔵書をユーザーにも検索出来るようにしたとして、正規表現検索も選べるとしよう。 この場合、検索結果に現れないケースが発生することになり、使い物にならない。 プログラミング言語内の正規表現エンジンは「今までのプログラムが動かなくなる」危険があるからそうそう交換出来ないが、 図書館DBの検索フロントエンド内のエンジンなんて即交換可能なんだから、問題があればすぐ乗り換えられる。 PCREが気に入らないのならこんなところで無駄吠えするのではなく、 PCREがバグっているケース(例のタグ外側マッチとか)でもばっちり動く検索エンジンを提供して、乗り換えを待てばいいだけ。 現状、PCRE以外全部バグっているのだから救いようがないが。 JavaScriptの場合はatomエディターなる物があって、htmlやプログラムソースコードを編集出来るが、 JavaScriptの場合はreplaceもバグっているので、命中すれば、全置換しても全置換出来てないケースが発生する。 リファクタ等で変数名を変えるとき、手でやるとバグるので、当然エディタ機能で全置換させるわけだが、この場合にもバグる訳だ。 そしてユーザーはこのときに置換漏れが発生するとは全く思わないので、かなり手間取ることになる。 (atomでは対策されていると信じたい) JavaScriptの場合はこのバグも「仕様」としてしまっているので、 逆に言えば仕様通りならバグに命中したときの挙動も確定してる。だから対策は出来るが、 Rubyみたいに「実装が仕様だ」と言い張る糞言語だとどういう挙動か確認してみなければ分からず、対策が出来ない。 ここらへんもRubyの思想は数周遅れている。 いずれにしてもこんな基本的なところのバグはあっても迷惑でしかなく、さっさと直せ、でしかない。 「速い」以前に「ヒットしない」エンジンなんて使い物にならないだろ。 エンジン競争しているつもりの馬鹿共も、方向性を完全に間違ってる。 「間違いなく動作する」エンジンを提供すれば、文書検索側の人間はサクッと乗り換えてくれるだろうさ。 速い遅いはその後の話だ。
- 915 名前:デフォルトの名無しさん mailto:sage [2019/07/16(火) 21:18:41.35 ID: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 名前:デフォルトの名無しさん mailto:sage [2019/07/16(火) 22:42:20.32 ID:P37s1FHo.net]
- 一度言った内容は繰り返さなくていいです
- 917 名前:デフォルトの名無しさん mailto:sage [2019/07/17(水) 08:28:41.50 ID: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の筆者のケースでバグる。 その他バグケースも出してくれれば俺の推測で合っているかどうかは答える。
|

|