正規表現 Part10at TECH
正規表現 Part10 - 暇つぶし2ch350:デフォルトの名無しさん
12/10/13 22:05:33.99
>>347
>>349
ありがとうございます

351:デフォルトの名無しさん
12/10/13 22:07:23.75
>>345
\dが[0-9]でないのって、どんなのがあるの?

352:デフォルトの名無しさん
12/10/13 22:22:42.43
>>351
秀丸はバージョン7あたりまで\dとか\sあたりが使えなかった

grepとかsedコマンドとかviエディタ内の正規表現とか
まあこの辺になってくると()や|の前にバックスラッシュつけないと
正規表現として機能しないという点でも非互換だけどもw

353:デフォルトの名無しさん
12/10/13 22:37:04.96
>>351
鬼車や鬼雲の\dは[0-90-9]と等価
Ruby 1.9系の正規表現エンジンは鬼車だけどカスタマイズされたフォーク版なので、\dを [0-9]と等価になるように修正してある

354:デフォルトの名無しさん
12/10/13 23:25:52.84
>>352 なるほど。
古めのエンジン、正規表現の源流に近いあたりでは\dは無いのね。
しかし秀丸バージョン7って、かなり最近じゃ。ちょっとひどいな。

>>353 そうなのかー。
先進的すぎても主流との互換性の点で問題あるよね。

355:デフォルトの名無しさん
12/10/13 23:41:43.03
>>353
>鬼車や鬼雲の\dは[0-90-9]と等価
うお、なんかイメージよりも範囲広すぎ。
敢えて[0-9]って書いといた方が無難なのね。

356:デフォルトの名無しさん
12/10/13 23:51:08.46
>>353
鬼雲は(?u),(?a)でUnicodeの範囲かASCIIの範囲かを制御できる。
\d,\s,\wがUnicodeの範囲でマッチするのはPerlに合わせた仕様。

357:デフォルトの名無しさん
12/10/24 21:11:42.58
●正規表現の使用環境
MSVC2012 / .NET Framework 4.5

●検索か置換か?
検索

●説明
「|」「(」「)」が文字として入っているデータから、特定の文字列を抜き出したい。

●対象データ
area|name (value)

tokyo|yamada benzo (123)
kyoto|namae tarou (21)
saga|shitemo mitukaranai you (7)

●希望する結果
area, name, value

"tokyo", "yamada benzo", "123"
"kyoto", "namae tarou", "21"
"saga", "shitemo mitukaranai you", "7"

このように取り出したいのですが、どのように書くとよいでしょうか

358:デフォルトの名無しさん
12/10/24 21:20:10.28
カッコの整合を取りたいのでなければ
"tokyo|yamada benzo (123)".Split(new char[] { '|', '(', ')' },StringSplitOptions.RemoveEmptyEntries)
でよかったりしない?

359:デフォルトの名無しさん
12/10/24 22:06:41.28
>>358
あ、本当ですね…。
このやり方のほうがさっぱりしてていいですね。
こちらでやらせてもらいます。
解決できちゃいました。
どうもありがとうございました。

360:デフォルトの名無しさん
12/11/01 12:21:53.25
あー!
正規表現で空白を縮めればいいのか

361:360
12/11/01 12:23:30.20
すみません自己解決しました

362:デフォルトの名無しさん
12/11/06 14:38:40.09
「CDATA」を含まない行を検索したいのですが、先読み否定を使用しましたがうまく検索できませんでした。
 ^(?!.*?CDATA)

指定文字列を含まない行をどのような指定で検索できるでしょうか?

363:デフォルトの名無しさん
12/11/06 14:42:14.02
つ[grep -v]

364:デフォルトの名無しさん
12/11/06 14:48:45.45
>>362
自己レス

Java → ×
サクラエディタ → ○

Javaの問題?

365:デフォルトの名無しさん
12/11/06 15:13:49.63
^((?!CDATA).)*$

366:デフォルトの名無しさん
12/11/09 22:58:08.67
●正規表現の使用環境
perl5
●検索か置換か?
置換
●説明
keyとvalueの間はコロン区切り、keyとvalueのペアの間はカンマ区切りになっている
key1:value1,key2:value2,key3:value3 という形式で書かれている文字列で、
指定したkeyに対応するvalueの値を取得したい。
 ・valueの文字列にはコロンやカンマが入っている可能性があるので、それを区切り文字にはできません。
 ・valueの文字列は、:value:や,value,のように、先頭や末尾がコロンやカンマの可能性があります。
 ・key3:value3,key2:value2,key1:value1 のように順番は変わる可能性があります。
 ・keyとvalueのペアは、何個あるかはわかりません。0個の場合もあり。
 ・指定するkey以外のkeyについても、何があるかはわかりません。
 ・keyもvalueも可変長で、valueが空という場合もあります。
●対象データ
AAA:V,:1,BBB:V,,::2,CCC:V,,,:::3,DDD:,V4:,EEE:
●希望する結果
AAAをkeyとすると、V,:1
BBBをkeyとすると、V,,::2
CCCをkeyとすると、V,,,:::3
DDDをkeyとすると、,V4:
EEEをkeyとすると、空
FFFをkeyとすると、空

3日くらい試行錯誤してますが、全然解決できず気が狂いそうです・・・
完全に、論理的に無理ゲーでしょうか?

367:デフォルトの名無しさん
12/11/09 23:36:12.98
値(orKey)にデリミタがエスケープ無しで出るなら区別できないんじゃね?
例に挙げているのでも
 DDD=空
 V4=空
 EEE=空
と言う解釈も出来る(FFFは存在しないKey)

368:デフォルトの名無しさん
12/11/09 23:40:02.61
>>366
素直にsplitしたら負け?

369:デフォルトの名無しさん
12/11/10 00:32:09.53
デリミタ制限してないなら無理ゲーだろ
V,:1,BBB:V,,::2,CCC:V,,,:::3,DDD:,V4:,EEE:
たとえば↑これ全体がAAAのvalueならどこで切れるんだよ

370:デフォルトの名無しさん
12/11/10 02:57:15.54
> DDDをkeyとすると、,V4:

