17/08/14 19:13:15.73 j2odgQ2N.net
>>288
IDの有無が混在しているスレ教えて
294:デフォルトの名無しさん
17/08/14 20:33:03.02 89kehc6V.net
>>289
浪人あればID消せるんじゃなかったっけ?
ID表示スレでも?
たまに見かけるんだけど、
じゃあ、どのスレ?と聞かれてもなかなか見つからない。
すいません、見つかるまでお待ち下さい・・・
295:デフォルトの名無しさん
17/08/14 20:34:12.87 89kehc6V.net
半角文字列板でたまに見かけたような気が・・・
296:デフォルトの名無しさん
17/08/14 20:39:37.25 j2odgQ2N.net
もしくは
IDなしをNGにして、あぼーんのみ表示するとか
297:デフォルトの名無しさん
17/08/14 20:59:49.60 89kehc6V.net
>>292
すみません。今のところ該当スレが見つかりません。
目的としては、
優良エロ画像スレでたまにIDなしでグロ画像を貼る輩がいて、
IDなしのレスがほぼグロ画像ならIDなしをNGにするし、
IDなしでも優良エロ画像を貼ってくれてるならIDなしでもNGしないし・・・
という恥ずかしい理由なんです
298:デフォルトの名無しさん
17/08/14 21:00:54.22 89kehc6V.net
>>292
>IDなしをNGにして、あぼーんのみ表示するとか
これってどうやればいいんでしょうか?
299:デフォルトの名無しさん
17/08/14 21:04:32.71 j2odgQ2N.net
>>293-294
ここ正規表現スレだからJane質問スレに来て
300:デフォルトの名無しさん
17/08/21 19:05:01.74 ToOu4wDd.net
よろしければアドバイスください
●Regular Expressionの使用環境
正規表現で検索できるテキストエディタ
●検索か置換か?
検索
●説明
アンド検索で一つ目にマッチした文字列からn行以内にある二つ目の文字列までを抽出したい
●対象データ
林檎みかんバナナ
みかん林檎バナナ
林檎キウイみかん
バナナ林檎みかん
メロン林檎バナナ
メロンみかん林檎
みかんバナナ林檎
林檎みかんキウイ
林檎バナナみかん
●希望する結果
みかんバナナ
みかん林檎バナナ
林檎キウイ
301:295
17/08/21 19:05:58.56 ToOu4wDd.net
>>296の質問のつづきです
●自分で試したこと
今回は三行以内に「みかん」と「キウイ」の二つの文字列を含む部分 だけ を抽出したい
記述は以下のように書いてみたが、四行以上にまたがってマッチした部分まで抽出されてしまった
みかん([¥s¥S]*?)キウイ
●自分で試した検索ワード
「正規表現 複数行 文字列 検索 -秀丸」の組み合わせをいくつか試した
検索結果からプログラマーの質問回答サイトに飛んで似たように検索するも欲しい回答は見つからず
302:デフォルトの名無しさん
17/08/21 21:48:45.68 EQVEvxNp.net
n行なら可能だけどn行以内ってのは無理だと思う
つまり
1行の式|2行の式|…|n行の式
と書くしかないんじゃないかな
303:295
17/08/21 22:44:09.38 ToOu4wDd.net
そうですか
やはり ([¥s¥S]*?) を使うのが間違ってますよね?
レスありがとうございます
304:デフォルトの名無しさん
17/08/21 23:09:35.41 7hohe37q.net
/みかん¥S*?¥n??¥S*?¥n??¥S*?キウイ/g
とか
/みかん(?:¥S*¥n?){0,2}¥S*キウイ/g
とかかな
1~3行目と6~8行目のみかん~キウイがマッチする
305:デフォルトの名無しさん
17/08/23 21:18:57.34 a8dh4txw.net
>>297
秀丸の正規表現はしらないので一般的な正規表現で考えてみた。
試していないので間違っているかもしれないが。
みかん(.*¥n){1,3}?.*キウイ
306:デフォルトの名無しさん
17/08/23 23:01:36.58 bHZ6/xkT.net
>>301
試すといいよ
URLリンク(regex101.com)
307:デフォルトの名無しさん
17/08/23 23:56:43.55 v21fsY6g.net
できないね
秀丸はマイナス検索では?
308:デフォルトの名無しさん
17/08/24 22:00:31.43 vZuGMV9A.net
できたよ
コピペしたときバックスラッシュが別の文字に変わっていたので、
309:そこだけ入力し直したけど
310:デフォルトの名無しさん
17/10/02 15:17:50.91 uet6lO9o.net
二文字以上連続していない場合のみヒットする正規表現はどう書けばいいですか?
aを探すとして
"abc"のaはヒットする
"aabc"のaaは連続しているのでヒットしない
ということをしたいです
311:デフォルトの名無しさん
17/10/02 15:33:07.99 MBLNVziv.net
(?<!a)a(?!a)
312:デフォルトの名無しさん
17/10/02 15:50:22.85 oE42sBRL.net
aで固定って訳じゃなくて
bだけとかcだけとかも探したいのでは?
313:デフォルトの名無しさん
17/10/02 16:29:10.05 rrE28i3s.net
冷静なつっこみに受けた
314:デフォルトの名無しさん
17/10/02 17:40:05.25 G/SyJC6m.net
単に見つけるだけなら
/(.)(?!\1)(.)(?!\2)/
で出来なくもない。
しかし、見つかったときは2文字マッチするパターンなので
全部見つけたい場合はそこを考慮する必要がある。
先頭の文字は見つけられないから別途
/^(.)(?!\1)/
のようにする必要があるだろう。
言語によってはもっとうまくできるかもしれない。
でも、for 文とかで探す方がいいと思うよ。
315:デフォルトの名無しさん
17/10/02 18:33:11.59 G/SyJC6m.net
/(.)(\1)*/
でマッチした長さが 1 だったらという考え方も出来るけど、どう?
316:デフォルトの名無しさん
17/10/03 03:04:28.76 FFksRFs1.net
/^(?!.*(.)\1).*/
317:デフォルトの名無しさん
17/10/11 15:02:29.43 PTqhQudL.net
ユニコード文字プロパティから
特定の文字のみを除外した文字の集合を
簡単に書く方法はあるでしょうか?
例えば \p{C} からタブ(\t)と改行コード(\n|\r)のみ除外したもの
318:デフォルトの名無しさん
17/10/12 22:03:36.05 iUceZ3nS.net
>>312
(?![\n\r])\p{C}
319:デフォルトの名無しさん
17/10/14 07:42:21.07 sv7zl76d.net
「"」以外の文字にマッチするが「\"」ならそれにもマッチする
ってどう書けばいいですか?
320:デフォルトの名無しさん
17/10/14 08:04:06.86 Wo1S3xrN.net
>>314
([^"]|(?<=\\)")
321:デフォルトの名無しさん
17/10/14 08:38:00.26 sv7zl76d.net
ありがとうございます
知らない記号があるので勉強します
322:デフォルトの名無しさん
17/10/14 12:04:18.44 SVCVJk+z.net
正規表現を再利用したくて調べたんだができないんだな
itemcode:=/(S|T|U)\d{3}-\d{4}/
/^\s*\{itemcode}\s*$/
こういう仕様あっても全然いいと思うんだが仕様策定団体がサボったのか
323:デフォルトの名無しさん
17/10/14 12:19:47.01 2Glba8SI.net
言語やエディタの機能で補完すれば?
変数に正規表現リテラルを格納して後で使えるようにするのは正規表現の枠をこえてる
324:デフォルトの名無しさん
17/10/14 13:45:15.89 m/q/3Rhj.net
>>317
そもそも正規表現の規格の枠外やん
Perlなら
my $itemcode = q/(S|T|U)\d{3}-\d{4}/;
my $regex = qq/^\s*{$itemcode}\s*$/;
$target =~ /$regex/;
とか出来たと思うが, $itemcodeも$regexも単に文字列だしな
325:デフォルトの名無しさん
17/10/14 20:25:03.69 nyEdEfPd.net
>>317
環境によるが、pcreを使っているプログラムなら、
(?(DEFINE)(?<name>pattern)...)で定義して(?&name)で使える。つまり、
/(?(DEFINE)(?<itemcode>(S|T|U)\d{3}-\d{4}))^\s*(?&itemcode)\s*$/
326:デフォルトの名無しさん
17/10/15 12:04:10.87 xFgouCR2.net
正規表現技術入門って本買ったら初心者の入門書じゃなかった…
327:デフォルトの名無しさん
17/10/15 23:07:27.13 /4ZFGRZX.net
後方参照っどこが後方やねん、後方で参照してるってことか?
と思っていたのですが、
左から右へと文字列を舐めていくカーソルの立場から見て後ろ、
という意味ですね?
328:デフォルトの名無しさん
17/10/16 07:55:53.10 hhyAWP
329:uR.net
330:デフォルトの名無しさん
17/10/16 10:07:29.75 ZoMoe7Af.net
上から下
331:デフォルトの名無しさん
17/10/16 16:17:56.84 BvwEZWNg.net
PCRE_EXTENDEDの説明に
この修飾子を設定すると、エスケープするか 文字クラスの内部を除き、
パターンの空白文字は完全に無視されます。
とありますが、
これはどういう時に使うのでしょうか?
空白文字を無視したいなら
最初からパターンに含めなければいいだけのような気がするのですが・・
332:デフォルトの名無しさん
17/10/16 17:17:54.69 VwEzpL/B.net
>>325
改行したりして可読性を高めたい時とか
333:デフォルトの名無しさん
17/10/16 17:31:22.40 BvwEZWNg.net
>>326
可読性を上げるためのオプションですね
ありがとうございます
334:デフォルトの名無しさん
17/10/18 00:44:52.51 HJHK1SNa.net
[$]
こういう文字クラスがあった場合、これは終端と解釈されますか?
それとも文字列の$と解釈されますか?
また、[\$] だった場合は挙動が変化しますか?
335:デフォルトの名無しさん
17/10/18 01:19:34.59 GswCLlj6.net
試せば?
URLリンク(regex101.com)
336:デフォルトの名無しさん
17/10/18 01:39:24.99 HJHK1SNa.net
ありがとうございます
やはり文字列なんですね
337:デフォルトの名無しさん
17/10/20 00:50:10.62 hFePCOoH.net
過去にAutohotkeyスレで正規表現自体の質問は正規表現スレに行けとあったのでこちらで質問させて下さい(巻き添えアク禁でソフトウェア板に書き込めません)。宜しくお願いします。
●Regular Expressionの使用環境
wikiより引用
>AutoHotkeyで用意されている正規表現は、Perl 5に搭載されているものと概ね互換のPCRE(Perl Compatible Regular Expressions)である
●検索か置換か?
検索
●説明
順不同の単語群のすべてを含む文字列の最長を検索し取り出したいです
●対象データ
var := "クリスマス任意の文字列お盆任意の文字列正月任意の文字列"
pos := RegExMatch(var, "s)^(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)", $)
MsgBox, pos=%pos% $=%$%
s)の意味はシングルラインモード
posはマッチした位置
$にはマッチした全体が入ります
これですと先頭の"位置"にマッチ(pos=1になります)するのでマッチした全体$は空になってしまいます
●希望する結果
$=クリスマス任意の文字列お盆任意の文字列正月
実際は長文の一部で単語群がもっと多いです
どの文字が先頭でどの文字が最後か不明のとき、これらの単語群がすべて含まれる文字列全体を取り出すにはどのように書いたら良いでしょうか
(クリスマス|お盆|正月).+(?1)
これですと正月という単語が含まれなくてもマッチしてしまいます
338:デフォルトの名無しさん
17/10/20 02:08:00.45 yLtxI7rs.net
>>331
>これらの単語群がすべて含まれる文字列全体を取り出すには
これらの単語群って、クリスマス・お盆・正月の3単語を指してるのかな?
それならダサいけど(クリスマス|お盆|正月)を3回繰り返せば?
URLリンク(regex101.com)
339:デフォルトの名無しさん
17/10/20 02:42:11.40 GaFTw98F.net
>>331
その2を組み合わせればいいじゃん
/(?=.*クリスマス)(?=.*お?盆)(?=.*正月)(?:クリスマス|お?盆|正月).*(?:クリスマス|お?盆|正月)/
340:デフォルトの名無しさん
17/10/20 19:27:41.06 P/1hvwmS.net
2ch → 5chになったタイミングでアク禁って全解除されたと思うけど、また規制され始めたのかな?
341:デフォルトの名無しさん
17/10/20 19:58:25.65 S6VTZkXa.net
は?
342:デフォルトの名無しさん
17/10/20 20:01:26.36 GaFTw98F.net
アク禁は知らんけど、おπ規制だけは5chでは2chのを引き継いでないってことは言われてた
343:330
17/10/20 20:06:35.04 JiGfFRv1.net
>>332
すみませんでした
(クリスマス|お盆|正月)の3つの単語を全て含む文字列の最長マッチと書くべきでした
(クリスマス|お盆|正月).*?(クリスマス|お盆|正月).*?(クリスマス|お盆|正月)
では最長3単語まででお盆という単語を含まなくてもマッチしてしまいます
>>333
>その2
というのが何をさす
344:のかすみません分かりませんでした var := "クリスマス任意の文字列お盆任意の文字列正月任意の文字列お盆任意の文字列正月任意の文字列クリスマスzzzz盆zzzzz盆zzzzzzz盆zzzzzzzzzzzお盆" pos := RegExMatch(var, "s)(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)(?:お?盆|クリスマス|正月).*(?:お?盆|クリスマス|正月)", $) MsgBox,,, pos%pos% %$%, ;マッチ $=var全体 pos := RegExMatch(var, "s)^(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)(?:お?盆|クリスマス|正月).*(?:お?盆|クリスマス|正月)", $) MsgBox,,, pos%pos% %$%, ;行頭^記号ありでもマッチしました $=var全体 これでお盆が含まなければマッチせず、全ての単語が含まれるとき期待通りになりました。有難うございました ただ、対象文字列の1文字目が(クリスマス|お盆|正月)以外で始まるケースではマッチしませんでした 最初に書いたこれなら1文字目を問わずマッチするのですがやはり全体が拾えず……。 pos := RegExMatch(var, "s)^(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)", $) var := RegExReplace(var, "^.*?(?=クリスマス|お?盆|正月)", "") のように1文字目が必ず指定した単語のどれかになるように修正してから使わせていただきます お世話になりました。
345:デフォルトの名無しさん
17/10/20 20:21:51.48 GaFTw98F.net
先頭に^を付けたらダメだろ
^は文頭の位置を表す記号なんだから
346:デフォルトの名無しさん
17/10/20 20:23:53.34 JiGfFRv1.net
pos := RegExMatch(var, "s).*?((?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)(?:お?盆|クリスマス|正月).*(?:お?盆|クリスマス|正月))", $)
MsgBox, %$1%
すみませんこれで1文字目不問で取り出せました
長文失礼しました
347:デフォルトの名無しさん
17/10/20 20:27:40.74 GaFTw98F.net
何がしたいの?
>>333で要求する最長文字列を取れるはずだけど?
マッチ全体がそうなるようにしてるんだから
それとも部分キャプチャで取りたかったんなら全体を()で括るだけでいいよ
348:デフォルトの名無しさん
17/10/20 20:41:25.29 JiGfFRv1.net
説明下手ですみません
var := "zzあzzzいzzzうzzzうzzあzzいzz"
最初に見つかる(あ|い|う)のどれかから
最後に見つかる(あ|い|う)のどれかまで
かつ(あ|い|う)すべての語が含まれる文字列を取り出したかった
アク禁じゃなくスマホ回線だからかも知れません
349:デフォルトの名無しさん
17/10/20 22:48:55.52 yLtxI7rs.net
>>337
おおそういう事だったか
ちょっと難しいね
URLリンク(regex101.com)
350:デフォルトの名無しさん
17/10/21 00:17:18.52 jXM7J8Fl.net
こういうのはどうかな
(?=.*クリスマス)(?=.*お盆)(?=.*正月)(?:クリスマス|お盆|正月).*(?:クリスマス|お盆|正月)
351:デフォルトの名無しさん
17/10/21 00:21:45.84 jXM7J8Fl.net
と思ったら>>333と全く同じやんけ・・・・
これでちゃんと途中からでも欲しい部分全部拾えるでしょ?
URLリンク(regex101.com)
352:デフォルトの名無しさん
17/10/21 00:33:00.59 ZBz0JWdz.net
**クリスマス**クリスマス**正月**お盆**お盆**
だったら最初と最後の**を抜かして
クリスマス**クリスマス**正月**お盆**お盆
にマッチさせたいって話なの?
あとシングルラインモード使ってるから
複数行にわたってマッチさせたいんだよね?
↓こういうの
**クリスマス**
**クリスマス**正月**
**正月**お盆**
353:デフォルトの名無しさん
17/10/21 00:33:20.08 ZBz0JWdz.net
アスタリスク見にくいな
354:338
17/10/21 02:32:45.68 o7hEIA7f.net
>>343,344
AutoHotkey v1.1.26.01(最新) Unicode版ですがやはり先頭が別の文字列だとマッチしません
var := "zzzクリスマス任意の文字列お盆任意の文字列正月任意の文字列お盆任意の文字列正月任意の文字列クリスマスzzzz盆zzzzz盆zzzzzzz盆zzzzzzzzzzzお盆"
pos := RegExMatch(var, "s)(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)(?:お?盆|クリスマス|正月).*(?:お?盆|クリスマス|正月)", $)
MsgBox,,, pos%pos% %$%, ;pos=0 マッチしません
>>339の正規表現ならpos=1で最初に見つかるクリスマスから最後の盆まで取り出せました
>>345
その通りです>>341より分かりやすい説明が思いつきません
355:デフォルトの名無しさん
17/10/21 12:04:21.32 Awu3DWjD.net
"s)(?=((お?+盆)|(クリスマス)|(正月)))(?=.*(?2))(?=.*(?3))(?=.*(?4)).*(?1)"
>>347
気持ち悪いから試してみた
"s)(?=盆)盆"→マッチする
"s)(?=.*?盆)盆"→マッチしない←?!?!
"s).(?=.*?盆)盆"→する
"s)(?=.)(?=.*?盆)盆"→する
"s)(?:)(?=.*?盆)盆"→する
s)と(?=.*の間に何かを挿めば何故か回避できそう?
"s)(?:)(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)(?:お?盆|クリスマス|正月).*(?:お?盆|クリスマス|正月)"
356:338
17/10/21 17:14:22.52 o7hEIA7f.net
>>348
すごい!>>347のvar文字列に対しpos=4で最も理想的な形でとれました!
pos := RegExMatch(var, "s)(?=((お?+盆)|(クリスマス)|(正月)))(?=.*(?2))(?=.*(?3))(?=.*(?4)).*(?1)", $)
MsgBox,,, pos%pos% %$%, ;pos=4 $=最初のクリスマスから最後の盆
s)^(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)
この正規表現の出所はスマホアプリ板2chmate質問スレのテンプレにあるNGワードで
2chmateのシングルラインモードは(?s:ここに正規表現)と書くようです
その辺のやりとりが過去スレ
URLリンク(itest.5ch.net)
357:9/893-n にありました >893 >複数のワードを全て含む書き込みをNG >(?s:^(?=.*ワード1)(?=.*ワード2)(?=.*ワード3)) >これがどうしても分からん(なぜワードの順番を入れ換えてもマッチするのか) > >895 >ワード1を先読みしてそれを含む^にマッチ >ワード2を先読みしてそれを含む^(?=.*ワード1)にマッチ >ワード3を先読みしてそれを含む^(?=.*ワード1)(?=.*ワード2)にマッチ > >896 >例えば「(先頭)あいうえお」という文字列に^(?=.*うえお)でサーチかける場合 >^(?=.*うえお)は「.*うえお」が続く^のみにマッチするから「うえお」を含む「(先頭)」にマッチ >つまりこれを何度やっても^に戻ってくる >で、先読みがどこかで失敗したらそこで成立しなくなるというカラクリ
358:338
17/10/21 17:15:24.33 o7hEIA7f.net
s).*?((?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月)(?:お?盆|クリスマス|正月).*(?:お?盆|クリスマス|正月))
AutoHotkeyシングルラインモードでは正規表現の先頭に「^」が有っても無くても先頭からマッチするので
.*?(?=.*?お?盆)(?=.*?クリスマス)(?=.*?正月) ;<----ここで先頭にマッチ(1)
(?:お?盆|クリスマス|正月) ;<----先頭に続く最初に見つかる(?:お?盆|クリスマス|正月)のどれかにマッチ(2)
.*(?:お?盆|クリスマス|正月) ;<----(2)に続く最後に見つかる(?:お?盆|クリスマス|正月)のどれかにマッチ(3)となるようです
s)と(?=.*?の間に最短0文字表現を入れないとマッチしないのはもしかしてバグなんでしょうかね
359:デフォルトの名無しさん
17/10/24 15:16:03.89 5n0ye5v7.net
すみません。
自分で書いた正規表現が期待通り動いたのですが理由が分かりません。
どなたか解説お願いします。
Notepad++の置換で、こんなデータに対して
<abcde> <hijk>
<abc> <XYZ>
<dfg>
検索文字列 (?:\s*<([^<>]*)>)?\s*<([^<>]*)>
置換文字列 [$1]\t[$2]\r\n
で置換して、結果がこうなりました。
[abcde] [hijk]
[abc] [XYZ]
[] [dfg]
この三行目の動作なんですが、一行に一個しかデータが無い場合には、二番目のデータとしてキャプチャしたかったので
この動きで良いのですが、なぜこれが出来たのが分かりません。
検索文字列の一つ目の丸カッコの (?:・・・)? <== この量指定子?がそう言う動作になるのでしょうか?
そうだとしたら、なぜそうなるのでしょうか?
あるいはもっと簡潔なパターンはありますか?
宜しくお願い致します。
360:デフォルトの名無しさん
17/10/24 15:43:41.40 JVoqQJo1.net
$1と$2が存在するという前提で置換しておきながら$1は?で消えるかもと指定してるから
$1が無いパターンにマッチしたと判断された(適当)
361:デフォルトの名無しさん
17/12/01 00:01:15.16 J9gYbH6z.net
Spam Mail Killerの正規表現についてすみませんがご教示ください。
メールアドレスに同じドメインのアドレスを複数(たとえば3個以上)含む、という場合
例えばですが
abc@uvw-xyz.com, defg123@uvw-xyz.com, hi456@uvw-xyz.com
このようなアドレスをひとくくりに探し出すにはどのようにすればいいでしょうか?
##/(?=.*@uvy-xyz\.com){3,}/km
とやってみましたがうまく動きませんでした。
正規表現って難しい・・・
362:デフォルトの名無しさん
17/12/01 00:27:29.48 lY+8fymW.net
(.+?@uvw-xyz.com){3,}
363:デフォルトの名無しさん
17/12/01 00:37:36.11 J9gYbH6z.net
>>354
ありがとうございます。
対象アドレスが2つでも反応してしまいました(´・ω・`;)何故だー
364:デフォルトの名無しさん
17/12/01 01:38:11.93 4kQewCo+.net
([\w\d._-]+?@uvw-xyz\.com, ){2,}[\w\d._-]+?@uvw-xyz\.com
冗長だけど、とりあえずこれならどのアプリでも動くはず
365:352
17/12/01 03:23:10.36 J9gYbH6z.net
>>356
ありがとうござます。ばっちりでした。
ひとまずはこれで運用してみようと思います。
366:デフォルトの名無しさん
17/12/01 14:56:42.38 GNYmtVXo.net
([\w\d._-]+?@uvw-xyz\.com(,\s?)?){3,}
メールアドレスに注目するなら、これでもいいかな
367:デフォルトの名無しさん
17/12/01 15:03:45.52 GNYmtVXo.net
スペースのパターンも考慮すると、こちらのほうがいいかも
([\w\d._-]+?@uvw-xyz\.com(,\s*)?){3,}
368:デフォルトの名無しさん
17/12/01 19:07:13.56 lDYRmGG1.net
拘り始めるときりがない
複数の記述方法があるしそれで制限も変わる
URLリンク(ja.m.wikipedia.org)
軽く「正規表現 メールアドレス」でググればメールアドレスを糞まじめに正規表現で頑張る意味がないのが頭の5個も読めば理解できるでしょ
依頼者がとりあえず解決したと言ってるんだからこれ以上は現状不要だよ
369:352
17/12/01 23:13:24.55 J9gYbH6z.net
みなさんありがとうございました。
書き方も拘りだしたらきりが無いというのはよくわかりました。
記述がすっきりしていて動作も問題なかったので >>359 の方法でいってみます。
370:デフォルトの名無しさん
17/12/02 07:41:29.80 dQK/O/Fy.net
>>360
最初に与えられた条件の中で、単に冗長な表現をシンプルにすることは、
限界事例を前提するような拘りというのとは違うと思うけどな。
371:デフォルトの名無しさん
17/12/02 09:41:49.64 mi+Z/zsa.net
>>361
横槍だけど358は最初に与えられた条件(3回出現)と違って3回“連続”出現だから留意してね
そして\wは\d_を含んでいるからまだ冗長だ、ついでに+?の?も{3,}の,もシンプルじゃないね
最初の質問の=を:にするだけでよかったと思うよ
^(?>.*?@uvy-xyz\.com){3}
372:デフォルトの名無しさん
17/12/02 10:25:05.48 hDsQS9Tu.net
依頼者が充足宣言してるのにね
373:デフォルトの名無しさん
17/12/02 10:49:44.12 SQFbqxvb.net
正規表現の難しいところは引き際。いろんな意味で。
374:デフォルトの名無しさん
17/12/02 20:04:53.17 aLfswfyL.net
質問がメインのスレじゃないんだから、
探究することは悪いことじゃないよ。
375:デフォルトの名無しさん
17/12/02 20:22:17.17 P9eUjlcX.net
なにいってんだこいつ?
1
> 質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。
2 質問テンプレ
376:デフォルトの名無しさん
17/12/02 20:32:56.34 +fOAFawt.net
> 質問する場合は
 ̄ ̄ ̄ ̄ ̄ ̄
377:デフォルトの名無しさん
17/12/02 22:11:28.09 oKFwf0E4.net
ほとんど質問がルートのレスツリーばかり
テンプレも質問がらみばかり
引き際誤るとここまで人はみっともなくなれるのか
378:デフォルトの名無しさん
17/12/02 22:44:47.63 1qjImk2p.net
自己紹介乙
379:デフォルトの名無しさん
17/12/02 23:58:10.96 NhirO4Ud.net
引き際重要
380:デフォルトの名無しさん
17/12/10 08:22:53.66 DxswVEqC.net
Google Apps Scriptで、下記の時系列データを配列で取得したいのだけど、どうしたら良いですか?
URLリンク(www.morningstar.co.jp)
381:デフォルトの名無しさん
17/12/10 17:27:12.44 UOQUQi73.net
どこまでやりましたか
382:デフォルトの名無しさん
17/12/10 18:40:59.63 DxswVEqC.net
あとは正規表現のとこだけです。
<tr>
<td class="center">12/08</td>
<td class="center">169</td>
<td class="center">17</td>
<td class="center"> </td>
<td class="center">26</td>
</tr>
383:デフォルトの名無しさん
17/12/11 00:06:26.95 4q7JrCp0.net
jQuery のセレクターを使え
$('td.center').text()
384:デフォルトの名無しさん
17/12/11 01:01:11.97 06if4WxO.net
>>374
正規表現よりHTMLパーサ使えってのは>>374に同意するがjQueryは外部HTMLをパース/操作するものではない
URLリンク(sites.google.com)
この辺参考にするのがいいんじゃない
385:デフォルトの名無しさん
17/12/11 07:53:34.73 HLwn5MaC.net
急にHTMLパーサなんて言われてもチンプンカンプンやわ
386:デフォルトの名無しさん
17/12/11 09:34:01.52 78kXJ+6a.net
すぐできるだろうと思って泥沼にハマることが多いわ、こりだすとキリがないわで、あきらめどころが難しいのが正規表現。
自分の中で制限時間(10分など。忙しさによる)を設けて、
それ以上時間がかかる場合は正規表現による解決するのをあきらめるってのが、運用上は合理的だろうね。
正規表現そのものの学習・調査をしたい場合は、もちろん違うが。
このスレの客層はどっちなのってことなのかな。
387:デフォルトの名無しさん
17/12/11 14:24:59.19 HLwn5MaC.net
jQueryやらHTMLパーサやら能書きばっかり
正規表現で出来たから、もうええわ
388:デフォルトの名無しさん
17/12/12 00:30:19.52 u8BojTW8.net
>>376
>jQueryは外部HTMLをパース/操作するものではない
なんでよ?
389:デフォルトの名無しさん
17/12/14 17:08:16.97 lv6L9acp.net
Perl互換ですが,
ファイルの先頭から末尾までをマッチさせる,つまりファイルのテキストを全部取得するにはどう書いたらいいのでしょうか?
390:デフォルトの名無しさん
17/12/14 17:36:18.19 lv6L9acp.net
解決しました
([\s\S]*)で出来ました.
391:デフォルトの名無しさん
17/12/16 03:31:44.42 ArLhqftT.net
正規表現は構文解析器(parser)じゃないから、
XML, HTML のように、文書に構造があるものは解析できない。バグる
例えば、コメント部に、
<td
と書かれていても、正規表現では該当してしまう
それに要素間に、祖先・子孫などの関係があって、入れ子構造になるから、
開始・終了タグが一致しない
392:デフォルトの名無しさん
17/12/18 22:01:18.38 fLY/8wUq.net
バックスラッシュt、でいいやろ
393:デフォルトの名無しさん
17/12/18 23:20:44.39 LMSHu3dl.net
正規表現でできることできないことの見極めが難しい。
うまくできない原因が、自分の未熟によるものか、そもそも誰がやろうが無理なのか、という見極め。
これは正規表現に限った話でないが、正規表現を使っていると遭遇することが非常に多い。
394:デフォルトの名無しさん
17/12/18 23:31:28.83 Xb/4cQMD.net
自分が使ってる範囲で使えるものか完璧を目指すかで違ってくるよ
395:デフォルトの名無しさん
17/12/25 17:59:18.23 9hKP95Nk.net
もはや姓のサイトウ(斉藤、齊藤など)に適した検索方法って正規表現ぐらいじゃね?
プレス発表 「文字情報基盤整備事業」で推進していた漢字6万文字の国際規格化が完了:IPA 独立行政法人 情報処理推進機構
URLリンク(www.ipa.go.jp)
396:デフォルトの名無しさん
17/12/25 18:01:37.66 9hKP95Nk.net
というか外字だとマルチプラットホーム対応した検索アルゴリズムを作ることが困難だったので、国際規格化されただけまだマシか。
397:デフォルトの名無しさん
17/12/25 22:40:21.08 8yZmKHLj.net
ユニコードなので特に何かに限定されない
ZWSPやZWJなどの方が地獄
URLリンク(anti.rosx.net)
398:デフォルトの名無しさん
18/01/02 13:30:58.99 bFwGimBi.net
新年おめでとうございます
スマホアプリで正規表現を使いたくて調べたレベルで恐縮です
'\s'は空白文字だそうですが半角スペースのみを表現できないでしょうか?
また'/'を用いて半角スペースを表す方法はありませんでしょうか?
宜しくお願い致します
399:デフォルトの名無しさん
18/01/02 19:00:49.45 I9szCE3x.net
何故その程度ググらない?
半角スペースはそのまま半角スペースだ
400:デフォルトの名無しさん
18/01/02 20:13:20.96 bFwGimBi.net
>>391
半角文字ばかり調べて盲点でした
ありがとうございました
401:デフォルトの名無しさん
18/01/06 20:03:46.61 eEPcZWZ
402:O.net
403:デフォルトの名無しさん
18/01/06 20:08:09.69 eEPcZWZO.net
●対象データ
△△hostname:△hogehoge.com改行
△△△△hostname:△mogemoge.com改行
△hostname:△192.168.1.1改行
のようにスペースが入っています。
Janeでカキコするとスペースが消えたので補足します。
404:デフォルトの名無しさん
18/01/06 21:13:44.07 RuMnMvof.net
ホスト名の条件が分からんからドメイン名と同等と仮定する
マルチラインモードで
^\s*(?:[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?:[^\S\x0A\x0D]*((?:[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?)$
としてグループ1のキャプチャを見る, とか
つうかVBAなら正規表現で頑張るより改行文字と:でそれぞれsplitしてループ回しながらtrimするのが自然だと思うけど
405:デフォルトの名無しさん
18/01/06 22:13:51.90 eEPcZWZO.net
>>395
なるほど、hostnameを検索して後読みするのではなく、
ドメインで合致させつつ、IPアドレスを除外するというわけですね。
理解のために改行してみました。
^\s*
(?:[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])
?:[^\S\x0A\x0D]
*(
(?:[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])
?)$
のうち、
[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])
がドメイン、
[^\S\x0A\x0D]
がIPアドレス除外ですね。
私もVBAならInstrとMIDを駆使したほうが可読性も生産性も上がると思うのですが、
過去のC#とPerlの正規表現コードを再利用しつつ、将来的にはPythonとかにも応用できるように
正規表現でがんばれ、との指示を受けたのですが、
いきなりVBAでは後読みできないとか、まわりに有識者のいない罠にはまり難儀しています。
406:デフォルトの名無しさん
18/01/06 22:25:41.73 RuMnMvof.net
> がIPアドレス除外ですね
違う
\Sは空白文字以外だから[^\S\x0A\x0D]は空白文字以外とCR, LFの「何れでもない」場合, つまり空白文字からCRとLFを除外したもの
そもそも(先頭が英字でなければならない)ドメイン名でマッチングしてるんだから先頭が数字で始まるIPアドレスを後から除外する必要はない
再利用性に関しても, 後読み出来るエンジンかそうでないかで既に失われてるんじゃないかね
キャプチャの取得方法なんぞ言語ごとに大分違うしな
仕事で使うなら尚更メンテし辛い上に遅い正規表現を使わにゃならん積極的理由は無い
splitでループ回せば入力のサイズに対して線型時間で終わることが保証される上に保守性も高い
407:デフォルトの名無しさん
18/01/07 12:17:55.91 ln22xrzP.net
>>393
ここでドメイン名文字種チェックせにゃならんの
IPアドレスではないで判断でけんの
408:デフォルトの名無しさん
18/01/10 23:41:51.90 qa5Jh8Cf.net
>>398
現仕様だとまさにIP除外なんだけど、123.comとかが入ってくるので、あとで除外しているという。。
>>397
今日、やっと開発場所で試しました。
ドメインは見事マッチしました!が、
△△domain:△hogehoge.com改行
の行までマッチしてしまうので、
^\s*
(?:[A-Za-z]~
のところを
^\shostname:*
(?:[A-Za-z]~
にしてみましたが、今度はすべてマッチしなくなりました。
スペース連続shostname:*を除外したつもりなんですが…
409:教えてくだされ。
410:デフォルトの名無しさん
18/01/11 10:30:10.40 Xo4biI2J.net
^[△]*hostname:[△]*([0-9.]*[A-Za-z\-][0-9A-Za-z.\-]*)$
^[△]*hostname:[△]*([0-9.]*[^\s0-9.]\S*)$
hostname:△mevius.5ch.net
hostname:△86886.jp
hostname:△日本語.jp
hostname:△はじめよう.みんな
411:デフォルトの名無しさん
18/01/11 12:30:44.58 /99JjIqr.net
>>399
要件は満たしたつもりだが, その行がマッチしちゃならん理由は?
それともキャプチャの意味が分かってないのか?
412:デフォルトの名無しさん
18/01/11 13:56:21.29 /99JjIqr.net
>>399
あと申し訳ないけど, 正規表現を全く理解してないよね?
何でその書き換えで除外出来たと思ったのか教えてくれる?
413:デフォルトの名無しさん
18/01/11 17:51:18.77 WzsJRajU.net
あぁ, hostnameは固定文字列なのか
なら
^\s*hostname:[^\S\x0A\x0D]*((?:[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?)$
だけど
414:デフォルトの名無しさん
18/01/16 12:15:21.97 RA24ssqp.net
正規表現の書き方教えてください。
CentOS 7のサーバーにURLを要求した際、下記のような余計な文字が付きます。付くことがあります。
/ディレクトリ/ファイル名.拡張子%01
/ディレクトリ/desktop.inib%01
/ディレクトリ/desktop.inie%01
またファイル名の後に、
%EE%81%9F%E2%81%80%EE%81%97%C9%84とか
%E6%89%B8%E7%A8%B7%E4%99%BA%E5%A5%97%E3%8D%95%E4%BD%8C%E6%A1%B2%01とか
ファイル名の語尾に不特定の文字が勝手に付く場合もあります。
ディレクトリを要求したときも
ディレクトリの語尾に%E4%84%B7など(これも不特定)が付いてしまうことがあります。
これを除外するには、
正規表現でどのように書けば良いのでしょうか?
よろしくお願いします。
415:デフォルトの名無しさん
18/01/16 13:31:33.72 y9BMfGeo.net
URLリンク(social.technet.microsoft.com)
コレか?
URLエンコード文字だけなら簡単だがASCIIが入るとなると容易ではない(どこまでがファイル名か判別出来ない)
クライアント側のアップデートを待つ方が賢明な気がする
416:デフォルトの名無しさん
18/01/16 13:45:59.33 y9BMfGeo.net
あと忘れてたけどWebDAVならクライアントにWinSCP使うとか
417:403
18/01/16 14:48:31.79 RA24ssqp.net
ありがとうございます。
自分の場合「空」にはなってませんが似てますね。
便利なクライアントアプリケーション探してみます。
418:デフォルトの名無しさん
18/01/16 17:00:43.44 1yOH1J8J.net
pattern = /^(.*)(?!%)/
p pattern.match('abc%123')
Ruby で否定先読みを使ったら、「abc」だけ取れない。
すべての文字列にマッチしてしまう
なんでやねんw
419:デフォルトの名無しさん
18/01/16 17:14:43.11 G8V+pnDB.net
なんでやもなにも、.* だから全体にマッチするよ。1文字ごとにチェックするか、文字クラスを使いなさい。
420:デフォルトの名無しさん
18/01/16 18:31:44.93 1yOH1J8J.net
Ruby では、先頭から、% を探して、それ以降を削除する
str = '/dir/desktop.inib%01%EE%81'
pos = str.index('%')
if pos
str = str.slice(0...pos)
end
puts str
結果
/dir/desktop.inib
421:409
18/01/16 19:25:09.57 1yOH1J8J.net
正規表現でも、できた。
Ruby では、先頭から、% 以外の文字を探す
pattern = /^[^%]+/
str = '/dir/desktop.inib%01%EE%81'
puts pattern.match str
結果
/dir/desktop.inib
422:デフォルトの名無しさん
18/01/16 20:18:43.79 y9BMfGeo.net
要件には書いてないけど, .iniまでが正しいファイル名だと思うよ
その後ろのbとかeもゴミ
423:デフォルトの名無しさん
18/01/16 22:39:12.31 9E60uHWe.net
どういう法則性でb,eが付いたのかがわからないと、
b,eの他にも付くのがあるのか、また付かないこともあるのかもわからん
例えば、hoge.exee%01とかになるのか?
424:403
18/01/17 15:18:31.78 BVJUZk9+.net
皆さんありがとうございます。
>>413
それ以外にも幾つか変な文字の時もあり、
問題なく何も付かない時もあります。
決まったパターンは無いと思った方が良いですね。
すべてが1byte文字の時は
425:413
18/01/17 17:17:53.77 BVJUZk9+.net
最後に変な文章を残してしまいました。
すべてが1byte文字を要求するときは、
そんな変なゴミは付きにくいと書こうと思ったのですが、
まだ確証が無いので無視して結構です。
426:デフォルトの名無しさん
18/02/07 23:42:01.50 3vNjEx0B.net
●Regular Expressionの使用環境
桜エディタ(テキストエディタ)
●検索か置換か?
置き換え
●説明
文字数、文字種はいろいろです。ただしすべて半角(1バイト文字)です。
結果として、<>内の文字だけにできればどんな方法でも構いません
必要な情報かわかりませんが、<>の外には、<>があることはありません。
asqa>w3e<a>s98<as897kja> ←こんな感じの行はありません。
行末は必ず、>で終わり、必要な文字は必ず<>でくくられたものの中にあります。
いらない文字<必要な文字>ここに改行が入る という書式は絶対です。
●対象データ
R&^&*(!TYUIKM<slihfd>
BA%(*&%ASAS<asdlikh>
TF^(VB(*&N<a09sfyighkljn>
●希望する結果
slihfd
asdlikh
a09sfyighkljn
よろしくお願いいたします。
427:デフォルトの名無しさん
18/02/08 00:23:12.83 kN+YdVUy.net
^[^<>]*<([^<>]+)>$
$1
428:デフォルトの名無しさん
18/02/08 23:06:15.86 VxK8nSc/.net
[^<>^] サンクス
429:デフォルトの名無しさん
18/02/08 23:24:13.78 Zisu4Ynz.net
>>417
ありがとうございます。うまく抽出できました。
430:デフォルトの名無しさん
18/02/08 23:37:41.58 kN+YdVUy.net
このぐらいの正規表現なら基本だし, 覚えると正規表現の載ってるエディタでの編集が楽になるよ
とりあえずPerl互換を勉強してみるといい
431:デフォルトの名無しさん
18/02/14 13:35:37.03 2LP2x+pK.net
C#なんですが
[ああ]おおおおお
[いいい]こここここ
[うう][ええ]そそそそそ
ととととと[たた]
↓
おおおおお
こここここ
そそそそそ
ととととと[たた]
にしたいんですが、どうしたらいいでしょうか。
※先頭じゃない文中の[はは]は残したい
432:デフォルトの名無しさん
18/02/14 17:41:06.84 ZzaOqvDP0
^\[.*\]
433:デフォルトの名無しさん
18/02/16 13:56:45.89 uX7uVTrc.net
\[[^\]]*?\](?!$)
ところによっては\[[^\]]*?\](?!(?:\n|$))
434:デフォルトの名無しさん
18/02/16 14:10:38.80 ga78Zu+3.net
マルチラインモード
^(?:\[([^\[\]])\1*\])+
マッチ部分を除去
435:420
18/02/16 14:11:39.72 CWd36B/o.net
1行目でバッチリ
感動しました!!!
436:デフォルトの名無しさん
18/02/16 14:15:41.25 CPKH/1dQ.net
それ文末以外消えるけどええのん
437:421
18/02/16 15:30:22.93 mPXTHkFg.net
>>426
文中は消えていいんじゃない?
>>421に
> [うう][ええ]そそそそそ
> そそそそそ
ってあるし
あ、
> ※先頭じゃない文中の[はは]は残したい
この[はは]はマッチしたらダメなのか
これ例の中においてくんないかなー
というか定義がよくわからんちん
^\[.*\](?!$)
ところによっては(?<=(?:^|\n))\[.*\](?!(?:\n|$))
マッチ
[ああ]おおおおお
[いいい]こここここ
[うう][ええ]そそそそそ
[たた]ななはは[まま]やや
→[たた]ななはは[まま]
[たた]ななははまま[やや]
→[たた]
アンマッチ
ととととと[たた]
ちち[はは]ぱぱまま
438:421
18/02/16 15:30:54.45 mPXTHkFg.net
>>427
[たた]ななはは[まま]やや
の[まま]を含めずマッチしたい([たた])ならかなり複雑になりそうでちょっといますぐは思いつかないや
それってつまり
行頭[
行頭から括弧が繋がり、且つ、行末]を含めない範囲
なら
439: [たた][なな][はは][まま][やや] のマッチが →[たた][なな][はは][まま] でいいのか、それとも行そのものがアンマッチなのかよーわからんし
440:デフォルトの名無しさん
18/02/16 15:55:42.80 CPKH/1dQ.net
>>427
カッコ内も同じ文字が重なるように読めるしなー
まぁこういう仕様をちゃんと書けるならそもそも正規表現で困らんのだろうけど
441:デフォルトの名無しさん
18/02/16 15:57:06.09 CWd36B/o.net
orz...
試したら確かに
>>424 だと先頭が残りますネ
442:デフォルトの名無しさん
18/02/16 16:00:32.77 CWd36B/o.net
すみません
[ああ]おおおおお → おおおおお
[あああ]おおおおお → おおおおお
[ああ][いい]おおおおお → おおおおお
あああああ[いい] → あああああ[いい]
あああ[いい]うう → あああ[いい]うう
です。
先頭付近の [] は消したいけど、それ以外は残したい、って風です。
443:421
18/02/16 16:24:42.64 rLsYeXBU.net
>>431
[たた]ななはは[まま]やや
は?
[たた][なな][はは][まま][やや]
はどーなんの?
[あいう[かきく]たちつ]
[あいう[かきく]]たちつ
とか括弧内包の場合どーなんのとかも
あと行末も係わるんだから、例の同じ行に余計な文字列入れないで(たぶんこの件では大過ないと思うけど)
444:421
18/02/16 16:25:23.31 rLsYeXBU.net
>>432
内包無視するとしたら
(?<=^)(?:\[[^\[]*?\])+(?!$)
ところによって(?<=(?:^|\n))(?:\[[^\[]*?\])+(?!(?:\n|$))
かね
>>431を満たし、
[たた]ななはは[まま]やや
→[たた]
[たた][なな][はは][まま][やや]
→[たた][なな][はは][まま]
となるし
たぶん
行頭[ および 行頭[に対応する]までマッチ
行頭[ および 行頭[に対応する]から括弧が繋がり、且つ、行末] および 行末]に対応する[までを含めない範囲
あたりなんだろうなー
ぱっと思いつくのはちょめちょめしたダウンロードファイルのリネームをしたいようなかんじかね
445:デフォルトの名無しさん
18/02/16 16:26:09.97 dBpGhFbZ.net
仕様に不備があると作る方は大変だな
446:デフォルトの名無しさん
18/02/16 17:00:58.65 Q4bZpk0j.net
正規表現の使いどころってどんなところですかね?
普通レベルのプログラマから見ると可読性低くて保守性も悪い気がする
タグの要素を最初にバッと配列に入れやすいとか?
447:デフォルトの名無しさん
18/02/16 17:11:19.84 GgVv8IsN.net
>>435
可読性低くて保守性も悪いっていうのは本当にその通り
プログラミングで使うならまずは(正規表現が非常に直感的でない限りは)正規表現以外の選択肢を考えるべきで, それが可読性や保守性を上げないとなった上で正規表現が選択されるのがよい
勿論保守性や可読性を気にしないワンライナーとかであれば気にする必要はないが
あとはエディタやgrepなんかだと他に有力な選択肢がないから正規表現になる
448:デフォルトの名無しさん
18/02/16 17:18:48.02 h4N2NTdR.net
単純に、
(?m)^\[.*\](.*)
じゃだめなん?
449:デフォルトの名無しさん
18/02/16 17:23:34.33 GgVv8IsN.net
>>437
全然ダメ
入力が
[abc]def[ghi]
なら全文がマッチする(量化指定子*はgreedyだから末尾手前まで全部食う)
450:デフォルトの名無しさん
18/02/16 17:34:31.04 dBpGhFbZ.net
>>435
実行環境によってだけどコンパイルされて速くなったりするので
さくっと一行で書けるならメリットはあるよ
プログラム書いた方が良い場合もある
ケースバイケース
451:デフォルトの名無しさん
18/02/16 18:30:54.06 Q4bZpk0j.net
>>436
>>439
レスサンクスコ
今Pythonで作られているパッケージを保守してるんだけど、お約束のように最初に正規表現で抜いて後で編集してる
最初のパフォーマンスを考慮してるのかもだけど、読みにくくて一般人にはいいことないよ
452:デフォルトの名無しさん
18/02/16 19:13:24.69 M8XJLm2H.net
>>435
ワンライナーで可読性保守性とか気にしない
ストリームエディタで検索、ログの抽出が最たる用途じゃないか
453:デフォルトの名無しさん
18/02/16 20:46:56.42 d9VDf+sb.net
>>421
$# 「行頭部分にある 1 個以上の \[[^\]
454:*\] を削除」と初見で思ったのだが、違うのか? $# それとも C# でどうやるかわからないという話? 申し訳ないが C# は知らない。 $ $cat a_in [ああ]おおおおお [いいい]こここここ [うう][ええ]そそそそそ ととととと[たた] [ええ]あああ[いい]うう $perl -pe 's/^(\[[^\]]*\])+//' < a_in おおおおお こここここ そそそそそ ととととと[たた] あああ[いい]うう $perl -0777 -pe 's/^(\[[^\]]*\])+//gm' < a_in おおおおお こここここ そそそそそ ととととと[たた] あああ[いい]うう $
455:デフォルトの名無しさん
18/02/16 21:24:08.90 nYHQACKk.net
>>438
Non-greedy(最短)なマッチ使えばいいだけじゃね?
使えない環境なの?
456:デフォルトの名無しさん
18/02/17 05:30:35.08 xZfN9pA3.net
何を望んでいるのかを明確にする方が先かと……
457:デフォルトの名無しさん
18/02/17 11:13:15.50 sN1lrGX4.net
>>443
none-greedyじゃ先頭しかマッチしない
[abc][def]ghi
の[abc]しか除去出来ない
反復適用すればいいというならその通りではあるが
458:デフォルトの名無しさん
18/02/17 11:27:08.57 IU1gsQgu.net
[ab][cd][ef]ああ
これは、繰り返しが入っている。
N回削除する必要がある
[ab][cd][ef]ああ
[cd][ef]ああ
[ef]ああ
ああ
[~] でグループ化すべき
459:デフォルトの名無しさん
18/02/17 12:22:01.47 IU1gsQgu.net
/^\[[^\]]*\]/ =~ "[ab][cd]ああ"
$& #=> [ab]
Ruby で書いた。
行頭が\[ で、\[ 以外の文字が、0以上続いて、\] がある
460:デフォルトの名無しさん
18/02/17 12:32:03.69 IU1gsQgu.net
/^\[[^\]]*\]/ =~ "[ab][cd]ああ"
$& #=> [ab]
$' #=> [cd]ああ
/^\[[^\]]*\]/ =~ $'
$& #=> [cd]
$' #=> ああ
/^\[[^\]]*\]/ =~ $'
#=> nil
Ruby で書いた。
行頭が\[ で、\[ 以外の文字が、0以上続いて、\] がある
$& はマッチした部分で、$' はマッチした部分の後ろを表すから、
マッチを繰り返していけば、出来るけど
461:デフォルトの名無しさん
18/02/17 12:42:57.33 IU1gsQgu.net
/^(\[[^\]]*\])+/ =~ "[ab][cd]ああ[ef]"
$& #=> [ab][cd]
やったー。Ruby で出来た
\[ があり、\[ 以外の文字が、0以上続いて、\] がある。
これをグループ化して、1回以上繰り返す
ただし、グループ外に、先頭からを指定する
462:デフォルトの名無しさん
18/02/18 07:04:41.40 4dAbe4pu.net
正規表現で使用される記号があるとワケわからなくなってくるから
適当な記号、例えばQなどに置き換えて試行錯誤して最後に元の記号に戻したりする
463:デフォルトの名無しさん
18/02/18 11:53:19.92 QWcmX5lk.net
余計なバックトラックを防ぐために
$s = qr/(?>\s*)/
ってやってパターンに埋め込むことならある。
464:デフォルトの名無しさん
18/02/23 22:29:48.73 vtIXFjR6.net
(?s:^(?=.*ス)(?=.*プ))
CHmateで使う正規表現らしいんだけど最初の
(?s:"
の意味が検索してもわからないのですが教えていただけないでしょうか
465:デフォルトの名無しさん
18/02/23 22:45:42.10 0zsudQHR.net
>>452
シングルラインモード
>>349
466:デフォルトの名無しさん
18/02/24 00:35:55.07 bvxyjlLF.net
>>453
ありがとございます
確認してなんとなく分かりました
ところでこの正規表現の場合(?s:)って名前には改行はないので不要じゃないかと思ってしまうのですがどういう目的で使われているのでしょうか
467:デフォルトの名無しさん
18/02/24 01:37:05.64 d6NztqhC.net
書いたヤツの趣味じゃ?
しかもかなりてきとう
ワッチョイ名前ならおそらくドコモ判別?でもプだけではないスレリンク(mango板:312番)
先読みなんてコストかけなくてもKOROKORO AAはSd固定
改行を無理矢理入れ込んでというシチュエーションでスとプでねらい打ちも違和感
本文で^(?=.*A)の類を使うとレス数後半のコストはかなりのもの
これは名前だから大したことにはならないけど
深謀遠慮があるのかも知れんがそれこそ書いた本人へ
468:デフォルトの名無しさん
18/02/27 15:54:44.12 2v1tH105.net
C#で、
var rgx = new Regex("(.)+");
var str = "こんにちは。";
Console.WriteLine(rgx.Replace(str, "$1"));
とすると「。」が出力されるのですが、なぜですか?
$1は「。」になるのですか?「こ」だと思ったのですが、違いますか?
469:デフォルトの名無しさん
18/02/27 16:08:59.77 u9k8VAiO.net
>>456
理由はここ読んで
URLリンク(www.regular-expressions.info)
短い説明は↓ここでも出てくる
URLリンク(regex101.com)
470:デフォルトの名無しさん
18/02/27 17:03:18.46 VEiALCIH.net
どれどれ…
javascript
'こんにちは。'.replace(/(.)+/, '$1');
=> "。"
ほんまや!知らんかった
471:デフォルトの名無しさん
18/02/27 19:34:07.35 LuvO3mbW.net
>>457
配列に入れてくれればいいのに
って思ったことあるわ
472:デフォルトの名無しさん
18/02/27 21:09:42.50 PLAOSS1/.net
Ruby でも、
'こんにちは。'.gsub(/(.)+/, $1)
#=> "。"
473:デフォルトの名無しさん
18/02/27 22:02:02.32 u9k8VAiO.net
>>459
.NETはCaptureCollectionってのに入れてくれるみたいよ
ただフルマッチとキャプチャリンググループと両方1度に必要なければ
/(.){1}/みたいに正規表現変えれば配列に入れられるよね
474:デフォルトの名無しさん
18/02/28 21:03:30.09 V9ixSdqS.net
>>457
すみません。
教えて頂いたサイトを見ても分かりません。
簡単に解説をお願いしたいのですが。
475:デフォルトの名無しさん
18/02/28 22:05:09.20 pxJOkH76.net
単純に最後にマッチした部分ってことじゃないかな。赤ラクダにそう書いてある。
C# は知らない。誰か翻訳してあげて。
476:デフォルトの名無しさん
18/03/01 00:07:23.55 UkKloD3U.net
>>462
キャプチャグループに量指定子がついてるとそのキャプチャグループの箇所に複数回マッチする可能性があるよね。
んで複数回マッチした場合は最後にマッチしたやつがそのキャプチャグループに入ってるってこと
"こんにちは。”に対して、/(.)+/でマッチをかけると
最初にピリオドが“こ”にマッチしてそれをグループ1に入れて
次に+を見てまたマッチするか繰り返す
今度はピリオドに”ん”がマッチするからそれをグループ1に入れて、、、
あとは繰り返し
“こんにちは。”が/(.)+/にフルマッチした時点でグループ1に入ってるのは”。”
477:デフォルトの名無しさん
18/03/01 00:17:03.42 ikcjc59H.net
/(.+)/ =~ 'こんにちは。'
$1 は、'こんにちは。'
/(.)+/ =~ 'こんにちは。'
$1 は、'。'
上は、1回しかマッチしていない、最長マッチ。
下は、1文字のマッチで、6回マッチして、最後のマッチが、'。'
478:デフォルトの名無しさん
18/03/01 00:55:21.78 UkKloD3U.net
>>465
うーん、1文字マッチで6回マッチするのはどっちも同じじゃない?
キャプチャグループに入れる回数の違い
479:デフォルトの名無しさん
18/03/01 02:58:48.22 ksBcbegD.net
>>464
なるほど。
480:デフォルトの名無しさん
18/03/01 05:29:23.47 AobHbkwq.net
詳細 ○○表現
尼での評価がよかったので買ってみたが全然
リファレンスにもならない
やっぱり海外の訳本はだめだ、すくなくとも自分には良書でなかった
481:デフォルトの名無しさん
18/03/01 15:52:15.50 UkKloD3U.net
フクロウ本のことかな
中の仕組みを理解するための本であって
リファレンス本でも入門書でもないからね
482:デフォルトの名無しさん
18/03/02 09:24:29.36 O5NS5hyG.net
>>466
そういうマッチャー自分で作る時はスキップするよう作るけど
正規表現エンジンはしないのか
複雑だとやってられないとかか
483:デフォルトの名無しさん
18/03/02 13:01:46.53 btKfsNEv.net
試しに
for pat in '([cd])+' '(.)+' '.*(.)' ; do perl -Mre=debug -e '$pat = shift; print "abcd" =~ /$pat/ ,"\n" ;
484:' "$pat" ; done ってやってみた。最適化してそうだ。.*(.) は意味的には同じだと思うがバックトラックの分だけ不利。 Perl のソースコードを確認したわけではないので断定はしかねるが。
485:デフォルトの名無しさん
18/03/03 08:34:43.98 ooAwkD9v.net
今はサンプルだからいいけど
長大な文章じゃスキップで最適化しないとやってられないよな
486:469
18/03/03 13:47:58.16 GJwmn3yF.net
個人的には (.)+ と書くべき理由が思い当たらない。
487:デフォルトの名無しさん
18/03/04 15:44:40.85 QUMop1Gl.net
正規表現とギターの速弾きが出来る奴は賢いと尊敬している
488:デフォルトの名無しさん
18/04/06 19:38:34.22 U5C29TI1.net
複数のSQL文の書かれているSQLファイルから、DBの処理単位でSQL文を逐次取り出す正規表現が書きたいのですがどうしたら良いですか?
厳密なものでは無くても良くて英文字から始まってセミコロンで終わるというもので良いのです。
ただ、SQL分は行頭から始まるとは限らず、セミコロンの直後に次のSQL文が始まったり、空白文字などがあってからSQLの文が始まったりすることもあります。
また、文中に出てくるエスケープされたセミコロンや文字列中のセミコロンは文末の対象になって区切られては困るのでそれはスキップして評価がしたいです。
489:デフォルトの名無しさん
18/04/06 22:09:42.71 witjIkkr.net
文字列の内外を判断するの難しい・・・・難しくない?
490:デフォルトの名無しさん
18/04/07 12:21:20.06 BRhgC8GS.net
multilineのオプション付けて
;でsplitしただけじゃだめなん
491:デフォルトの名無しさん
18/04/07 12:23:00.56 BRhgC8GS.net
>>476
それが含まれる時点で無理に正規表現一行で書くのはいつもあきらめる
492:デフォルトの名無しさん
18/04/07 12:30:00.76 LBmouzwW.net
ちゃんとやるなら文字列中のエスケープされたシングルクォートとかも処理しないとダメだし正規表現でやるのはすごく大変だと思う
493:デフォルトの名無しさん
18/04/07 12:57:57.77 wQfk+GMe.net
正規文法ではかなり厳しい印象で, BNFの管轄だと思うおよね
494:デフォルトの名無しさん
18/04/08 06:27:09.85 1mmlbc0v.net
1. ; で分割して、配列に入れる
2. 配列の各要素から、余分なものを削除する
2 のルールを、厳格に決めればよい
Ruby で作る方が速い
495:デフォルトの名無しさん
18/04/08 11:04:16.11 YK+KPtHu.net
正規表現は置いといて
DB用意して""で囲まれた部分をテキストとしてDBに入れながらID取得
本文側はIDに置き換える
あとは正規表現を使っても使わなくてもいいが;で分割
最後にまたID部分に元のテキストを流し込む
496:デフォルトの名無しさん
18/04/08 13:00:20.92 .net
そこであきらめんなよ!
正規表現だけで乗り切ろうという気概を見せろよ!
497:デフォルトの名無しさん
18/04/08 13:08:05.41 wO4VFvVz.net
(シングル|ダブル)クオート文字列って正規言語で表せる範囲にあるんかね?
文脈自由言語では表せるけど
498:デフォルトの名無しさん
18/04/08 13:27:19.00 aPw27k7Z.net
どの正規表現がつかえるのかがわからん
環境を明示してくれないとなー
499:デフォルトの名無しさん
18/04/08 18:18:43.83 1mmlbc0v.net
/\"([^\"]*)\"/ =~ 'a"bc"d'
$1 #=> bc
"~" で、~には、" 以外の文字列が入る
500:デフォルトの名無しさん
18/04/08 18:28:48.48 aPw27k7Z.net
"のエスケープや'もあるし
'a"b\"c'd"e'
501:473
18/04/09 10:33:55.69 Q+cYQrXX.net
沢山ご回答ありがとうございます。
皆さんのご意見を伺った限り、やはり正規表現一本では難しそうですよね…
はじめは前処理で既成のsqlパーサなどを通して、きれいに整形して別ファイルに保存してから処理する方法も検討していましたが、
できれば現物ファイルを生のまま読み込んで正規表現でなんとか行けないかなと思い試行錯誤していて、
うまい書き方が全然できなくてここに書き込みさせて頂いた次第です。
>>485
使用できる正規表現はPCREです。
具体的にはPHPで省メモリで巨大なSQLファイルを実行する仕組みが作りたくて
相談させてもらいました。自分の頭の中のアイデアでは
1.fileをbufsize分readして
2.正規表現でマッチするかチェック
3.マッチしていたらそのSQLを実行。マッチした文より、先の部分は次の実行のためにバッファに積んで1へもどる
4.マッチしていない場合は更にbufsize分read、2->4を繰り返す。
こんなイメージでした。
それを鑑みると、>>482さんのアイデアはちょっとありかなとも思います。
スレ違いなっちゃいますが、regexを使わずプログラム上でクオートの始まりと終わりを正しく
処理できれば随分楽できそうな気がします。一考の余地ありですかね?
502:デフォルトの名無しさん
18/04/09 12:10:15.13 M/BmQ9Z1.net
"'", "\""
'"', '\''
クォーテーション内にクォーテーションがある、入れ子状態が難しい。
クォーテーションを、\ でエスケープしたりもあるし
XML Parser とか、プログラム実行の命令木とか、解析ツールを使わないと無理。
プログラミングで何とかできる、範囲を超えている
そもそも、入れ子状態にどういうパターンがあるのか、
全列挙して考えるのが、非常に難しい
入れ子の入れ子とか、再帰的に入れ子するかも知れないし
503:デフォルトの名無しさん
18/04/09 17:17:14.98 4vJW9Ikj.net
>>488
こういう感じでどうだろう
[a-zA-Z](?:\\"|\\'|[^"';]|(["'])(?:\\\1|(?:(?!\1).))*(?<!\\)\1)*;
英数字で始まって、\"や\'は許す;で終わる文字列
頭に^\s*を付けたほうがいいかもしれないけど
文字列は、" ' "、' " '、" \" "、' \' 'は許す( ; もOK)
ところで、" ' " ' "とは書けるんだっけ?
こういう括弧のネストが可能なら、正規表現の方もネスト構文や条件構文を使わないといけないけど
(俺は使ったことはないけど)
504:デフォルトの名無しさん
18/04/09 17:44:25.66 4vJW9Ikj.net
ただし↑は、コメント文はないものとしてのこと
505:デフォルトの名無しさん
18/04/09 19:00:46.18 4vJW9Ikj.net
さっそくダメだった
"\\"
506:デフォルトの名無しさん
18/04/10 00:21:39.82 oEQHPFsL.net
仕様を確定させるのが難しい。
単なるテキストには、ルールが無いだろ
XML とか、プログラム言語には、仕様があって、
ルール違反の書き方を許さないから、プログラムで判定できる
だから、まずこう書いたらエラーにする、という仕様を決めるべき
507:デフォルトの名無しさん
18/04/10 01:17:02.18 IM3kTV8x.net
>>493
URLリンク(ronsavage.github.io)
こいつのcharacter string literalとか読め
ちゃんと規格化されてるんだからさ
その上で正規表現で書くのは難しいって話
508:デフォルトの名無しさん
18/04/11 13:14:45.93 p/bo/Ju1.net
試しに Perl でやってみた。最も楽観的な想定ならこのくらいまでは手抜きできる。
use strict;
my $comment = qr/(?:--.*?\n)/ ;
my $literal_ch = qr/(?:\'\'|[^\'])/ ;
my $ch_str_literal = qr/(?:\'(?>$literal_ch*)\')/ ;
my $other_ch = qr/[^\';]/ ;
my $some_str = qr/(?:$comment|$ch_str_literal|$other_ch)/ ;
my $statement = qr/(?:$some_str*;)/ ;
my $text = '';
while (<>){ $text .= $_; while ( $text =~ s/^$statement// ){ print("Found:$&\n") }}
文字列リテラルの中の文字の記法に特に対処すべき拡張があるなら $literal_ch に加えれば良い。
" は識別子を書くためのものだが '、;、-- のどれかが入る可能性があるなら $other_ch と $some_str に加えればいいだろう。
多分、問題はそこではない。この例では行単位の入力だから面倒な問題を回避できているが、そうでない場合の問題だ。
たとえばコメントの始まりの - までしか読まれていないという場合。もっと読まなければコメントかどうか判断できない。
あるいは文字列リテラルの中で ' が現れた場合。それは文字列リテラルの終わりなのか、それともリテラルの ' を表す '' の 1 文字目なのか。
こういう処理を自分で書くのは難しくはなくても面倒だし、処理速度も遅い。だから結局 flex を使ったりする。
509:デフォルトの名無しさん
18/04/11 14:19:31.82 jfPKheqL.net
仕様通りのParser とか、構文解析ツールが必要
それらを使って出力された、抽象構文木を使うのがよい
510:デフォルトの名無しさん
18/05/04 19:16:13.25 kVAlpXQV.net
★タイトル
★★タイトル
上のものにマッチさせたいのですが、
^★.*$
としてしまうと、下まで含まれるのですが、どうしたらいいでしょうか
511:デフォルトの名無しさん
18/05/04 19:36:12.61 eD01Afe2.net
>>497
^★(?! ★).*$
512:495
18/05/04 21:14:35.89 L0LZvRGB.net
半角SP紛れ込んだわ
^★(?!★).*$
513:デフォルトの名無しさん
18/05/05 05:47:27.14 iaqxNbgL.net
↑解答どうも
できなかったです
ちなみにmeryというテキストエディタの正規表現です
何の言語かはわかりませんが
514:デフォルトの名無しさん
18/05/05 06:26:09.87 O3up5M1Q.net
URLリンク(regex101.com)
鬼雲みたいだし動くと思うんだけど, 先頭とか末尾に余計なスペース入ってない?
515:デフォルトの名無しさん
18/05/05 19:07:12.77 iaqxNbgL.net
↑ありがとうございます。行けました。
.*の前に否定を入れればいいんですね
516:デフォルトの名無しさん
18/05/05 21:57:45.66 +tF+3NSL.net
鬼雲…だと…?!
517:デフォルトの名無しさん
18/05/07 13:28:13.91 XtvW294Z.net
正規表現をちゃんと論理的に導きたいと思って参考になる本を
買ったら必要な予備知識に群とか環が出てきて即諦めた
正規表現周りの開発をしてる人達はすごい人達なんだなぁ
すごさを直で実感出来た
518:デフォルトの名無しさん
18/05/07 14:59:22.19 QMgv+0U5.net
用語に慣れてないだけだろ
やってることは大したことじゃない
519:デフォルトの名無しさん
18/05/07 18:08:31.65 XtvW294Z.net
まぁ膨大な時間と労力をかければ自分にも分かるんだろうけど
現実的じゃないんだよなぁ(人の何倍も時間かかるだろうし)
これからは正規表現技術者の努力に感謝しながら正規表現を
使おうと思います(^^)>
520:デフォルトの名無しさん
18/05/14 07:31:45.21 0PI4I4+g.net
JavaScriptによる正規表現チェッカー
くっそ長いので短縮
URLリンク(goo.)<)
o54++44Oe44OD44OB44OG44K544OIICovXG5cbi8vIOato+imj+ihqOePvlxudmFyIHJlID0gbmV3
521:IFJlZ0V4cCgv XFxkKy9nKTtcblxuLy8g44OG44Kt44K544OIXG52YXIgdGV4dCA9IChmdW5jdGlvbiAoKSB7LypcbmFhYVxuYmIx MmJcbmM1NjdjYzg5XG4qL30pLnRvU3RyaW5nKCkuc3BsaXQoL1xcbi8pLnNsaWNlKDEsLTEpO1xuXG5jb25zb2x lLmxvZyhcIlJlZ0V4cDpcIiwgcmUudG9TdHJpbmcoKSlcbmNvbnNvbGUubG9nKFwiVGV4dDpcIiwgdGV4dCk7XG5c bnRleHQuZm9yRWFjaChmdW5jdGlvbihsaW5lKSB7XG4gICAgY29uc29sZS5sb2coXCJsaW5lOlwiLCBsaW5lKTtcbiA gICB2YXIgcmVzdWx0ID0gbGluZS5tYXRjaChyZSk7XG4gICAgaWYocmVzdWx0KVxuICAgICAgICBjb25zb2xlLmxv ZyhcInJlc3VsdDpcIiwgcmVzdWx0KTtcbiAgICBlbHNlXG4gICAgICAgIGNvbnNvbGUubG9nKFwicmVzdWx0OlwiLCBcIm51bGxcIik7XG59KVxuIn0
522:デフォルトの名無しさん
18/05/15 21:31:31.85 xchMEgzc.net
ちょっと修正
URLリンク(goo.) gl/M2Fn68
523:デフォルトの名無しさん
18/05/19 02:57:37.83 F73VBvr9.net
Linuxに触れるまで正規表現に方言があるなんて知らなかった
基本正規表現だの拡張正規表現だの
vimの置換で悩んでたら原因がエスケープの有無が原因とかもうね
ある程度は使えるが先読みとか後読みとか僅かでも深入りすると余計に混乱する
524:デフォルトの名無しさん
18/05/19 11:08:45.44 rxs2hai/.net
小さい世界で囲い込まれてれば楽だよな
ただし何かの拍子ではみ出した時に世界の広さを知って己の無力さを痛感する
よくあるパターン
525:デフォルトの名無しさん
18/05/23 19:28:29.89 Au5e7VGg.net
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
QBPEH
526:デフォルトの名無しさん
18/05/24 10:47:44.54 cPlRxlDn.net
QBPEH
527:デフォルトの名無しさん
18/05/25 13:52:01.06 X/Hngdv+.net
HTMLの解析を正規表現でやりたいのですが
<a href="xxxxx"><img src="yyyyy" /></a>
という風に、<a> で括られた img の src だけを抽出したいんですけど
どうしたらいいのでしょう。
<a> で括られてない
<img src="yyyyy" />
は除外したいのです。
528:デフォルトの名無しさん
18/05/25 13:53:08.12 X/Hngdv+.net
あ、すみません
<a href="xxxxx"><img src="yyyyy" /></a>
<a href="xxxxx">あああ<img src="yyyyy" /></a>
<a href="xxxxx"><img src="yyyyy" />いいい</a>
<a href="xxxxx">あああ<img src="yyyyy" />いいい</a>
<a href="xxxxx"><img src="yyyyy" /><div>あああ<div></a>
みたいに、<a> の中は <img> 以外のゴミも入ってきます。
※ゴミは無視したい
529:デフォルトの名無しさん
18/05/25 14:10:36.40 dgrSTrid.net
>>514
^<a\b.+<img src="([^"]+)".+</a>$
↓
$1
530:デフォルトの名無しさん
18/05/25 16:20:05.07 fgSfMucA.net
>>515
<a href=""></a><img src="1.jpg"><a href=""></a>
531:デフォルトの名無しさん
18/05/25 20:00:28.32 OUvr9ihJ.net
頑張ってみてもこの程度が限界
URLリンク(regex101.com)
で, >>513がHTMLの解析を正規表現だけでやる理由は何だ?
Pythonのhtml.parser, RubyのNokogiri, PHPならGoutter, それ以外の言語でも間違いなくHTMLパーサは誰かしら作ってる
そんな中で何故正規表現だけで?ぶっちゃけこういう用途には向いてない, というかHTMLの構文規則は正規言語を超えるんだけど, 分かってる?
532:デフォルトの名無しさん
18/05/25 20:29:09.95 rhJz1xPv.net
パーサかましてXPathで
533:必要な情報だけ抜くのが基本だしな どうしても使えないっていう理由があるなら仕方ないけど
534:デフォルトの名無しさん
18/05/25 21:21:37.93 lQiYp+1p.net
鬼雲限定
<a (?~</a>)<img src="([^"]+)"[^>]*>(?~<a )</a>
535:デフォルトの名無しさん
18/05/25 22:28:52.14 Cqv+6nk2.net
■変更前
004a34
A521n2
785b66
■変更後
0049934
99521992
7859966
----------------------
数値以外を99に置換したいです
お願いします
536:デフォルトの名無しさん
18/05/25 23:31:17.71 gd/oxjVv.net
木構造のものは、正規表現じゃ無理
1< 2< abc 3> 4>
2<からの最短マッチで、対応する3>を取れるけど、
1<からの最短マッチで、対応する4>を取れない。
3>にマッチしてしまうから
1< 2< 3< abc 4> 5> 6>
これでも、2<と5>をマッチさせられない。
最長・最短マッチでも、マッチしない
CSS セレクターを使う、jQuery, RubyのNokogiri などを使え。
これらの使い方は、ほぼ同じ
537:デフォルトの名無しさん
18/05/25 23:43:29.83 OUvr9ihJ.net
>>520
数値以外と簡単に言うが改行文字や空白等の扱いはどうするんだ
変換対象文字をちゃんと明示しないと
/[^0-9]/99/g
こんなもんが欲しいわけではあるまい
とりあえずASCII印字可能文字に限るなら
/[\x21-\x2F\x40-\x7E]/99/g
だが当然マルチバイト文字は対象外
538:デフォルトの名無しさん
18/05/25 23:44:35.69 OUvr9ihJ.net
\x40じゃなくて\x3Aだわ
539:デフォルトの名無しさん
18/05/26 10:42:28.41 oqQZJpqn.net
>>519
非包含オペレータか
540:デフォルトの名無しさん
18/05/26 17:59:00.22 xbMfHZm2.net
>>521
再帰を使えば、対応する括弧のネスト対応ぐらいならできるらしいよ(鬼雲、PCRE)
<([^<>]++|(?R))*>
# [^<>]++は(?>[^<>]+)としてもよい(どっちもバックトラックしないと思う)
# (?R)は、(?0)とも書ける
# (<([^<>]++|(?1))*>)
\g<-n>を使ってもできる(鬼雲だけ?)
(<(?:\g<-1>|[^<>])*>)
# \g<-1>は(?-1)とも書ける
# ここでは\g<-1>を先に書いたが上と同じく後ろに書いても同じ
541:デフォルトの名無しさん
18/05/26 19:07:35.21 vUfk79H6.net
URLリンク(regex101.com)
なぁこれメンテしたいか?というか出来るか?なぁ?
(?i:<a(?:\s+[a-z][a-z0-9]*(?:=(?:"[^"]*"|'[^']+'))?)*>)
((?:
(?i:<img(?:\s+(?:src="([^"]+)"|[a-z][a-z0-9]*(?:=(?:"[^"]*"|'[^']+'))?))*(?:\s*\/)?>)
|(?i:<([a-z][a-z0-9]*)(?:\s+[a-z][a-z0-9]*(?:=(?:"[^"]*"|'[^']+'))?)*>(?1)<\/\3>)
|(?i:<[a-z][a-z0-9]*(?:\s+[a-z][a-z0-9]*(?:=(?:"[^"]*"|'[^']+'))?)*\s*\/>|.*?))*)
(?i:<\/a>)
542:デフォルトの名無しさん
18/05/26 19:08:54.60 vUfk79H6.net
アップデートするの忘れてたわ
URLリンク(regex101.com)
543:デフォルトの名無しさん
18/06/23 01:47:09.94 19kQ7FFf.net
のりこめー
【IT】プログラマーが正規表現を使いこなすメリットとは?
スレリンク(bizplus板)
544:デフォルトの名無しさん
18/06/24 13:33:59.68 wSHpLaLO.net
文字列の中から数字13桁(それ未満でも超えてもNG)を抽出するにはどうしたらいいでしょう
JANコードらしきを抜き取りたいのです。
候補を抽出してから後でチェックデジット計算しますので
数字13桁のみで大丈夫です。
545:デフォルトの名無しさん
18/06/24 15:06:08.45 F1zD07yq.net
数字40桁くらい連続してたらどうする?
546:デフォルトの名無しさん
18/06/24 16:56:18.47 wSHpLaLO.net
40桁はJANコードじゃないので除外したいです
547:デフォルトの名無しさん
18/06/24 17:16:44.02 1DBcJ9cD.net
\b[0-9]{13}\b
とか
(?<![0-9])[0-9]{13}(?![0-9])
とか
携帯だから試してない
548:530
18/06/24 20:41:43.34 LPLL+qJx.net
先頭と末尾も考慮すると
URLリンク(regex101.com)
549: (?:(?<=[^0-9])|^)[0-9]{13}(?:(?=[^0-9])|$) ただかなりバックトラックするから性能は悪い どうせチェックディジット確認するなら13桁以上で全抽出して桁数チェック追加した方がマシに見える https://regex101.com/r/xT760t/4 [0-9]{13,}
550:デフォルトの名無しさん
18/06/24 23:39:40.09 chBT6m1a.net
結構、難しい
A <13桁の数字> B
A の部分が、文字列の先頭か、数字以外で、
B の部分が、文字列の末尾か、数字以外
551:デフォルトの名無しさん
18/06/25 07:16:09.30 HTnjHonA.net
文字列操作可能なら両端に数字以外の文字を付加して
[^0-9][0-9]{13}[^0-9]
かな
552:デフォルトの名無しさん
18/06/25 08:32:20.35 g3low2hV.net
>>533
先読み後読みは先頭や末尾にも一致するからそういうのは無駄
>>532の二つ目で完成している
553:デフォルトの名無しさん
18/06/25 09:21:19.58 9/L2g6Oc.net
>>536
せやな, 否定前後読みならそのままでよかったわ(肯定で試しちゃった)
ただどのみちバックトラック多くて無駄だから正規表現だけでやるのでなければ13桁以上でマッチングして桁数判定入れるべきだと思う
554:デフォルトの名無しさん
18/06/25 21:12:44.36 lRi8bnr9.net
13桁を超えていても候補として受け取っておいて
チェックデジットの計算の手前で落とします。
どうもありがとうございました。
555:デフォルトの名無しさん
18/06/26 18:51:05.99 PFtq6YS9.net
文字列の先頭の文字以外を*に変換する
というのはどう書けばいいでしょうか?
556:デフォルトの名無しさん
18/06/26 20:16:27.74 IMFKH44M.net
こういうこと?
$perl -pe 's/(?!^)./*/g'
alpha
a****
beta
b***
gamma
g****
$
良い方法かどうかはわからないが。
557:デフォルトの名無しさん
18/06/26 20:22:51.32 IMFKH44M.net
perl -pe 's/(?<!^)./*/g'
とすべきだったかな。
558:デフォルトの名無しさん
18/07/04 22:06:49.23 gFgZc5FG.net
J1Q
559:デフォルトの名無しさん
18/07/05 16:31:37.58 AeL6VB/V.net
J1Q
560:デフォルトの名無しさん
18/07/16 14:08:24.67 80hpbb9v.net
1 2 3 の3つの文字を、順番不同で、必ず各々、1つ以上含む
a23b1 → 真
1a2 → 偽
これは順番の組み合わせだから、正規表現で出来ますか?
561:デフォルトの名無しさん
18/07/16 14:41:45.67 /+vnEc6c.net
>>544
先読みが使えれば
^(?=.*1)(?=.*2)(?=.*3)
562:デフォルトの名無しさん
18/07/25 19:56:10.60 1XdhMp/e.net
サクラエディタで
<>で囲まれていないaaaをあああにしたいです
<aaab>aaa<caaadaaa>baaadeaaa<ccc>baaad<baaa>aaabaaadaaa<ee>
↓
<aaab>あああ<caaadaaa>bあああdeあああ<ccc>bあああd<baaa>あああbあああdあああ<ee>
>([^<>a]*?)(aaa)([^<>a]*?)<
>$1あああ$2<
だと「>aaa<」や「>baaad<」は置換できるけど「>baaadeaaa<」や「>aaabaaadaaa<」が置換できずに残る
そこで
>([^<>a]*?)(aaa)([^<>a]*?)(aaa)([^<>a]*?)<
>$1あああ$2あああ$3<
と変換するわけですが当然「>aaabaaadaaa<」が残り…
<>に囲まれていないaaaが沢山あるので変換しきれません
何とかならないでしょうか
563:デフォルトの名無しさん
18/07/25 20:31:56.63 AmPlbSPQ.net
[]内のa取っ払って
ぜんぶ変換できるまで何回もやったら?
(>[^<]*?)aaa([^>]*?<)
564:デフォルトの名無しさん
18/07/25 20:46:43.74 AmPlbSPQ.net
aaa(?=[^>]*<)
前後に必ずタグがあるならこれなら一回
565:デフォルトの名無しさん
18/07/26 09:15:37.25 4NbdqkDU.net
>>547>>548
できた!できました!
ありがとうございます
566:デフォルトの名無しさん
18/07/29 09:53:04.64 JxpitKP8.net
●
パターン1, (\d+)月(\d+)日
パターン2, (\d+)月(\d+)数字以外(\d+)日
これを一回で取得したい
●対象データ
7月1日
7月2~4日
7月6から10日
7月12・13日
●希望する結果
7,1
7,2,4
567: 7,6,10 7,12,13 お願いします
568:デフォルトの名無しさん
18/07/29 10:18:20.53 kCYuy8BN.net
取得って何だよ変数に入ればいいのか置換結果として取得したいのか
569:デフォルトの名無しさん
18/07/29 10:49:28.56 TzC7zb5n.net
>>550
ほんまにそれが希望する結果?
数字とりだしてるだけなんだけど。
570:デフォルトの名無しさん
18/07/29 10:59:44.43 JxpitKP8.net
取り出すだけでいいです。
571:デフォルトの名無しさん
18/07/29 11:42:16.30 kCYuy8BN.net
数字取り出して変数に入れるだけなら /(\d+)月(\d+)(?:\D+(\d+))?日/gu で仕舞いだが
572:デフォルトの名無しさん
18/07/29 11:45:23.47 JxpitKP8.net
>>554
完璧です。
ありがとうございました。
573:デフォルトの名無しさん
18/07/29 11:49:24.17 kCYuy8BN.net
変数にキャプチャしたいのか置換で取り出したいのかくらい書こうな
574:デフォルトの名無しさん
18/07/29 11:57:08.75 JxpitKP8.net
失礼しました
575:デフォルトの名無しさん
18/08/12 20:55:52.79 MOc1ccj1.net
C#で正規表現を使ってHTML内から文字コードをとってきたいのですが
以下の場合だと"UTF"としか取得できません。
"UTF-8"と取得する場合どうすればいいでしょうか?
<[^>]*\bcharset\s*=\s*[""']?(?<charset>\w+)\b
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
576:デフォルトの名無しさん
18/08/12 21:30:40.27 mMH07JtW.net
>>558
HTMLは扱いが難しいからパーサ使った方がいい
どうしても正規表現だというなら,
1. とりあえず的な修正
URLリンク(regex101.com)
/<[^>]*\bcharset\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)")\b/$1$2$3/i
2. もう少し気合の入れた修正
URLリンク(regex101.com)
|<meta
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*
(?:\s+charset(?:\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)"))?)
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>|$1$2$3|i
ぐらいか
でもこれ後で読むのしんどいでしょ
577:デフォルトの名無しさん
18/08/12 21:47:08.19 L571MbNB.net
>>559
神だ
578:557
18/08/12 21:53:09.85 mMH07JtW.net
2.の方を若干修正, charsetには値が必要ですわ
URLリンク(regex101.com)
|<meta
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*
(?:\s+charset\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)"))
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>|$1$2$3|i
579:デフォルトの名無しさん
18/08/12 22:00:37.17 MOc1ccj1.net
>>559
ありがとうございます!
当方がやりたかったことは、HTMLをテキストデータとして大量に取得して、その中から特定のワードでの絞り込みです。
正しい文字コードでHTMLを落としてからパースしようと思ったのですが、確かにパーサでやる手もありそうですね
正規表現は今まで避けてきたので、読むのがシンドイっていうかチンプンカンプンですが
求めていた動作です。とても助かりました。
使わせてももらいます。ありがとうございました。
580:デフォルトの名無しさん
18/08/12 23:56:24.69 2UQfVx23.net
HTML のように、要素に親子関係があるもの・構造化されたものは、正規表現じゃ無理
<1><x></x><y></y></1>
開き・閉じタグで、前から一致させると、
<1></x> が対応してしまう
ネストも無限にできるから、対応させるのは無理。
パーサを使うべき
581:デフォルトの名無しさん
18/08/13 00:16:51.60 06GD6VnQ.net
キーワードと構成次第だろ
582:デフォルトの名無しさん
18/08/13 00:22:13.35 LXDaPxOa.net
rubyキチやぞ
583:デフォルトの名無しさん
18/08/13 03:34:58.19 EnLsbSTB.net
>>563
一部の環境では括弧等のネスト構造を取り扱いをサポートした正規表現があるよ
PCRE(Perl 5.10以降)やruby(鬼雲)、Python,PHPなどでも
C#の.NET Framework環境でもあったんじゃないかな
584:デフォルトの名無しさん
18/08/23 19:11:59.52 4kav5HXR.net
.*
何にでもマッチさせることができる最強で万能な正規表現
585:デフォルトの名無しさん
18/08/23 19:26:33.22 FR6Db0Vc.net
改行にはマッチしないけどね
[\s\S]*
586:デフォルトの名無しさん
18/08/24 02:29:36.02 cgE41D9D.net
>>563
> HTML のように、要素に親子関係があるもの・構造化されたものは、正規表現じゃ無理
そういうこともできるように拡張した正規表現があればいいのに
さらに階層、treeも可
587:デフォルトの名無しさん
18/08/24 03:56:55.93 k/tOxHF9.net
>>569
鬼雲使ってみれば?
588:デフォルトの名無しさん
18/08/24 10:28:37.49 bF2ATmvV.net
BNF使えよ
589:デフォルトの名無しさん
18/08/24 10:38:07.25 wb3Q/jKx.net
なんか知識が数年前で止まっちゃってる人がちらほらいるな
正規表現がネストに対応したのなんてもう一昔前ってイメージだけど
590:デフォルトの名無しさん
18/08/24 12:46:08.34 srP6ovAZ.net
別に正規表現だけを追いかけてるわけじゃないから
591:デフォルトの名無しさん
18/08/24 12:48:35.65 ZVlysGry.net
なんでも正規表現で済まそうとするひとって
意地でもVBA使い続けてるひとと大差ない
592:デフォルトの名無しさん
18/08/24 12:49:36.87 yKVFr0CJ.net
適材適所
593:デフォルトの名無しさん
18/08/24 16:58:29.09 k/tOxHF9.net
>>569
てか>>563には>>566のレスが既に付いてたじゃんか
594:デフォルトの名無しさん
18/08/24 18:58:08.09 wb3Q/jKx.net
>>574
賢い人程手段をたくさん知り
その中から取捨選択するからな
>>573
さすがに勉強不足すぎだろw
何年前で知識止まってんだよ
595:デフォルトの名無しさん
18/08/25 00:03:35.46 r5O9PJUC.net
はいはい、正規表現マスターすごいねー
これでいいかな w
596:デフォルトの名無しさん
18/08/25 00:35:41.84 I7tIpqHO.net
底辺に行くほど知識自慢はしかたがないだろ、正規表現に限らず
ただ掲示板的に質問したいのにバカがしゃしゃり出てきて迷惑だよな
597:デフォルトの名無しさん
18/08/25 10:52:22.58 J+b/MRtJ.net
的確な指示されても気に入らない回答だからと人の話を聴かない人は成長しないよ
自分の気に入る回答しかも自分と同じレベルの回答もらって喜んでればいい
598:デフォルトの名無しさん
18/08/26 15:08:37.66 sCPJIsfv.net
俺なんか中学の勉強もロクにしなかったのに正規表現を理解したいから
今、大学レベルの数学を勉強してる・・なかなか進まないけどね・・
>>558 の質問からパーサとか出てくるのはちょっと違うと思うよ
metaタグ拾えばいいだけだよね?難しく考えすぎだよ
あとHTMLソースのほうが糞で実際の文字コードとmetaタグで指定されてる
文字コードが違うなんてことや、文字コードの指定が複数個所あるなんていう
2ページ分のHTMLをそのままくっ付けましたなんていうのも稀にあるから
そういう糞なHTMLを相手にする場合は対応を考えないといけないね
599:デフォルトの名無しさん
18/08/26 15:31:19.41 CE5Lnwmj.net
>>581じゃあmetaタグを拾って来る正規表現をどうぞ
600:デフォルトの名無しさん
18/08/26 15:37:54.94 zPuf2RGr.net
え? そんなことマジで聞いてるのか?
601:デフォルトの名無しさん
18/08/26 15:40:08.95 CE5Lnwmj.net
マジだからちゃんと教えてくれよ
602:デフォルトの名無しさん
18/08/26 18:08:41.45 sCPJIsfv.net
自分用に作るならこんな感じかなぁ、動作確認してないので使わないでね
|
<meta (?=\s) [^<>]* \s charset \s* = \s* (?:["']\s*)? ([^\s"'<>;]+)
|x;
こういうのは想定外 ※ " " の中に > がある
<meta comment="a>b" charset="UTF-8">
603:デフォルトの名無しさん
18/08/26 18:17:10.61 O4hA/SKg.net
>>585
俺が書いた糞(>>561)より糞なコードが書かれて驚く
素直にパーサ使えよ
604:デフォルトの名無しさん
18/08/26 18:36:53.61 sCPJIsfv.net
>>585 のほうがスマートなのは一目瞭然でしょ
ただ >>585 は こんな感じ 程度のものなのでツッコミ所があっても知らないよ
605:デフォルトの名無しさん
18/08/26 18:37:23.43 5oVMxLBv.net
mataタグでのcharsetは定型的でしか使われないんで、仕様的に色々な場合に対応するのは無駄
俺が使うなら、こんなので十分
/<meta[^>]*\scharset=(["'])((?:(?!\1).)+)/i
606:デフォルトの名無しさん
18/08/26 18:52:21.33 sCPJIsfv.net
ほとんどの場合はそれで充分だろうねw
607:デフォルトの名無しさん
18/08/27 04:46:33.83 2QlJLeh2.net
マッチングテスト
[1] <meta charset="UTF-8">
>>559 1. 失敗
>>561 マッチ
>>585 マッチ
>>588 マッチ
[2] このスレのHTML
557 1. マッチ
559 失敗
583 マッチ
586 失敗
608:デフォルトの名無しさん
18/08/29 16:43:59.44 4UnjToZE.net
こんなバカが回答者してたのか
過去レス見ると前から張り付いてるようだね
609:デフォルトの名無しさん
18/08/31 20:05:36.75 5NewXZva.net
なかなか興味深い
鬼雲に非包含オペレータを実装した話
URLリンク(qiita.com)
610:デフォルトの名無しさん
18/08/31 21:09:12.34 5NewXZva.net
bregonig.dll 2017/01/17 Ver.4.10 非包含オペレータに対応
うーん、非包含にマッチする正規表現はいつか自分で作れるように
なりたいと思ってたけど内部で勝手に作ってくれる時代になってしまったか~
自分の知識は2013あたりで止まってるから浦島だ
611:デフォルトの名無しさん
18/09/01 01:28:06.31 0IlLcsWm.net
ab(?~ba)ba
これを
ab((?!ba).)*ba
この従来通りの方式をベースに記述して、かつ、前者とまったく同じ
動作に書き直すことは可能かな?
両者の違いについては>>592のリンク参照
612:デフォルトの名無しさん
18/09/01 22:17:13.09 0IlLcsWm.net
(?~abc)
これは↓とまったく同じ動作になると言って良さそう
(?:(?!abc).)*(?:(?=abc).{1,2})?
否定したい文字列が固定長なら先読みで書き換え可能らしい
613:デフォルトの名無しさん
18/09/12 19:47:12.85 j29ToL0A.net
正規表現を言語化できるようなとこ知りませんか?
/^ab/
これを入れると、
↓
「abで始まる」
と変換されるようなサービスって無いでしょうか?
614:デフォルトの名無しさん
18/09/13 09:47:15.83 l9KSlvFS.net
せっかく正規表現にした意味が無い
615:デフォルトの名無しさん
18/09/13 09:50:19.09 NoauaeTl.net
URLリンク(jex.im)
616:デフォルトの名無しさん
18/09/13 13:28:20.78 a9m+mGXQ.net
視覚的に見れるサイトじゃなくて視覚的に作れるサイトがあったら便利かな
メタ文字を覚える必要が無くなるし動作を把握しながら作れる
そういうのが普及したらいいね
617:デフォルトの名無しさん
18/09/14 00:35:39.11 qC9qAPWt.net
そういうのとはちょっと違う&grepツールになっちゃうけど
TresGrepってのが入力欄でのマウス右クリックから正規表現を指定出来たり
正規表現1文字入力ごとにエラーチェック⇒NGならエラーメッセージを表示したりと
ちょっと便利
618:デフォルトの名無しさん
18/09/14 06:51:39.20 LTbXVNEK.net
>>598
これいいですね。
ありがとうございます。
619:デフォルトの名無しさん
18/09/14 14:14:58.44 grBP2MzP.net
TresGrep使ってみたけど良くできてる
正規表現に何かしらの思い入れがあるのが分かる気がする
特に正規表現の複数行入力が出来るのはいい
自分は複数行入力が当たり前になるべきだと前から考えていて
それが実装されててちょっと感動してしまった
620:デフォルトの名無しさん
18/09/17 12:06:03.62 SR+usNFF.net
C#、System.Text.RegularExpressions.Regexの正規表現で
xxの中を取り出すにはどうしたらいいのでしょう?
ただし取り出したいのはトップのxxで、xxが閉じる前にyyがあるときはそのxxは無視という条件付きです
対象文字列 "<xx><xx><yy>111</yy></xx></xx><xx>223</xx><xx>334</xx>";
試した正規表現 @"<xx>.*?[^(</yy>)]</xx>"
結果
<xx><xx><yy>111</yy></xx></xx><xx>223</xx>
<xx>334</xx>
欲しい結果
<xx><xx><yy>111</yy></xx></xx>
<xx>223</xx>
<xx>334</xx>
621:デフォルトの名無しさん
18/09/17 13:51:51.89 tNilsymD.net
プログラムとはちょっと違うのですが、2chMateで荒らしをNGする正規表現を作りたくて悩んでます
日本語で書くと、
"URLリンク(")<)が合わせてn回以上出てきた場合(対象は複数の改行を含む文字列)
にマッチするような正規表現って可能でしょうか?
622:デフォルトの名無しさん
18/09/17 14:52:47.98 QtMg2HjE.net
>>603
結果と欲しい結果の違いが改行しかないような
>>604
n=3
(?si:https?:\/\/.*?){3,}
623:602
18/09/17 15:04:16.06 tNilsymD.net
>>605
迅速なご回答ありがとうございます。
この方法でうまくいきました!
624:デフォルトの名無しさん
18/09/18 00:00:11.49 lHFpavF+.net
>>603
.NET Frameworkの正規表現は知らんけど、鬼雲でなら
(?=<xx>)(<(\w+)>([^<]*|\g<-3>)*</\k<-2-0>>)
これは最低限のものでイレギュラーなものには対応しない
文字列でエスケープされてるとかコメントが入ってるとか
タグにタグ名以外の余計なものが入ってるとか(</a href=...>とか<br />とか)
ペアでないタグがあるとか(<br>のような単独タグ,<xx>と</xx>のどちらかしかないとか)
そういうのにも対応させるなら工夫して
一応、.NET Frameworkの正規表現の再帰については
URLリンク(qiita.com)
625:デフォルトの名無しさん
18/09/18 00:12:00.46 oPOmCM6y.net
ありがと。もう少し単純にできるかと思っていたけどそんなに複雑になるのね
正規表現使わずにやる方向で考えてみます
626:583
18/09/18 00:55:53.38 t0fL3l18.net
>>607のリンク先見てやっつけで作ってみた
<xx>(?>(?:(?!</?xx>).)*)</xx>|<xx>((?'open'<xx>(?>(?:(?!</?xx>).)*))+(?'-open'</xx>(?>(?:(?!</?xx>).)*))+)*</xx>(?(open)(?!))
627:デフォルトの名無しさん
18/09/18 01:11:05.24 0krUYS0m.net
典型的なダメ質問者だな。
628:583
18/09/18 02:17:30.59 t0fL3l18.net
ミスってた、>>609はボツってことで・・
タグとタグの間の文字列の扱いが意外と難しい
629:デフォルトの名無しさん
18/09/18 06:08:34.66 oPOmCM6y.net
確かにダメ質問者w
「xxが閉じる前にyyがあるときはそのxxは無視」という一見簡単そうなルールが予想以上に難しいようで
楽したいから正規表現使いたいのだけどあまり複雑になると楽じゃないからほかに逃げたくなる
630:デフォルトの名無しさん
18/09/18 07:04:18.68 iA/s8q9i.net
ぶっちゃけ欲しい結果が何なのか結局よく分かってない
<xx>(?:(?<tag><(?!yy>)(?<tagname>[a-z]+)>)*\d+(?<-tag></\k<tagname>>)*(?(tag)(?!)))*</xx>
631:デフォルトの名無しさん
18/09/18 07:13:00.25 oqy73oSH.net
ID変わった
その表現だと <xx><xx><yy>111</yy></xx>
欲しい結果は<xx><xx><yy>111</yy></xx></xx>
こういう尻切れになることが多い
632:デフォルトの名無しさん
18/09/18 07:16:10.21 iA/s8q9i.net
どういうことよ
>>613の正規表現で <xx><xx><yy>111</yy></xx></xx><xx>223</xx><xx>334</xx> にマッチングすると
<xx>223</xx> と <xx>334</xx> にマッチするでしょ?
<xx><xx><yy>111</yy></xx> はどこから出てきたの?
633:デフォルトの名無しさん
18/09/18 07:42:45.15 oqy73oSH.net
申し訳ないミス。"<xx>.*?</xx>"の1件目の結果だったw
その正規表現だと2件マッチ
欲しい結果は>>603にある3件
634:デフォルトの名無しさん
18/09/18 07:46:54.65 iA/s8q9i.net
> xxが閉じる前にyyがあるときは
これは直前ってこと?
<xx><yy>111</yy></xx> にはマッチしないってことでいいの?
635:デフォルトの名無しさん
18/09/18 07:55:40.50 lHFpavF+.net
>ただし取り出したいのはトップのxxで
これだけで<yy></yy>があろうがなかろうが良いと俺は思ったんだけど
636:デフォルトの名無しさん
18/09/18 08:27:12.31 iA/s8q9i.net
yyがどうでもよければ
<xx>(?:(?:<(?<tag>[a-z]+)>)*\d+(?:</(?<-tag>\k<tag>)>)*(?(tag)(?!)))*</xx>
かなぁ
637:デフォルトの名無しさん
18/09/18 08:36:05.56 oqy73oSH.net
閉じる前というのは直前という意味で
対象が"<xx><xx><yy>111</yy></xx></xx><xx>223</xx><xx>334</xx><xx><yy>446</yy></xx>"
の場合は、<xx><yy>446</yy></xx>を無視したの3件マッチにしたい
>>613と>>619ベースできそうだからがんばってみます。ありがとう
638:デフォルトの名無しさん
18/09/18 09:00:26.56 iA/s8q9i.net
まぁスタック使う構文が必要な時点で正規表現向きでないのは間違いない
639:583
18/09/18 12:56:18.97 t0fL3l18.net
本来の数学的な正規表現という意味では向いてる質問なんだけどね
これぞ正規表現の仕事っていう質問
でもプログラムの検索で使う正規表現ではなかなか使われないね
640:583
18/09/18 13:25:09.30 t0fL3l18.net
>>609を修正
<xx>(?>(?:(?!</?xx>).)*)((?'open'<xx>(?>(?:(?!</?xx>).)*))+(?'-open'</xx>(?>(?:(?!</?xx>).)*))+)*</xx>(?(open)(?!))
これは>>607のリンク先の例を↓のように書き換えただけ
< を <xx>・・・
> を </xx>・・・
\A を <xx>
\z を </xx>
「・・・」 は<xx>または</xx>の間に挟まれている文字列
>スタック使う構文が必要な時点で
ああ、その通りだ、(r+s+)+ だけでは作れない
641:583
18/09/18 13:29:58.42 t0fL3l18.net
間違い
\A を <xx>
正しくは
\A を <xx> ・・・
642:583
18/09/18 18:51:49.51 t0fL3l18.net
>>613のはミスってるね
<xx><b><a>111</a></a></xx> にマッチする
<xx><b><a>111</a></b></xx> にマッチしない
この問題は>>619で修正されてる
()* \d+ ()* のところが0回以上のループで正しく動くのは面白いな
一番外側の (?: )* はいらないかも