Regular Expression(正規表現) Part14 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2017/03/15(水) 02:04:35.47ID:e01p03UP
Regular Expressionスレです。

質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。

前スレ
Regular Expression(正規表現) Part13
http://echo.2ch.net/test/read.cgi/tech/1415149975/


次スレは>>980宜しく
天ぷら等2以降
2019/01/10(木) 14:50:11.25ID:Q3mhk3sM
>>772
いいねw まったく思い付きもしなかったアイデアwww
2019/01/10(木) 15:21:01.00ID:Q3mhk3sM
>>772
chrome on mac だけどブックマークではダメで、設定→検索エンジン→検索エンジンの管理→追加 から登録しないといけなかったわ。
2019/01/13(日) 18:46:07.60ID:vFHHKg45
URL(http|https)の正規表現って難しいのかね
https://mathiasbynens.be/demo/url-regex
38charsのが好きだわ
776デフォルトの名無しさん
垢版 |
2019/01/26(土) 10:17:12.64ID:rNPVIr5d
否定先読み
と言うのがなかなか理解出来ないのですが、
サンプルを動かすと確かに動作するのですが、
今一つ仕組みが分かりません。
どんなふうに理解すれば良いのでしょうか?
777729
垢版 |
2019/01/26(土) 10:42:36.00ID:K4a4emwR
文字じゃなくて位置(文字と文字の間)に一致すると考えればいい
たとえば

abcdef

が対象の場合
肯定先読み(?=def)は直後にdefがある位置(cとdの間の位置)に一致する

abc[ここ]def

否定先読み(?!def)は直後にdefがない位置に一致する

[ここ]a[ここ]b[ここ]cd[ここ]e[ここ]f[ここ]

行頭の^や行末の$も文字じゃなくて位置に一致する
778デフォルトの名無しさん
垢版 |
2019/01/26(土) 11:13:09.45ID:yVAkGzul
なるほどthx
2019/01/26(土) 11:53:37.94ID:mL4if6wW
>>777
横からだけど、否定のほうはなるほどだわ
条件を絞るつもりが広げちゃってる場合があるんだな
2019/01/26(土) 15:19:07.07ID:exLOU4gz
先読みはマッチさせたら、マッチ開始位置に戻るから、
単なる位置指定で、幅を持たない。
単なる条件を追加した、フィルター

否定先読みはマッチしない場合に、マッチ開始位置に戻る

先読みは、マッチ位置の直後の条件を指定するが、
戻り読みは、マッチ位置の直前の条件を指定する
781デフォルトの名無しさん
垢版 |
2019/01/27(日) 10:46:10.47ID:Th+zYLMn
>>777
ありがとうございました。
良く分かりました。
2019/01/28(月) 10:47:47.80ID:wg8XKdax
.netでの正規表現に迷ってます。
次の文字列のとき、"efgh/1"以降に"/"が含まれないときマッチするような正規表現を書きたいのです。
http://192.168.1.100/abcd/efgh/1  →True
http://192.168.1.100/abcd/efgh/1/ →False
http://192.168.1.100/abcd/efgh/12  →True
http://192.168.1.100/abcd/efgh/123/  →False
http://192.168.1.100/abcd/efgh/1?p=1  →True

次のような正規表現を試してみましたが、数値1文字しか対応できませんでした。
\/efgh\/[0-9]+(?!\/)
2019/01/28(月) 10:57:25.94ID:DdBbxYrt
\/efgh\/1[^/]*$
ではダメかな
2019/01/28(月) 12:18:39.25ID:c4Y7c3OH
>>783でいいと思う
あとスラッシュにエスケープは不要だから/efgh/1[^/]*$
否定先読みが使いたいなら /efgh/[0-9]+(?!.*/)
(?!.*/)はそれ以降/が含まれない位置という意味
(?!/)だと直後に/がない位置という意味だから数字が2文字以上続いたらマッチしてしまう
2019/01/28(月) 12:21:15.63ID:c4Y7c3OH
ごめん1って決まってるならこれでいいな
/efgh/1(?!.*/)
786782
垢版 |
2019/01/28(月) 15:51:48.42ID:wg8XKdax
>>783-785
ありがとうございます!
正しい判断をすることが出来ました。
数値は1以外もありえるため、次の正規表現を使います。
/efgh/[0-9][^/]*$
/efgh/[0-9](?!.*/)