これは何故なんだ?書かれてる条件だけ見ると
>>367が書いてる通り DDD=空 になるように思える
そこが明確にならなければ正規表現使うどころか
実直に一文字ずつパースしても無理に思える

371:デフォルトの名無しさん
12/11/10 03:57:23.97
手作業でやっても一意に決まらないようなのはどうしようも無いぞ

372:デフォルトの名無しさん
12/11/10 12:21:33.25
正規表現がどうのより、データの出力形式を見直したほうがいいな。
表計算ソフトのCSVの出力形式とか参考にしてさ。

正直、正規表現の出番以前の問題だよ。まずは論理的で明確なデータを用意するべき。

373:366
12/11/10 21:43:20.41
>>367, 368, 369, 370, 371, 372
たくさんのレス、アドバイスありがとうございます。お礼が遅くなりすみません

>>367, 369
やはり、デリミタが値の中に出てくる時点で、無理なデータぽいですよね。
>>368
splitするにも、カンマがデータ中に出てきたりするもので・・・
>>370
「,V4:」という部分が、データなのです。この場合のカンマは、デリミタではなく値でして・・・
>>371, 372
やはり、論理的に矛盾したフォーマットですよね・・・

結論として、とりあえずsplitでパースしたものがだいたい正常になるので、後は目視・手作業でやることにしました。
無茶苦茶なフォーマットのデータを置いて行った前任者を恨みます・・・

374:デフォルトの名無しさん
12/11/10 21:51:25.57
, と : がデータの一部として使われるときにある程度の規則性があるならそれを利用して判別
するといいかもね。まぁこれにも限界があるし誤爆の可能性もあるから目視は必須だけどね。

375:デフォルトの名無しさん
12/11/10 22:08:21.52
前任者がキ印とかカワイソス

376:デフォルトの名無しさん
12/11/11 01:40:44.89
目視で決められるのなら何か規則性があるんじゃないの?
キー名だと分かる何かが?

377:デフォルトの名無しさん
12/11/11 01:44:41.01
値に隠された制約があるはず。 でなければ目視で出来ない。

378:デフォルトの名無しさん
12/11/11 18:42:00.12
わからない時は古くからいる人に聞く、
これも「目視」のうちに入るのかもしれんしな。

379:デフォルトの名無しさん
12/11/11 20:50:46.82
>>376
文脈で判断だと、規則が膨大になりすぎるんじゃない。

380:デフォルトの名無しさん
12/11/11 22:40:27.53
●正規表現の使用環境
perl

●検索か置換か?
置換

●説明
1文字だけのAを空白に置換(または削除)したい

●対象データ
appleAisAdeliciousAAA

●希望する結果
apple is deliciousAAA

前後に同じ文字が連続していない場合、その文字だけを消したいです。

381:デフォルトの名無しさん
12/11/11 22:53:00.61
先頭のaも消してよければコレ
(?<!a)a(?!a)

382:デフォルトの名無しさん
12/11/11 22:54:55.34
あ、大文字だけか。
perlはよくわからんけどオプションかなんか指定して
aをAにすりゃたぶん大丈夫

383:380
12/11/11 23:15:05.09
>>382
ありがとうございます。
先頭にAがあると消えてしまいますが、教えて頂いた方法でできました。
$string =~ s/(?<!A)A(?!A)//g; という文です。

できれば、先頭のAが消えないパターンが理想なので、
引き続きアドバイスを募集させてください。

384:デフォルトの名無しさん
12/11/11 23:27:49.74
んじゃ、これでは?
(?<!^|A)A(?!A)

385:デフォルトの名無しさん
12/11/12 00:15:19.92
>>384
ありがとうございます。
ただ、こちらの表現は「Variable length lookbehind not implemented in regex」
というエラーになって実行できませんでした。

どうやら、戻り読み?というものに対応できていないようです。
環境を書き忘れましたが、xammpを入れてperl 5.16.1で実験してます。

386:デフォルトの名無しさん
12/11/12 03:15:42.78
もっと原始的に、これはどうか。
(^|[^A])A([^A]|$)
\1 \2
\1\2

ただ、よく分からないのは
>前後に同じ文字が連続していない場合、その文字だけを消したいです。
文字? 置換対象はAだけだよね?

387:デフォルトの名無しさん
12/11/12 03:20:51.76
あれ、>>383をよく読んでなかった。

>先頭のAが消えないパターンが理想
条件追加/変更なら改めて例示をやり直してくれるとありがたいんだけど。

これならいいかな?
([^A])A([^A]|$)

388:デフォルトの名無しさん
12/11/12 07:19:30.62
(?<!^)(?<A)A(?!A)

389:デフォルトの名無しさん
12/11/12 10:32:08.35
( ´д)ヒソ(´д`)ヒソ(д` )

390:388
12/11/12 11:02:29.20
すまん。!が抜けてた。(?<!A)

391:デフォルトの名無しさん
12/11/12 16:00:51.00
テストしてから書き込んでないってのがよく分かるな。せめて動作確認してから貼れよ。

392:デフォルトの名無しさん
12/11/12 18:33:07.61
ちょっとかっこ悪い

(?<=.)(?<!A)A(?!A)

393:デフォルトの名無しさん
12/11/12 18:52:46.82
戻り読みより\K使えよ
固定長の必要なくなるぞ

394:デフォルトの名無しさん
12/11/12 20:55:01.12
perlなら文字列操作関数で頑張ればいいのに。人に聞けばいいや、はイカン。

395:デフォルトの名無しさん
12/11/15 14:27:21.57
同じ英数字が4文字以上、の正規表現は(a{4,}|b{4,})…と地道に指定しないとダメでしょうか?

396:デフォルトの名無しさん
12/11/15 15:29:29.79
●正規表現の使用環境
php

●検索か置換か?
置換

●説明
2文字目以降の「.」以外の数字を「*」に置換したい。

●対象データ
12.34

●希望する結果
1*.**

397:デフォルトの名無しさん
12/11/15 19:52:54.79
>>395
([a-zA-Z0-9])\1{3,}

398:デフォルトの名無しさん
12/11/15 21:00:56.65
>>396
\G使え。

399:デフォルトの名無しさん
12/11/18 11:15:26.52
●正規表現の使用環境
jruby1.7.0

●検索か置換か?
検索

●説明
<abc def/>とあるようなタグを検索したい

●対象データ
<bbb><aaa><abc/></aaa></bbb>

●希望する結果
<abc/>

タグ内の文字列は記号を含んだ任意の文字列です
<.*?\/> とすると
<bbb><aaa><abc/> とか
<aaa><abc/> とかでヒットするのでどうにか
<abc/> だけでヒットさせることができないものでしょうか?

400:デフォルトの名無しさん
12/11/18 11:21:39.09
その説明だと

/<abc&yen;/>/

でいいんじゃねーのとしか読めないなw

401:デフォルトの名無しさん
12/11/18 11:41:03.34
ほれ

<[^<]*\/>

例であげてた<.*?\/>の?はなんか意味あるの?

402:デフォルトの名無しさん
12/11/18 11:44:52.55
質問者の環境で使えるかどうかは知らんが最小マッチな

403:デフォルトの名無しさん
12/11/18 12:03:56.89
>>401
できましたありがとうございます!
^は行頭の意味で覚えていたので思いつきませんでした…
?は一応、後ろの方に対して最小一致のつもりでした

404:デフォルトの名無しさん
12/11/18 12:37:00.59
量指定子のオプション ? が「ものぐさマッチ」である好例だね。
最小/最短という言葉だと、一番短くなる箇所でマッチするのかと誤解して覚えてしまう。

本当の最短マッチを探索する環境もあったような?

405:デフォルトの名無しさん
12/11/18 13:32:55.34
あー最小一致か。あったね、そういえば。
(個人的には)あんまり使わないからすっかり忘れてた

406:デフォルトの名無しさん
12/11/18 14:56:08.36
xxxは長さも値もランダムな文字列で

hoge+xxx/fuge+xxx/test+xxx

hoge+xxx/fuge+xxx や hoge+xxx/test+xxx や fuge+xxx/test+xxx
としたいのですが、例えばfuge+xxx/test+xxxとしたいとき
hoge.+(/)?とやるとfugeもtestも削除されてしまうんですがどうすればいいのでしょうか?
.に/も含まれてしまうのが問題だと思うのですが

407:デフォルトの名無しさん
12/11/18 15:01:22.03
>>406
環境書いて欲しいところだが「.+」の代わりに
[^/]+

[^\/]+
でどうよ?

408:406
12/11/18 15:13:14.89
>>407
できました!ありがとうございます!
その考え方は無かったです

409:407
12/11/18 15:36:08.79
>>408
どういたしまして
ところで>>399>>406は同一人物?

410:406
12/11/18 15:38:57.16
自分はphpでしたが似てますね
もっとよーく見てから質問するべきでした

411:407
12/11/18 16:20:51.12
>>410
同一人物でなかったのならお気になさらずに

さすがに同一人物だったら>>401の意味を自分で理解しようよって感じでしたが

412:デフォルトの名無しさん
12/11/19 12:25:00.01
Windows用で正規表現に対応したファイル検索ソフトってありませんか?

413:デフォルトの名無しさん
12/11/19 12:28:56.30
たくさんあるよ。

414:デフォルトの名無しさん
12/11/19 18:10:37.09
コマンドプロンプトからperlやphpでも行けそう。
フリーソフトなら腐るほどありそう。

415:デフォルトの名無しさん
12/11/19 22:47:26.62
>>396
対象データって小数点以下がある数字?
それともIPアドレスみたいに . が複数存在する場合もある?

00.1 ←数字ではあり得ない並び
1.2.3 ←ピリオドが2つ以上あるデータ
1.2. ←ピリオドで終わるデータ

こういうデータは置換対象にする?しない?

416:デフォルトの名無しさん
12/11/20 10:31:38.08
↑今日中に応答がない場合はもうこのスレ開くことないと思うのでご了承ください。。

417:デフォルトの名無しさん
12/11/20 16:30:04.26
正規表現使うべき所じゃないよねぇ

418:デフォルトの名無しさん
12/11/20 17:13:22.83
s/(?!^)[^.]/#/g

419:デフォルトの名無しさん
12/11/20 18:43:16.52
>>417
いえ、普通に使えるケースです。

>>418
これだと数字とピリオド以外の文字がデータに存在した場合、意図しない動作になってしまいます。
(文頭に半角スペースが入った場合など)

420:デフォルトの名無しさん
12/11/20 19:01:50.50
小出しェ

421:デフォルトの名無しさん
12/11/20 20:06:03.18
シェルスクリプトスレより誘導されてきました

以下のような文章があったとします
~aaa~bbbaaa~bbbaaa~bbb~
(~は文字数の定まっていない文字列を表しています。)
ここから、それぞれ最初のaaa~bbbだけを抽出、真ん中のaaa~bbbだけを抽出、最後のaaa~bbbだけをgrep -oなどで抽出したい時、どう正規表現で表せばよいのでしょうか?

422:デフォルトの名無しさん
12/11/20 21:13:44.65
>>421
言語は何?あと与えられたテキストがaaaa~bbbbだったらどこでaaaとbbbを区切るの。

423:デフォルトの名無しさん
12/11/20 21:41:53.58
必ず3回aaa~bbbが出てくるの?
もうチョイ詳しく書いてくれないとどうにも

どっちにしろ正規表現以外のサポートが受けれるなら
そっちと組み合わせたほうがはやいと思うよ

424:デフォルトの名無しさん
12/11/21 00:57:30.56
>>422
言語というかunixのシェルスクリプトです

与えられたテキストが、とはどういう事でしょうか?
~以外の部分は上記の文で確定しています
aaa~bbbaaa~bbbaaa~bbbは何回続くのかは確定していません

この文自体を正規表現で表すとこんな感じだと思います
.*(aaa.*bbb)+.*
この中からn番目のaaa.*bbbだけを抽出したいのですが無理でしょうか?(実際にはaaaとbbbの間の文字列を取得したいです)
説明が下手で申し訳ありません・・・