>>784
正規表現の意味まで教えてもらい、本当に助かります。
今後の役に立てていきます。
2019/01/29(火) 06:11:22.47ID:mzqJgDrY
$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)
https://www.humblebundle.com/books/programming-cookbooks
2019/01/29(火) 06:32:49.85ID:mzqJgDrY
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
789デフォルトの名無しさん
垢版 |
2019/01/31(木) 16:07:48.62ID:Sc+6fvIO
誰かこの鬼雲のバグ修正PR投げてあげて

https://github.com/k-takata/Onigmo/issues/106
2019/01/31(木) 16:08:40.61ID:Sc+6fvIO
https://github.com/k-takata/Onigmo/issues/106
(?(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
2019/02/13(水) 00:35:05.11ID:HRhgNpoV
鬼雲には鬼雲を知ろうとすればするほど謎のテキストエディタの
情報が集まってくるという不思議な不具合があるがこのフィックスは不可能 :-)
2019/03/07(木) 20:57:23.09ID:sEA+6w2y
今日元号の改正の準備で日付関連のコード書いてきたんだけど
>>695の置換が出来ると便利だったなという所があった
再帰が使えるのにこれが使えないのはバランス感覚に欠ける気がします
どうしてこうなった?
2019/03/12(火) 13:14:07.01ID:vSZ9R6NM
先読みの(?=huge)をつけると、後方がキャプチャーされません

そもそも前方に文字のない?=って使い方あってるでしょうか?
ちなみに言語はVB6です
2019/03/13(水) 00:19:48.81ID:heD+eXgL
Are you japanese?
Your japan language is strange.

Please show me sample codes.
2019/03/13(水) 01:39:37.63ID:bUFEpZHr
あなたの英語も変ですよ。
日本人はJapaneseとキャピタライズしてください。
日本語もjapan languageではなくJapanese languageです。
Japaneseだけで日本語という意味になりますが、前の文で日本人という意味で使っているのでlanguageを付けるのはいい判断でした。
また最後の文は、どうしても複数の例を見たいことを強調するのでない限りcodesではなくのcodeがふつうです。
不定冠詞のaも付けません。(絶対にただひとつの例だけ欲しいのでない限り)
2019/03/13(水) 02:16:45.79ID:heD+eXgL
自分の英語力は小学生相当なのでこんなもんです
教えてくれてありがとね
797デフォルトの名無しさん
垢版 |
2019/03/13(水) 02:29:04.73ID:Z/ka/TFK
irregular expression, exactly.
2019/03/13(水) 08:53:04.20ID:heD+eXgL
I am good at irregular expression.
799デフォルトの名無しさん
垢版 |
2019/03/13(水) 14:12:32.68ID:ZUOT1OTB
nativeのひとに「あなた英語上手ですね」って言われても誉め言葉じゃないからな
その時点で下に観られてる
2019/03/14(木) 17:54:44.14ID:k53fNhgw
上手ですねと言われる可能性が0なので大丈夫です
801デフォルトの名無しさん
垢版 |
2019/04/22(月) 20:21:53.32ID:GQt1LKrG
sed
置換
1に挟まれたN個以下の0または-で構成された文字列を、同数の1で置き換える

10001→11111
100-1→11111
1---1→11111
10-0-0001→111111111

置換対象と同数の文字列で置換するというところをどう正規表現で表すかわからず、、、
よろしくお願いします
2019/04/23(火) 05:37:05.12ID:TbAsj7lM
正規表現で数を数えるのは無理
マッチさせて自力で文字を数えるコード書いて入れ替えて

ちなみに\Gが使える正規表現環境なら正規表現単独で可能
803デフォルトの名無しさん
垢版 |
2019/04/23(火) 07:05:11.04ID:k/th3sVe
>>801
sed ':r; s/1[0-]\([0-]*1\)/11\1/; tr'

前方に 1 のある 10 を 11 に置換する
置換に成功したら tラベル で :ラベル の位置に戻って繰り返す
2019/04/23(火) 08:49:46.57ID:ef59e0DS
>>801
たぶんこれだけでは不要なところを置換しそう
:a;s/1([^0\-]*)(?:[0\-])(.*)1/1$11$21/g;t a
例題をこなすのは確認
805デフォルトの名無しさん
垢版 |
2019/04/23(火) 10:21:33.54ID:yIB0exXp
>>801
100010
とか
1000101
とか
があるのか?
あった場合はどうすべきか
そこは明記しような。
謎だらけの設計書書く奴はIT向いてない。
2019/04/23(火) 11:46:04.64ID:ef59e0DS
>>805
>>804で> 100010→111110、> 1000101→1111111は確認

というかオレは前後にゴミがつくことは何ら影響がある題とは思わなかった
>>801の「1に挟まれたN個以下の0または-で構成された文字列を、同数の1で置き換える」にはその前後について言及ないから「触らない」と判断

後者を1000101→1111101で求めるかという点は気になるところ
最初の1〜1ブロックのみなのか、行中の1〜1最長一致ブロックなのか(すべての1〜1ブロックを個別処理も同一)
807デフォルトの名無しさん
垢版 |
2019/04/23(火) 12:07:17.02ID:yIB0exXp
>>806
()で囲うとなってれば入れ子のケースは当然問題になるんだから
入れ子を考慮する必要があるかを明確に定義してないのは駄目な仕様。

10-以外が現れた場合の扱いも明記されていない
→現れることはないとみなしている
んだから
100010は現れないと想定して書く選択肢もある。
いずれにしろ、不明瞭な仕様を書く奴は無能だし、
勝手に解釈するのも実際の仕事じゃトラブルの元。
2019/04/23(火) 12:23:27.03ID:ZY45SR7V
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" }
2019/04/23(火) 12:38:52.51ID:ef59e0DS
>>807
反論と取られたのかな
反論でも賛意でもないよ

個人的には>>801が「よい定義や仕様」とは欠片も思わない一方で「ダメダメ」とも思わない
組んでいく中で詳細を詰めていくことも現実としてある
あなたが求めているようながっちり仕様が決まっていたらむしろやることなんてほぼないかも
単に日本語を翻訳する作業になるのでむしろ苦痛かな…
そこまで詰められるなら日本語で指示しないで自分で書けよと思ってしまうかも

スレ的に読み替えればがっちり仕様を出した上で「これは正規表現で可能か?」という命題に繋がるのでスレでがっちり仕様を出すなと言う意味ではないです(念為)

仕事でもなし頭の体操的にてきとーに答えてるだけなんでこれくらいなら気にしない派
810デフォルトの名無しさん
垢版 |
2019/04/23(火) 13:02:53.90ID:k/th3sVe
% printf '100010\n1000101\n' | sed ':r; s/1[0-]\([0-]*1\)/11\1\n/; tr; s/\n//g'
111110
1111101
%
811801
垢版 |
2019/04/23(火) 13:49:39.47ID:CFFnqXFD
問題が曖昧であったため議論を紛糾させてしまいました。すみません。
たしかに入れ子のことや、一致する最初の文字列か、最長か、01-以外の文字の存在などを明確に記載できていませんでした。
今回の問題で聞きたかったことをシンプルに表現すると、検索文字列の文字数(1〜N個)に依存した置換が可能なのか、になります。
そこについては先の人が回答してくださった通り、文字数を記憶しておくような処理は不可能であるから正規表現の範疇ではないと思いました。
これまでの意見から当初目的ではないものの多くのヒントをもらいました。ありがとうございました。
問題提示者としていたらないながら、この話はクローズさせていただきます。
812デフォルトの名無しさん
垢版 |
2019/04/23(火) 13:52:46.13ID:yIB0exXp
>>809
反論だなんて受取ってないから妄想やめて。
定義が曖昧過ぎてねえ…
としか言ってないから。

01-以外でいいのか、1.*1でいいのか
などなど要件がこんな不明瞭じゃねえ

と言う話しかしてないのであしからず。
813デフォルトの名無しさん
垢版 |
2019/04/23(火) 13:54:41.14ID:yIB0exXp
>>809
というか、そもそもお前宛じゃないのに
なんでお前が絡んで来てるのか謎。
勝手にお前が批判されたと妄想するなよ。
2019/04/23(火) 15:45:58.43ID:ef59e0DS
>>813
> というか、そもそもお前宛じゃないのに
ふあ?
>>807(ID:yIB0exXp)で>>806(ID:ef59e0DS)に安価されてるからですよ
んーなんなんかな(´д`)
815デフォルトの名無しさん
垢版 |
2019/04/23(火) 17:14:05.07ID:yIB0exXp
>>814
>>805のことだが。
お前宛じゃないのに絡んで来たのお前だろ。
記憶喪失ワロタw
2019/04/23(火) 19:20:56.30ID:GneiHx9I
まーまー、ここはわしの顔を立てて双方おとなしくしてくれまいか。
2019/04/23(火) 19:41:58.96ID:ef59e0DS
>>815
あーきみがいいたいのはそっちか
例題をこなす正規表現を提示している>>803,804宛と捉えたんだよね
すでに>>803,804出てるのになにも提示してないでぐちぐち言ってるんで

まあ気に障ったようなので安価張って絡んだ形になったのは謝るよ
818デフォルトの名無しさん
垢版 |
2019/04/23(火) 19:46:57.33ID:yIB0exXp
>>817
>>805>>801宛だと明示してるし
>>803>>804なんてどこにも書かれていないのに勝手に勘違いされてもさあ。
どこをどう見たってお前が勝手に絡んで来てるのに
「絡んだ形」とかふざけた言い方すんなよ。
2019/04/24(水) 19:37:45.85ID:kN2xWSes
質問者の例題は数に応じた置換の簡単なサンプルが欲しくて書いたものだと思う
再帰的に無理やり導くクソコードなんて書かれても迷惑なだけでしょ
2019/04/24(水) 21:35:46.86ID:SVxlletW
端からは大人と子供
ご愁傷様
821デフォルトの名無しさん
垢版 |
2019/04/25(木) 02:00:13.99ID:nkf4NYVZ
pythonスレで似たテーマ観たからマルチ認定
2019/04/26(金) 22:15:29.45ID:pXwlHtT3
sedとpythonじゃまるで違うから別件だろうな

>>817
勘違いして迷惑かけた分際で「ぐちぐち」って言葉を使うか普通..

というかこの文体、昔セガBBSにいた南瓜さんという人にそっくりだな
別人だろうけど思い出してワロタ
2019/04/26(金) 22:34:09.92ID:7hEPz6dq
しばらくぶりにノゾいたらワロタ

ID:yIB0exXp
http://hissi.org/read.php/tech/20190423/eUlCMGV4WHA.html

平日の朝から晩まで
内容がとっても抽象的
ネット弁慶クンってホントにいるんだな!w
2019/04/26(金) 23:09:55.86ID:DINb0EDe
マ板恒例、湿度高めの展開になってきましたー
2019/04/27(土) 13:12:59.58ID:W9D3URJl
オブジェクト指向最高さんは今回まったく落ち度が無い
迷惑かけといて素直に謝ることも出来ないくそコード製造機はもう来なくていい
2019/04/27(土) 21:25:24.59ID:CxhHumup
翌日以降もこんな感じですよ
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
こちらで引き取ってもらえませんか?
2019/05/04(土) 22:49:23.33ID:Wy3P56AZ
引き取ってくれてありがとう〜(^。^)
2019/05/29(水) 23:29:43.55ID:NoMeOMsF
よろしくお願い致します。

●Regular Expressionの使用環境
Python 3.7

●検索か置換か?
検索

●説明
3つ目と4つ目のダブルクオートの間の文字列を探す

●対象データ
"文字列1":[1000:"文字列2"]

●希望する結果
文字列2
2019/05/30(木) 07:22:28.54ID:NTWA4E5y
>>828
Javaの正規表現テストサイト(*1)でしか試してないけど…
(?:[^"]*"){3}([^"]*)"

*1 https://regex-testdrive.com/ja/
2019/05/30(木) 08:48:50.22ID:ZbLZAkBS
>>829
文字列1が空だと空振るのでいっそベタ書きするかな
それと対象の規模によっては計算量も30%少なくて済む
"[^"]*"[^"]*"([^"]*)"

くどいーと思ってまとめてみても
"(?:[^"]*"){2}([^"]*)"
若干悪化して15%offくらいに留まる
2019/05/30(木) 09:14:01.64ID:js+SNbQS
やっぱり可変長の戻り読み使えないなら後方参照で抜き出すしかないよね
というか正規表現以外で抜き出した方が処理軽いんじゃ
2019/05/30(木) 10:41:49.43ID:NTWA4E5y
>>830
> 文字列1が空だと空振るのでいっそベタ書きするかな
空振るの意味がよくわからん
効率は考えてない
2019/05/30(木) 16:00:31.98ID:0UuZnvit
>>832
皆様、ありがとうございます。
>>829にてご提案頂いたものに、Pythonのエスケープシーケンスを加えて採用しました。
ほか、ご提案頂いたものも大変勉強になりました。
2019/06/12(水) 18:51:34.75ID:8qMgnvIv
正規表現で全角記号だけ抜き出す事はできますか?
★ファイル名 
みたいにして先頭に来るようにしてたんですが、全角記号はエラーおこすことがあるようです
2019/06/12(水) 20:16:21.08ID:ATCcrAWn
なんの処理系か書けよな
2019/06/12(水) 20:18:49.53ID:0U8oWwW8
使用する文字コードも
2019/06/17(月) 00:16:17.89ID:ks+4WGLz
助けてください。おながいします

●Regular Expressionの使用環境
Sakura Editor
(begonig.dll ver.3.06 with Onigmo 5.15.0)

●検索か置換か?
検索

●説明
日本語の文章の中に、全角英字が混じっています。
「全角英字の単語直後の任意の1文字」をマッチさせたいです。

(?<=[a-zA-Z]+).
でいけると思ったのですが、invalid pattern in look-behindでエラーになってしまいます。
どうもDLLの仕様で肯定後読みの式は固定文字長でなければならないらしく、代替案がないかなーと……

●対象データ
ああいいいabcうABCえおかきくけ

●希望する結果
「う」、「え」の2か所
2019/06/17(月) 02:22:40.96ID:FPrxRapn
(?<=[a-zA-Z])[^a-zA-Z]
2019/06/17(月) 06:40:06.13ID:LXSfy5ij
>>837
> 「全角英字の単語直後の任意の1文字」

> ああいいいabcうABCえおかきくけ
bcうBCえ

> 「う」、「え」の2か所
任意とは
2019/06/17(月) 21:52:38.33ID:ks+4WGLz
>>838
天才!天才!解決しました。大量に感謝
発想が . に囚われていた……勉強になります

>>839
単語というのが1文字じゃなくて英字で構成されたブロックの〜という意味でした。わかりにくくてスマソ
2019/06/18(火) 22:51:14.09ID:y1gFJJpS
ちょっとした疑問
アラビア語のような右書き言葉だと正規表現をどう書くのだろう
文字列も正規表現も右書きだから、/xyz$/ は /$zyx/ ?

(レス不要です)
842デフォルトの名無しさん
垢版 |
2019/06/19(水) 05:02:00.28ID:tVNS+22r
【出資】松本卓朗 人工知能詐欺【注意】
https://rio2016.5ch.net/test/read.cgi/rikei/1560859403/
843デフォルトの名無しさん
垢版 |
2019/06/19(水) 14:27:57.27ID:Yoy0IPRe
いし正が左らか右は語本日
2019/06/23(日) 22:51:37.03ID:WHM6Ibwm
>>834
理論上は
|
で全部やればできる


ちょうど単なる全角(
1文字が2つの幅をもつ
ロシアの言語なども2幅
)
を捉えようとしていたので道具を紹介
https://i.imgur.com/9l39lUv.jpg
正規表現は (.) で1文字を習得し
バイト数が1でないものを拾うロジック
2019/06/24(月) 06:26:17.63ID:F4CLQWNj
ttps://so-zou.jp/software/tech/programming/tech/regular-expression/meta-character/variable-width-encoding.htm
こういうので全角記号だけさっくり選ばせろって事なんだろうけど
全角半角はユニコードだとフォント依存なので曖昧
ascii 以外って意味で言ってるんだろうけど
恐らく"ファイル名"て事からSJisの範疇外の文字って事かなと
2019/06/24(月) 21:23:57.79ID:4+LiJo6+
一文字決めうち かつ あらっぽいコレクション
vim の :h digraphs には結構ある
[??????????▲△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
2019/06/24(月) 21:24:32.12ID:4+LiJo6+
[??????????▲△??▼▽??◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
2019/06/24(月) 21:24:52.95ID:4+LiJo6+
[??????????△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]
2019/06/24(月) 21:28:31.79ID:4+LiJo6+
おわった
NG word 群が正規表現を妨げる

一文字限定なら [] の処理が早い
vim の :h digraphs
には 1300個ぐらいの 記号を含むデータリストがあるから
それから組みたてやすい とおもう
2019/06/24(月) 21:56:38.71ID:meJBThiE
NGワードと文字化けの区別ができない人は書き込んじゃダメ。
2019/06/24(月) 23:17:52.70ID:4+LiJo6+
そういえばブラウザに NG word に指定したのは自分だった
あらしが記号を使ってたことがあったので
2019/06/25(火) 07:18:11.77ID:0Do2GL77
荒らしが記号を使うことと書き込みを制限することに全く関連が無い
2019/06/25(火) 08:36:20.64ID:Y04/VZ6Y
https://i.imgur.com/QA0OVK8.jpg

こう見えていたんだ
左がわひどいね ごめんね
2019/07/08(月) 00:38:09.05ID:m6vFYfK4
●Regular Expressionの使用環境
サクラエディタ(か秀丸エディタ)

●検索か置換か?
置換

●説明
不定回数のパターンを置換したい。


●対象データ
[A=a,A=b,A=c,A=d,・・・・]
・・・・の部分はどこまで続くのかは決まってない。が、多くても20個くらい

●希望する結果
A=a,b,c,d・・・・
2019/07/08(月) 05:29:01.40ID:9IE9wmRC
(?<!^)A=
856854
垢版 |
2019/07/08(月) 23:27:17.45ID:Rb/08H3f
>>855
ありがとうございます。
否定戻り読みってこうやって使うのですね。

もうちょっと深掘りして以下の場合どのようになるでしょう。
■対象データ
[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の部分が難しくて混乱しています。。
2019/07/10(水) 08:43:33.27ID:WA2fRW/e
\s++OR\s++.=
,
2019/07/10(水) 09:18:54.80ID:StxWbt+s
ここの住民の正規表現能力は超人的だ
お節介させてくれ
もし使用環境に 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
2019/07/10(水) 09:35:40.67ID:StxWbt+s
そして同じような形を処理するのに
必要な正規表現が大きく変わったりしない

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
860854
垢版 |
2019/07/11(木) 01:01:12.77ID:/KpWZOtx
>>857
すごい。。
置換できましたありがとうございます。

が、情けない話ですがなぜこういう置換結果になるのかが理解できません。
良ければどなたか解説いただけないでしょうか

>>858
ほんと、超人的ですね。。

Perlでのご教授ありがとうございます。
1度組んでしまえば汎用的に使えそうですね。
2019/07/11(木) 21:00:44.92ID:SCYCuKB+
>>860
https://github.com/k-takata/Onigmo/blob/master/doc/RE.ja
2019/07/13(土) 20:47:25.54ID:57lWPs8z
動作についての質問です。よろしくお願いします。

●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"] を得られていますが、
デバッグ中に上記に引っかかったので、分かりましたらよろしくお願いいたします。
2019/07/13(土) 23:13:26.72ID:57lWPs8z
正規表現の問題ではなくJavaScript固有の問題のようなので、質問を閉じ、
JavaScriptスレにて質問し直します。
興味のある方は以下をご覧ください。(これからすぐ投稿します)
https://mevius.5ch.net/test/read.cgi/tech/1417749547/341-
2019/07/13(土) 23:31:59.74ID:57lWPs8z
すいません自己解決しましたが一応。以下となりました。
https://mevius.5ch.net/test/read.cgi/tech/1417749547/341-342
2019/07/14(日) 04:59:50.53ID:XILHsvHP
この質問内容ならここで合ってます、jsスレよりもこのスレ向きです
正規表現には統一規格みたいなものは存在しないので環境によって動作が異なります

このスレの住民なら2番目のマッチが t から始まる環境も想定します
["","time", ";prop1:style1", ";prop2:style2"]

詳しい仕様を知らなくても動作を確認するコードを作っていろいろ試すと
どう動く環境なのかだいたい分かってしまうことが多いです
2019/07/14(日) 08:17:29.28ID:LdVrbIxu
>>865
> 正規表現には統一規格みたいなものは存在しないので環境によって動作が異なります
これは知ってますがBREの範囲だと当然間違いなく動くし、
ほぼPCREに向けて統一中、といったところなのでは?
まあやたら複雑になってバックトラッキング等の問題が発生し、
結果的に速いライブラリに収束して行っているのはいいことだと思いますが。

> このスレの住民なら2番目のマッチが t から始まる環境も想定します
> ["","time", ";prop1:style1", ";prop2:style2"]
これは一応アウトなのでは?正規表現自体はデリミタごと取り込もうとしており、それが出来ていません。
これを言うならJavaScriptもアウトですが。

個人的にはJavaScriptは面白いのですが仕様がイマイチなところが散見されるのが難点ですね。
それが初心者に無用な混乱を引き起こし、上達の妨げになっている。
今回私も数時間無駄にしましたが、これが初心者だと脱出出来なくて誤解したままになってしまう。
そして本人はそれを自覚出来ず、Web上に間違った情報を垂れ流し、馬鹿が再生産されるというループになっている。

この意味では正規表現の現在の状況も同じようなものですが、
正規表現は「実装の幅がものすごくある」と共有されているだけまだましです。
JavaScriptの連中はその間違った実装を「正しい」と思いこんでいたりするので、会話が成立しません。
といってもJavaScriptのString.matchの仕様バグを今更直すことも出来ず、未来永劫このままだと思いますが。
867デフォルトの名無しさん
垢版 |
2019/07/14(日) 10:58:08.46ID:wR6d2dgQ
PCREに向けて統一中なんてどんな根拠で喋ってんだ
regex101で試してみれば分かるけどPCRE使ってるPHP以外のPython, ECMAScript, Goは全滅だぞ
2019/07/14(日) 12:13:01.78ID:LdVrbIxu
>>867
ゴミという意味でだろ。
逆にお前はどう思ってるんだ?

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だろ。
お前は何が言いたいんだ?
2019/07/14(日) 12:35:52.54ID:QmWR+pGh
ゼロ幅で永久にマッチし続けるのになんで@timeに進めると思うの?
2019/07/14(日) 13:05:26.62ID:LdVrbIxu
>>869
お前は実装と仕様の違いを理解出来てないタイプだな。


String.matchは「マッチ全部を配列で返す」メソッドだ。
当然、無限ループなんてしてはいけない。
(ただし無限ループしない為に空文字マッチだと一文字進めるパッチだから仕様バグになってるが)

RegExp.execは「gマッチを一つずつ実行し、ユーザーがそこで適宜処理を行う」為のメソッドだ。
当然、何もしなければ順に次のマッチをしていくのが正しく、今現在のように無限ループするようでは駄目だ。
結果、今はユーザーが本来不要なコードを毎回書く羽目になってる。
具体的に言えば、 if (match!=='') が毎回必要になる。これが無駄だ。

JavaScript界隈にはお前みたいな馬鹿が多い。
本来はどうあるべきか、或いは何故この無駄なコードが必要なのか分からず、
今の「実装」が正しいと思いこんでいるタイプだ。
動かさないと分からない、あるいは動いていればいい程度のコードしか書けないからだが。
とはいえ、今回のようなケースに遭遇するとそうなるのも分かる気はするが。


いずれにしても、これはJavaScript環境固有の問題で、ここでは割とどうでもいいと思うが。
お前が正規表現として /(^|[@;])[^@;]*/g を書いたとき、全ての環境で無限ループするべきだ!と思っているのならそれでいいが、
実際はそうではないだろ?なら無駄にいちゃもんつけるなよ。
2019/07/14(日) 13:21:26.40ID:XILHsvHP
>>866
"t" からマッチは誤りでした、申し訳ない..

タグの外側だけ対象に置換する
http://www.din.or.jp/~ohzaki/regex.htm#ReplaceOutside

この記事の動作のことを言いたかったんですがうろ覚えのまま
適当に書いてしまいました、ごめんなさい
872デフォルトの名無しさん
垢版 |
2019/07/14(日) 13:28:58.74ID:wR6d2dgQ
>>868
PCREに統一中だという主張の根拠を聞いたんだがそれへの回答はないわけだ
PCREが素晴らしい実装で最初に触っとけばいいというのは同意するが, それが最良だなんてのはあり得ないし単なる妄想だよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況