425:デフォルトの名無しさん
12/11/21 01:20:15.05
>>424
質問の意図は分かったけどシェルスクリプトで使える正規表現を知らないから
それを調べるのにちょっとかかりそう。それさえ分かれば簡単なんだけどねw

426:デフォルトの名無しさん
12/11/21 02:17:30.96
>>424
ある程度調べた。grep -P オプションが使えない環境では無理。
普通のgrepだと (aaa.*bbb)+ とかでおおざっぱに取り出すことしか出来ないね。

unixにperlインスコしてperlの正規表現で処理すれば簡単なんだけどな。

参考にしたサイト
URLリンク(linuxjm.sourceforge.jp)

427:デフォルトの名無しさん
12/11/21 10:50:11.06
aaa[^b]*bbb でぶった切って、煮るなり焼くなり。

428:デフォルトの名無しさん
12/11/21 11:29:13.52
最初のaaaより手前と最後のbbbより後をsedで切り落とせば、あとはawkで
bbbaaaを区切りに指定して$1でも$2でも好きなの取り出せるよ

sed 's/^&yen;([^a]&yen;|a[^a]&yen;|aa[^a]&yen;)*aaa//'|sed 's/bbb&yen;([^b]&yen;|b[^b]&yen;|bb[^b]&yen;)*$//' | awk -Fbbbaaa '{print $2}'

429:デフォルトの名無しさん
12/11/21 12:16:09.86
マルチ
スレリンク(unix板:814番)

430:デフォルトの名無しさん
12/11/21 13:33:13.02
向こうに山崎渉がいたぞ。
もうすぐ10周年って、どんだけ長持ちなスレなんだよ。
スレリンク(unix板:29番)

431:デフォルトの名無しさん
12/11/21 17:11:37.20
>>426
grep -Pは使える環境です!
>>427-428
ありがとうございます!参考にさせてもらいます>>429
それ僕じゃないです

432:デフォルトの名無しさん
12/11/21 19:43:02.39
>>431
perlそのままで書くと↓

((?!aaa).)*(aaa((?!bbb).)*bbb){1}aaa\K((?!bbb).)*(?=bbb)

ただしシェルスクリプトだと\Kが使えない可能性が高いな・・その場合は>>428さんので。

{1} の数字を変えると取り出したい組み合わせを何番目にするか調整出来る。
{ } の中には 「取り出したい何番目かの数字」 - 1 を入れる。1番目なら0、2番目なら1、3番目なら2・・・

433:デフォルトの名無しさん
12/11/21 19:45:39.38
基本正規表現で十分だろ
aaa[^b]*\(b\{1,2\}[^b]\+\)*b\{0,2\}bbb

434:デフォルトの名無しさん
12/11/21 19:58:50.64
>>432はgrep -oで取り出すのを前提にしてます。
$1や$2で取り出せるならもっとシンプルに書けるんですけどね・・

435:デフォルトの名無しさん
12/11/21 21:34:51.99
aaa123bbbbaaa456bbb

これから123bを正しく取り出すには..

436:デフォルトの名無しさん
12/11/21 21:47:14.20
echo 'aaa123bbbbaaa456bbb' | grep -o 'aaa[^b]*\(b\{1,2\}[^b]\+\)*b\{0,2\}bbb' | sed -e 's/^aaa//' -e 's/bbb$//'

437:デフォルトの名無しさん
12/11/21 22:08:47.89
>>398
これJavaの正規表現だとどうなりますか?

438:デフォルトの名無しさん
12/11/22 00:30:07.28
>>432
上手く動作しなかったので>>428さんのを使わせてもらいます!色々ありがとうございました

最後に、
~aaa~bbb~aaa~bbb~aaa~bbb~
からn番目のaaa~bbbを抽出する方法を教えてもらえるとありがたいです

439:デフォルトの名無しさん
12/11/22 01:58:36.36
>>437
phpと同じでおk。

440:デフォルトの名無しさん
12/11/22 07:15:21.91
>>438
スクリプトで式を生成する。

441:デフォルトの名無しさん
12/11/22 21:25:36.85
\Gの使い方は↓参照。

rs0032.zip【ノウハウ】まとめ (正規表現のメモ的なもの)
URLリンク(www42.tok2.com)

↑は↓のツールで開くか、テキストエディタで開くと読める。
URLリンク(1st.geocities.jp)

442:デフォルトの名無しさん
12/11/24 04:35:57.17
>>440
スクリプトで式を生成する、とはどういう事でしょうか?教えてもらえるとありがたいです

443:デフォルトの名無しさん
12/11/24 08:49:57.78
横だけど。

>>442
nが3のとき、4のとき、5のとき……って、必要なコマンドが全て違うわけだ。
でも、よ~く見てみると完全に別のコマンドって訳じゃなくて、法則性があったりする。

だったらこの法則性を利用して、コマンドの文字列自体を出力するプログラムを書いてしまえということ。

444:デフォルトの名無しさん
12/11/24 12:37:22.12
自分で正規表現作れるようになろうっていう意思がまるっきり感じられないのがなぁ。
ただのクレクレには答える気ないというのが総意だろう。

445:デフォルトの名無しさん
12/12/06 19:13:37.62
ruby初心者です
テキスト中の指定した記号を削除したいのですが
text = 任意のテキストファイルにしておいて
text2 = "#{text}".gsub(/[\[\]\(\)\/"「」!@`~-.]/, "")
と書くと
invalid regular expression: /[\[\]\(\)\/"\242\243!@`~-.]/
となってしまいます
ついさきまでなんのエラーもなくできていたのですがどこがおかしいのでしょうか

446:デフォルトの名無しさん
12/12/06 21:52:13.08
マイナスでは。
"#{text}".gsub(/[\[\]\(\)\/"「」!@`~.-]/, "")
"#{text}".gsub(/[\[\]\(\)\/"「」!@`~\-.]/, "")

447:デフォルトの名無しさん
12/12/06 22:03:00.61
>>446
本当だ…
なんでさっきまでできてたんだろう
間違ってマイナス追加しちゃったのかもしれないけど記憶にないw
ありがとうございました助かりました

448:デフォルトの名無しさん
12/12/08 18:23:57.54
質問良いでしょうか?
サクラエディタの置換処理の[該当行マーク]で取得範囲のテストをしています。

フルパスからドライブレターや(ネットワーク越しの)PC名を一発で切り出したいのですが
どのようにすれば良いでしょうか?

c:\windows\system32\drivers\etc\hosts
\\安藤PC\共有\excelデータ\

といった環境で、[c]や[安藤PC]を切り出したいです。
([^\\]+?)[\\:] と言うところまでこれたのですが、
行内で複数一致してしまい、うまく切り出せません。

449:デフォルトの名無しさん
12/12/08 19:15:47.14
テストは一切してない
こんな感じか?
^(
([^\\ ]+): #頭から:の手前までの(*\と半角スペース*以外で1字以上)
|
\\\\([^\\\: ][^\\\:]*) #頭の\\の次から(*\と半角スペース*以外で1字)(*\と:と半角スペース*以外で1字以上)
)

450:デフォルトの名無しさん
12/12/08 19:40:05.98
>>448
文字クラスの外で使う^が行頭ってことがわかれば
自力でいけそうな感じだな、がんばれよ。

451:デフォルトの名無しさん
12/12/08 20:03:40.80
>>449
返信ありがとうございます
しかしながら[c:][\\安藤PC]となってしまい、コロンや\\が残留するようです。
このコロンや\\を一発で除去したいのが目的なので…

>>450
^が行頭は知ってます。
^ $ . + * ? [ ][^ ] ( ) | \\ \d \s \r \n \t $1 $2
単純な構造なら、↑ここらへんは書けますが、複雑になったり
回数指定や16進とかになると解説読んでなんとか…というレベルです。

2週なら[行頭の \\ 削除]、[行頭から最初の \ : まで取得]で簡単な話なんですが

452:451
12/12/08 20:14:29.95
レス直後に自己解決しました。
$1一発で取るんじゃ無くて、>449さんに $2$3 で取得すれば行けますね。
ありがとうございました。

453:デフォルトの名無しさん
12/12/08 20:16:56.13
別パターン

^(\\\\)?([^\\:]+)
\2

454:デフォルトの名無しさん
12/12/08 20:17:26.73
解決したみたいだけどサクラエディタで質問する時は本体バージョンと、
使ってる正規表現DLLとそのバージョンを書くべき

455:デフォルトの名無しさん
12/12/08 20:27:53.85
自分だったら\や\\を\tに変換して、エクセルで作業しちゃう。

456: 忍法帖【Lv=2,xxxP】(1+0:5)
12/12/15 23:17:38.36
${2}1

457:デフォルトの名無しさん
12/12/20 20:36:10.03
同じ文字列が繰り返されるような文字列にマッチさせるようにするにはどのように記述したら良いでしょうか?
ex)
apple_and_orange/1687646/abcde/abcde/hogehoge
apple_and_orange/5646818/fghijk/fghijk/hogehoge
apple_and_orange/1984687/lmnop/lmnop/hogehoge

/abcde/abcde/や/fghijk/fghijk/のように同じ文字列が繰り返されます
これが良い例えかどうかは分かりませんが、参照で説明したら
apple_and_orange/\d+/$1/$1/hogehoge
といった感じです

458:デフォルトの名無しさん
12/12/20 21:00:31.33
/([^/]+)/\1

459:デフォルトの名無しさん
12/12/20 21:08:48.05
>>458
ありがとうございます

460:デフォルトの名無しさん
13/01/03 20:52:32.91
Javaで正規表現を使ってHTMLの終了タグを順番に一つずつ抽出しようと思ったのですが失敗しました。
\\[/.*\\]
Hello regex world! [a href="foo.html"]This is link text.[/a] [strong][em]woohooo![/em][/strong]
⇒[/a] [strong][em]woohooo![/em][/strong]

いろいろ調べて最短修飾子を使えばいいのかなと思いましたがこれも失敗しました。

461:460
13/01/03 20:54:16.82
すいません途中で間違えて描いてしまいました。
最短一致で次のように試して失敗しました。

\\[/.*\\]+?
Hello regex world! [a href="foo.html"]This is link text.[/a] [strong][em]woohooo![/em][/strong]
⇒[/a] [strong][em]woohooo![/em][/strong]

結果は変わりませんでした。
何が間違っているのでしょうか?

462:デフォルトの名無しさん
13/01/03 21:08:53.67
\[/[^\]]+\]

エスケープの仕方が間違ってる

463:デフォルトの名無しさん
13/01/03 21:17:19.18
回答してから気がついたんだけど、コレほんとにHTMLなの?
JAVAでは<>が[]で表現されるとか?

464:デフォルトの名無しさん
13/01/03 21:18:30.69
>>462
回答ありがとうございます!
Javaだと角かっこをエスケープする\をエスケープするために\\[とか\\]としないとエラーになるようで、
\\[/[^\\]]+\\]
としたら無事一つずつ抽出できました!

[^]で角かっこに含まれない一文字にマッチという意味のようなのでこれは
/と]以外にマッチするということですか?

465:デフォルトの名無しさん
13/01/03 21:19:32.75
>>463
すいませんHTMLじゃなくてHTMLのtextareaの中に含める独自タグでした……括弧が違うだけで原理は一緒です。

466:デフォルトの名無しさん
13/01/03 21:24:37.24
エスケープしてるほうの[]は単なる文字で
素の[]は文字クラス

なので\\[/[^\\]]+\\] は
[]に囲まれた]以外の1文字以上の任意の文字列にマッチ

467:デフォルトの名無しさん
13/01/03 21:27:04.49
あ、/忘れた

[]に囲まれた先頭が/の]以外の1文字以上の任意の文字列にマッチ

文章にすると逆に分かりづらいな
日本語のうまい他の人に期待

468:デフォルトの名無しさん
13/01/03 21:36:41.12
エスケープ文字が邪魔でわかりにくかったので<>で見てみました。
</[^>]>

こうなりますよね……
</と>に囲まれた>以外の1文字以上の任意の文字列にマッチ

Hello regex world! <a href="foo.html">This is link text.</a> <strong><em>woohooo!</em></strong>


</

>
に囲まれた
a> <strong><em>woohooo!</em></strong>
とはならない理由がいまいちつかめてないです……たぶん[^>]の意味がちゃんと理解できてないんだと思います。
詳しい解説感謝です!

469:デフォルトの名無しさん
13/01/03 21:39:05.91
間違えました、

</

>
に囲まれた
a> <strong><em>woohooo!</em></strong

です。

470:デフォルトの名無しさん
13/01/03 21:42:43.41
あ、aタグの後ろの>で引っかかってaまでが[^>]の部分とみなされたってことですかね?
そして後ろに囲む>がくっついたと。
なんとなくわかったかもです!

471:デフォルトの名無しさん
13/01/03 21:47:55.58
解説書いてたら自己解決してたでござる。

それであってるよ。
あと、念のため
</[^>]>
じゃなくて
</[^>]+>
ね。

472:デフォルトの名無しさん
13/01/03 21:55:38.52
あっ、+が無いと<と>の間に何もない時マッチしないですね
丁寧にほんと感謝です!

473:デフォルトの名無しさん
13/01/04 04:32:05.31
そういうときは事前に【 】などに変換しておくと、ややこしくならなくて良いよ。

474:デフォルトの名無しさん
13/01/04 22:19:43.90
>>473
遅くなりましたがアドバイスありがとうございます!

475:デフォルトの名無しさん
13/01/04 23:51:26.93
後方参照で$1の後に特定の数字を続けたいんだけど、どう書けばいいんだろう
$12とか書くと、当然12番目のグループと解釈されて駄目

476:デフォルトの名無しさん
13/01/04 23:57:52.97
${1}2

477:デフォルトの名無しさん
13/01/04 23:59:46.88
ああごめん
ググッたら一番上に出てきたわ
本当めんご

478:デフォルトの名無しさん
13/01/05 07:30:32.86
へぇ。知らなんだ。
ずっと"$1\x32"みたいなメンドくさいことしてたわ。
横からおいしくいただきましたw

プログラミング言語関連の調べ物って、ググるにしても
キーワードが"$"とか"#"みたいな記号だったりして難しいよね。

479:デフォルトの名無しさん
13/01/05 08:13:02.35
後ろからもおいしく頂きます。

480:デフォルトの名無しさん
13/01/07 00:10:04.48
boost regexでの話なのですが、後読みが使えないのですが何とかして先読みで代用できないものでしょうか?

先読み後読みの仕組みもそこそこにしか理解してないものの、無理そうな気配は感じております
が、この道の先人であるところの皆様なら何かすごい裏技をご存知なのではと一縷の望みを託しに参上いたしました

481:デフォルトの名無しさん
13/01/07 00:37:46.83
後読みって戻り読みの別称でいいんだっけ?

482:デフォルトの名無しさん
13/01/07 00:43:41.18
はい。英語ではlook-behindと書かれる↓です
(?<=),(?<!)

483:デフォルトの名無しさん
13/01/07 00:43:55.04
>>480
可変長戻り読みの正規表現を使おうとしてるんじゃないの?
URLリンク(jp.emeditor.com)

もうちょっと具体的にマッチさせたい対象データと
boostの制限で通らなかった正規表現パターンを書いてもらわないと
アドバイスしづらい

484:デフォルトの名無しさん
13/01/07 00:52:54.44
>>483
それです
可変長というのがよく分かりませんが

具体的には、
(?<!やす|ひろし|てつや)さん
で検索すると
のりこさん、ちぐささん、ひろしさん、てつやさん
の内 のりこさん と ちぐささん のさんがマッチしますが、(?<=),(?<!)が仕様上無いとのこと

どうにかなりませんでしょうか……?

485:デフォルトの名無しさん
13/01/07 03:44:19.04
> (?<=),(?<!)が仕様上無いとのこと
ある
(?<!やす|(?<=ひ)ろし|(?<=て)つや)さん
でいける

よく調べようね

486:デフォルトの名無しさん
13/01/08 17:20:32.87
>>485
ありがとうございます
それがいわゆる可変長と言うやつでしょうか
やす、ひろ、てつなら問題なかったと

487:デフォルトの名無しさん
13/01/08 21:09:21.66
行頭と行末にリストタグを追加したいのですが、うまくいきません。。。
秀丸使っています。。どのように書けばいいのでしょうか??

あああ
いいい
ううう

↓望む結果

<li>あああ</li>
<li>いいい</li>
<li>ううう</li>

488:デフォルトの名無しさん
13/01/08 21:37:20.10
(.*)
<li>\1</li>

489:デフォルトの名無しさん
13/01/08 21:49:48.37
もし空行があった場合<li></li>だけの行になってしまうと多分まずいので
*より+のほうがいいと思う

490:デフォルトの名無しさん
13/01/08 22:01:39.99
^(.*\S.*)$

スペースだけの行もカット。\Sは詳説・正規表現でよく出てくる。

491:デフォルトの名無しさん
13/01/08 22:05:41.50
つまりだな
質問者はテンプレ使えって事だ

492:デフォルトの名無しさん
13/01/08 22:14:53.93
テンプレの要項は満たしてるけど説明欄が不十分

493:デフォルトの名無しさん
13/01/09 16:51:43.53
^(\s*)(.+)$
\1<li>\2</li>
インデント殺さないでほしいってなったときに。

494:デフォルトの名無しさん
13/01/09 20:47:05.50
>> 488-493
質問者です。どうもありがとうござました。遅くなりました。

これでできました。
(.+)
<li>\1</li>

^(.*\S.*)$
<li>\1</li>

スペースの違いがあまりわからず、、いろいろと深いですね><

495:デフォルトの名無しさん
13/01/18 11:20:51.12
PHPにて、2chで見るようなレスアンカーを検知して
その内容を区分けするようなプログラムを組んでいます。

例えば$testというstring型の中から
特定のアンカーがついた文章ごとに
配列に格納するようにstrposを使い
for($i = 0; $i <= 1001; $i++){
$res = '>>'.$i.'';
if(strpos($test, $res) !== false)){
//配列に入れる諸々処理
}}
という風に、簡略化はしてますがこんなのを書いたところ

動いてはくれるのですが、>>1とついた文章と>>15とついた文章が区別できてません。
>>1がついた文章用の配列の中に
>>15がついたのまで入っちゃいます。
その逆もです。
うまくそれらを区別するにはどんな正規表現を使えばいいのか、どなたかご教授願います。。

496:デフォルトの名無しさん
13/01/18 12:09:05.36
皇潤
数字以外を検出

497:495
13/01/18 13:22:49.52
>>496
レスありがとうございます。
確かに>>数字、の後には何かしら数字以外がくるので桁数を指定できますねなるほど…。

しかし、preg_matchで'/>>'.$i.'\D/'を条件にしてみましたがうまくいきません。
書き方が悪いのでしょうか?
降順もググッたりしましたがもう少しヒントを…
forをデクリメントで回したりしても結果変わらず…です…。

498:デフォルトの名無しさん
13/01/18 13:33:13.42
自分の投稿内容よく読めよ

499:495
13/01/18 14:02:53.49
>>498
正規表現と全然関係ないとこでミスってました。
'/>>'.$i.'\D/'こいつでいけてたんですが
preg_matchは !== false じゃなく
=== 1 で条件つけるべきだったんですね。

ありがとございましたー。

500:デフォルトの名無しさん
13/01/18 23:39:45.21
アフィかな、がんばれ。

501:デフォルトの名無しさん
13/01/19 01:52:56.64
ちなみに、

\D



(?!\d)

にするのが模範解答な。\Dの場合、数字以外の文字が必ず必要だが、(?!\d)の場合、
後ろに文字が存在しない場合でもマッチする。まぁ実用的には変わらないかもだが。

502:デフォルトの名無しさん
13/01/19 11:10:26.52
笑いを取るための模範解答ってこと?

503:デフォルトの名無しさん
13/01/19 17:19:26.64
>>501
その部分については安価のみを除外したい意図があるのかもしれないし。
数字をキャプチャするのが模範解答()には必要だと思うよ

504:デフォルトの名無しさん
13/01/20 01:15:05.18
アンカのみを除外とか・・数字のキャプチャとか・・何言ってんだこいつは。
プログラミング出来ない馬鹿は黙ってろ。

505:デフォルトの名無しさん
13/01/21 01:22:11.29
>>504

506:デフォルトの名無しさん
13/01/21 12:23:08.55
キャプチャはいらないよね。それより全角

507:503
13/01/21 13:41:04.68
>>504
for($i = 0; $i <= 1001; $i++){
$res = '>>'.$i.'';
プログラミングできる頭いい人ならこの時点でクソプログラムだってつっこめよ。

508:デフォルトの名無しさん
13/01/21 16:31:34.57
人のミスを探す前に自分のミスを認めて謝罪して土下座するのが先じゃないの?
それが出来ないなら明日から来なくていいよ?

509:デフォルトの名無しさん
13/01/21 16:52:05.30
あ、、アンカのみ除外ってそういうことか。
計算量を考えたら数字のキャプチャも必要か。。
プログラミングできない馬鹿はこちらでした。すみませんでした。

510:デフォルトの名無しさん
13/01/22 01:07:37.81
●正規表現の使用環境
 秀丸エディタver8.11マクロ(正規表現:HMJRE.DLL V3.41)

●検索か置換か?
 置換

●説明
 ”(ダブルクォーテーション)で囲まれた文字列の中のある文字を置換したい。

●対象データ
 BASICテキスト
 10 A$="AR_2_ZBG":B$="_GDA_"
 20 C=D_2
 30 G$="_":E=F_2:IF G$>"_" THEN 100

511:デフォルトの名無しさん
13/01/22 01:10:15.54
>>510の続き

 例えば上記のようなBASICテキストにおいて、行番号10,30の""の中にある_を-に変換したい。
 但し、行番号20のC=D_2と30のE=F_2の_は変換しない。
 なお上記のBASICテキストの””内は_の他に任意の半角文字とします。


●希望する結果
 10 A$="AR-2-ZBG":B$="-GDA-"
 20 C=D_2
 30 G$="-":E=F_2:IF G$>"-" THEN 100

512:デフォルトの名無しさん
13/01/22 02:16:32.06
URLリンク(homepage3.nifty.com)
このdllが使えれば可能。

使えなければその処理をするためのプログラム作るか、手動で。

513:デフォルトの名無しさん
13/01/22 02:54:25.90
>>510
正規表現だけでやろうとするな
秀丸なら追加の条件を使うのが定石

514:512
13/01/22 04:20:59.49
>>512のdllはダメだった、異常終了する。互換性ない。>>513が最善と思われ。

515:デフォルトの名無しさん
13/01/22 06:43:25.79
>>514
これなら互換性あるよ
URLリンク(homepage3.nifty.com)

516:510
13/01/22 13:07:41.94
>>512>>513>>514>>515
皆様、ご回答有難うございます。
別のDLLを使う事や追加の条件を使う事を考えます。
昨日連続で書き込み出来なかったのですが、
 replaceall "([<|>|=]\"[^\"]*)_([^\"]*\")"
, "\\1\-\\2" , regular;
このようなマクロを考えて悩んで相談しました。
有難うございます。

517:デフォルトの名無しさん
13/01/23 06:35:15.85
[<|>|=] ←これだと 「|」 も検索されちゃうよ、[<>=] ね。

518:510
13/01/23 12:52:35.13
>>517
有難うございます。ご指摘の通り「|」も検索されていました。
頭をもう一度整理します。

519:デフォルトの名無しさん
13/01/23 15:29:07.46
文字列に複数回数字が出現する時に
最後の数字だけ判定するには正規表現はどう書けばいいでしょうか?

具体的には
"foo 111 333 bar 222-hoge"
では"222"にマッチして
"aaa 22"
とある場合には 22 にマッチさせたいです。

環境はrubyです。

520:デフォルトの名無しさん
13/01/23 16:02:28.10
>>519
\d+(?!.*\d)
先読み慣れてないけど、こんな感じかな。

521:デフォルトの名無しさん
13/01/23 16:03:41.71
[\d]+[^\d]*$

522:デフォルトの名無しさん
13/01/23 18:21:29.78
>>520
動きませんでした…。
>>521
ありがとうございます。
希望の動作ができました!

523:デフォルトの名無しさん
13/01/23 20:07:29.60
>>522
URLリンク(www.rubular.com)
なんか環境が違うのかな、ともあれ>>521で動いたなら良かった

524:デフォルトの名無しさん
13/01/23 21:21:04.59
環境っつーか間違ってるから動かないんだろ

525:デフォルトの名無しさん
13/01/23 22:16:41.32
繰り返しの後ろに先読み否定を置くと落とし穴になることある。

(?>X+)(?!Y)

みたいに前の繰り返しを強制的に最長消費させれば落とし穴を埋められる。

526:デフォルトの名無しさん
13/01/24 23:15:48.24
test(100) という文字列があって、(100)にマッチさせたいのですが、
\(.*\) ←この正規表現ではマッチしませんでした
wikiを呼んだら
>>"\(" や "\)" で囲まれた表現に続く "*" は無効とされる。しかし、一部の環境ではそうならない。
と書いてありました。
それでは(100)にマッチするパターンはどう記述するのでしょうか?

527:デフォルトの名無しさん
13/01/24 23:29:31.94
まず環境が分からない

528:デフォルトの名無しさん
13/01/24 23:34:29.13
>>527
QtというC++のライブラリです
Qtのスレもあるんでそっちで聞いたほうがいいですかね?

529:デフォルトの名無しさん
13/01/25 06:47:51.71
マルチ

530:デフォルトの名無しさん
13/01/25 07:45:56.09
>>529
もう解決してるね。(>>526)

【RAD統合環境】 Qt 総合スレ 14 【Win/Mac/Linux】
スレリンク(tech板:596-598番)

531:デフォルトの名無しさん
13/01/25 14:46:31.09
>>516
まだいる?いるなら>>515のライブラリで動くの作るよ?

532:デフォルトの名無しさん
13/01/26 13:03:18.05
正規表現を身につけようと思ってググったら
正規表現練習ツールってのを見つけたんですけど
どうなんですか?

533:デフォルトの名無しさん
13/01/26 13:18:17.27
練習用

534:516
13/01/26 20:22:42.91
>>531
いますよー。もし可能でしたらお願い致します。<(_ _)>
結局、正規表現だけでは難しかったので、
取りあえずマクロと組み合わせて動かしています。

535:デフォルトの名無しさん
13/01/26 21:40:31.13
>>534
鬼車dllで動くものはもう出来てるんだけど、秀丸用のdllって独自の改変が入ってるらしくて期待した通りに動かない・・
URLリンク(www42.tok2.com)

違いを探して直すまでもう少しかかるから1日ほど待って。

536:516
13/01/26 22:51:09.97
>>535
お時間を取らせてしまい申し訳ないです。了解致しました。
正規表現_part10_res510も拝見しました。
私はマクロで、正規表現で『[<>=]"文字"の中の最初の「_」】
をマッチさせた上で、
その後は1文字ずつ「_」があるか「"」が出るまで調べ、
「_」があれば都度、「_」を削除、「-」を挿入する処理を繰り返してます。

537:デフォルトの名無しさん
13/01/27 04:46:22.44
>>536
おまたせです。書き込むときに長すぎると怒られたので【検索欄】を2行に分割してます。(一行に繋げて使って下さい)

【検索欄】
(?<C1>(?>(?:[^"\\_]|\\\p{ASCII})*)){0}(?<C2>(?:\g<C1>|_)*){0}(?:^(?<CAP1>(?:\g<C2>"\g<C1>")*\g<C2>"\g<C1>)_
|\G(?<=.)(?<CAP2>\g<C1>(?:"(?:\g<C2>"\g<C1>")*\g<C2>"\g<C1>)?)_)
【置換欄】
\3\4-

これの動作は
--------------------------------
カッコ外"カッコ内"カッコ外"カッコ内"
--------------------------------
というように、"が出現するごとにカッコの外か内かを判定してます。

よって、"の数が合わない場合、誤作動します。
-----------
~"~"~"~
-----------
↑最後の~がカッコ内と判定される。

また、\"のエスケープに対応しています
------------
~"~\"~"~
------------
↑正常に動く。

538:デフォルトの名無しさん
13/01/27 05:00:40.98
この動作で問題がある場合は言って下さい。
[<>=]を判定に付けたり、"の数が合わないときは最初から置換をしない、といったことが可能です。

↓この正規表現のソースみたいなもの。
URLリンク(www42.tok2.com)
秀丸用ライブラリ(hmonig.dll)のメモ的なものも書いておきました。
興味のある方はどうぞ。(無理に読まなくていいです)

今回作成に使った正規表現エディタ。↑のファイルを読み込んで編集出来ます。
URLリンク(1st.geocities.jp)

539:516
13/01/28 04:47:14.90
>>537
すごい、完璧に動作しました!有り難く使用させて頂きます。
記載頂いた表現の中身をまだ理解しきれていないので勉強します。
今回は誠に有難うございました。また返答が遅くなり
申し訳ございませんでした。

540:デフォルトの名無しさん
13/01/28 09:48:29.09
>>539
丁寧にどうもです。後から手を加えやすい作り方をしたので何か要望があればお気軽にー。

541:デフォルトの名無しさん
13/01/30 11:50:25.72
マクロでやれば簡単なのに

542:デフォルトの名無しさん
13/01/31 22:50:54.28
●正規表現の使用環境
sakuraテキストエディタ (bregonig.dll ver3.02 with Onigma 5.13.2)

●検索か置換か?
 置換

●説明
入れ子のデータを分離したい。

●対象データ
(あいう[えお])

これをキャプチャして、(あいう)[えお]と分離したいです。

よろしくお願いします。

543:デフォルトの名無しさん
13/02/01 05:15:18.17
(?:\(([^\(\)\{\}]*)\[([^\(\)\{\}]*)\]\))
($1)[$2]

544:>>543
13/02/01 15:54:50.12
ありがとうございます。
試してみます。

545:デフォルトの名無しさん
13/02/03 06:34:15.67
正規表現の定義は
スレッドプロセスに聞いてくれ


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