Regular Expression(正規表現) Part14 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
Regular Expressionスレです。
質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。
前スレ
Regular Expression(正規表現) Part13
http://echo.2ch.net/test/read.cgi/tech/1415149975/
次スレは>>980宜しく
天ぷら等2以降 スルーされにくい質問のテンプレと例
●Regular Expressionの使用環境
Java1.5
●検索か置換か?
検索
●説明
各行の1番目のAまでを検索したい
●対象データ
ABCA
BCAA
CABA
●希望する結果
ABCA
^
BCAA
^^^
CABA
^^
※ ^ はアンダーラインだそうな ^^; 387:名無し募集中。。。:2017/03/15(水) 02:01:25
以下依頼します。
よろしくお願いします(宣言してスレ立て規制に引っかかった)
【板名】 プログラム技術
【板URL】 http://echo.2ch.net/tech/
【タイトル】 Regular Expression(正規表現) Part14
【名前(省略可)】
【メール欄(省略可)】
【本文】
Regular Expressionスレです。
質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。
前スレ
Regular Expression(正規表現) Part13
http://echo.2ch.net/test/read.cgi/tech/1415149975/
次スレは>>980宜しく
天ぷら等2以降 [ ある "文字列" を含まない正規表現 ]
▽ 先読みが使える環境
((?!xyz).)* または (?:(?!xyz).)*
後者はカッコによるキャプチャを無効化しています。
1文字以上の繰り返しにしたい場合は * を + に書き換えて下さい。
▽ 先読みが使えない環境
オートマトンの知識が不可欠なため初心者にはまず無理です。
解説サイトですらほとんどがデタラメな作成方法を載せています。
↓正しい作り方はこちら。
xy を含まないものにマッチする正規表現 - Perl正規表現雑技
http://www.din.or.jp/~ohzaki/regex.htm#WithoutXY
xyz を含まないものにマッチする正規表現 - Perl正規表現雑技
http://www.din.or.jp/~ohzaki/regex.htm#WithoutXYZ
↓いろいろな文字列否定
タグの中に "ある文字列" を含まない正規表現
http://akiba.geocities.jp/hp20140401/2014/002.html 習う習わないっていう材料はテキストに出てくるかどうかなのか?
(と言っても俺の時代学校によって採用するテキストの種類だって何種類もあったんだけど)
それともどっかの参考書も含むのか? それは略語じゃなくて元から英単語だからね
リーナスがジットって発音してたらそれが広まっただろうけど 海外の動画見たら「SQL Server」を「シークルサーバー」って発音しててちょっと驚いた >>15
そういえば昔、初めてRDBを学んだ頃
会社の先輩でSQLを「シークェル」て呼ぶ人いたわ
その人一人だけだったけど >>16
Fileをローマ字読みでフィレと読んでいる
MakeFileはマケフィレ SQLの話まで行くともはやスレタイ関係ないじゃん、と思ったが>>19は面白かったわ
俺はsoft g、S-Q-Lで読んでるが、相手が先に違う読み方してたらそれに合わせてる 質問
詳説 正規表現 第2版 持ってるんだけど、 詳説 正規表現 第3版 との違いって何かある?
第3版の方は5000円もするから大差ないなら買わないでおきたい This third edition features enhanced PHP coverage in the early chapters,
plus an all new, expansive chapter devoted entirely to PHP regular expressions and how to wield them effectively.
Also new in this edition, the Java chapter has been rewritten and expanded considerably to reflect new features of Java 1.5 and Java 1.6.
って書いてるね
上に書いてる内容は目次の違い見ても分かるよ 買おうと思ったけど、後ろ半分が自分に関係なくて買うのやめた。 失礼します。質問させていただきます。
複数行からなるデータを、指定したピッチ(行)おきに消したいのですが、やり方を教えて下さい!
例えば
中1行空けてなら1,3,5,7
中2行空けてなら1,4,7,10
中3行空けてなら1,5,9,13
の行を削除していくみたいな感じです。
出だしは1行目からでなくても、これは行の調整でなんとか出来そうです。
できるだけ手順が少ないのが理想です。やり方解る方マジ教えてほしいです!
手作業でやってて疲れてしました。まだいっぱいあります・・・お願いします。 何かスクリプトが使えるなら簡単だけど
正規表現だけでは難しそう
いらない行だけに含まれている
決まった文字、記号があるとか、またはその逆みたいな
いらない行を判断出来る要素があれば正規表現の検索置換で可能 あそっか、上から3行づつとかで切っていけばいけるのか
明日試してみよっと。 中1行ずつに削除なら(.*)¥n.* を ¥1に置換
中2行ずるに削除なら(.*)¥n.*¥n.* を ¥1に置換
みたいな方法でできるけど
特別な理由が無い限りエディタのマクロ使うかスクリプト使うね レスを頂い方々どうもありがとうございます。エディタのマクロでやる方がいいのですか!
これはいいことを知りました!マクロ使ったことないですがこの次に勉強してみようと思います。
>>29さん
教えて頂いた正規表現で出来ました!これでマジ助かります\(^o^)/
どうもありがとうございました。\(^o^)/ (?i)((\S+ ){5}|^(\S+ ){0,5}?)(\bAAA\b)(( \S+){5}|( \S+){0,5}?$)
英文からある単語AAAを検索して前後5文字づつ一緒に取得
ただし途中に改行がある場合は改行前まで
上の表現で目的は達成したのですが
疑問が湧いたので質問です
A|Bのような単純またはではなくて
ifのような条件で切り替えるような正規表現はありますか?
(各種のスクリプト言語に依存しないやり方で)
合わせて、上の表現よりもこうした方が良いとかあったら
よろしくお願いします。 ファイル名の置換(linuxのrenameコマンド)で
rename パール正規表現 対象ファイルで置換が出来るみたいです。
test_20140402_1810.m4aをtest_20140402.m4aに"_1800"を削除したいのですが、
rename 's/_d{4}\.m4a$/\.m4a/' test_20170402_1810.m4a
としてもうまく行かずにエラーも出ずにファイル名も変わりません。
"_"+"数字4桁"+".m4a"にマッチするようにして".m4a"に置換すればいいかと思ったのに出来ていない。
何処が間違ってますか? >>35
dのところのエスケープ
あと置換文字列はピリオドにエスケープいらない
マッチしないだけだからエラーがでなくてもおかしくない 正規表現で任意文字以外を消すにはどうしたらいいですか?
検索でヒットしたものだけ残したいということです。
よろしくおねがいします。 >>38
漠然とした質問だから漠然としか答えられないけど
キーワードを含む文全体(先頭から末尾まで)をマッチさせて
それをキーワードに置換させればいい [^(abc)]
これでabc以外の文字が全部選択できる
でもこれってどういう時に使うんだろう?
結局残るのがabcだけなら
わざわざ検索しなくてもよさそうだけど >>40
なんか勘違いしてそうな記述なんだけど?
それは、(,a,b,c,)の5文字以外の1文字を表してる
文字列abc以外を表すのなら
(?:(?!abc).) >>39>>40
レスをありがとうございます。
やろうとしてたのは下記例のような場合で、-で直接挟まれた文字のみ残したいというものです。
消-残-残--消 -残--消 -残-
消--残--消 -消 -残- - と - の間の文字列で空白文字が入っちゃいかんということならこんな感じ?
perl -ne 'print( /(?<=-)([^-\s]+)(?=-)/g ,"\n")'
こういうことじゃないならもう少し説明を。 >>44
レスをいただきありがとうございます。教えて頂いた記述はPerlということであってますよね?
Perlを導入して使ってみてからレスをお返ししようといろいろ調べていたら、大変遅れてしまい礼を欠いてしました。
いろんなサイトを見過ぎたせいか、結局導入方法が絞れないというか、よくわからなくり、
時間だけが過ぎましたので不甲斐なく申し訳ないですが兎に角お礼まで。どうもありがとうございました。 ブラウザから実行すれば、簡単
paiza.IO, codepad なら、ログインもいらない 置換でやるとすると、これでどうかな?
これなら適当なエディタやWSH(JScript)ででも実行できる
(先頭の.*?を[\s\S]*?に変えれば、改行コードは末尾のみになる)
ただ、もしかすると考慮抜けの場合があるかも
正規表現:/.*?-([^\s-]+)(?=-)|-*[^-]*?(\r)?$/mg
置換文字:$1$2 レスをくださった方々、また遅くなりましたがありがとうございます。
>>46
こんな便利なものがあるんですね!教えていただきありがとうございます。またゆっくり触ってみたいとおもいます。
>>47
質問方法の不備を自覚しました。以後気を付けます。申し訳ありません。
>>48
サクラエディタで希望どうりの置換えが出来ました。本当にありがとうございます。
たて続けになり申し訳ないのですが。できればもう一つお聞きしたいです。
下記のような英文やその他も、単語と単語の間に入る半角スペースを許容することは可能でしょうか?
-Good Morning-
-残 残-
-東京都 港区 六本木-
-残 残 残- >>49
それは別件なのか?
-a -b-
の場合、その条件なら
a b
が残ることになるけど?
それでいいなら、\sを抜くだけでもいいし、(?=-)も取ってもいい ごめん、「間に入る」だったのか
/.*?-((?:[^-\s]| )*[^-\s])(?=-)|-*[^-]*?\r?$/mg
$1 \rもいらないか
/.*?-((?:[^-\s]| )*[^-\s])(?=-)|-*[^-]*?$/mg これじゃまずい
/.*?-((?:[^\s-]| )*[^\s-])(?=-)|.*-(?:[^\s-]| )*[^\s-](?=[^-])|-*[^-]*$/mg
冗長かもしれない ↑でも問題ないけど
/.*?-((?:[^\s-]| )*[^\s-])(?=-)|.*-(?:[^\s-]| )*[^\s-](?!-)|-*[^-]*$/mg >>50-54
無理を利いてくださりありがとうございます。
実は最初の質問に穴があったので別件という形で再質問させていただきました。失礼しました。
教えて頂いた記述は完璧でした本当に感謝です!
レスも何度もくださってこの度は大変お世話になりました。 ●Regular Expressionの使用環境
Becky!
●検索か置換か?
検索
●説明
+0900以外に一致
●対象データ
+
-
+0
-0
+09
-09
+090
-090
+0900
-0900
+09000
-09000
+09010
-09010 +
-
+0
-0
+09
-09
+090
-090
-0900
+09000
-09000
+09010
-09010
よろしくお願いします
※"+0900を含まない"を"+0900以外"を含むで実現したいです Beckyで使えるかは知らんけど
^(?!\+0900$).* zip版をダウロードしてchmヘルプファイルを見てみたら、
正規表現は本当に基本的なものしか無かった
(?!)はおろか()とかのキャプチャ自体無い(括弧は優先順位が上になるだけ)
[abc-d]もダメ( ([ab]|[c-d])と分けて書くらしい)
だから、やるなら
^[^+]|^\+$|^\+[^0]|^\+0]$|^\+0[^9]|…と全ての場合を併記するしかないかも 鬼車や鬼雲使わず独自実装なんだね。シェアウェアだからかな
非包含か先読みを使えなきゃ実質無理だと思う
^\+0900$ の方をどうにかする運用を考えた方が良い
Beckyの公式のメーリングリストや掲示板で正規表現じゃなく具体的にやりたい事を質問してみたら?
上手い運用方法を思い付いてくれる人が居るかも GPLならいざ知らずPCREや鬼車, 鬼雲もBSDライセンスだからなぁ
誰か外部の高機能正規表現ライブラリを利用するプラグインとか作ってそうだけど >>57
if ≠"+0900" みたいなやり方が1番簡単だけど正規表現だと面倒
≠ や = にまで拡張した正規表現があればいいんだ >>56分かる方いたら教えてください
よろしくお願いします ほらよ。使い物になるかは知らんが示された対象データにおいては要件を満たす
^(.{,4}|-0900|.{6,})$
量指定子の{}が使えないなら
^(.|..|...|....|-0900|......)$
Beckyの仕様が一般的なPerlの正規表現とは違うならここで聞いても分かるやつ少ないだろうし
後出しする必要が出たらBeckyの方で聞いた方がいいぞ >>63
+0900のみのデータなんて普通は無いよね
こういうのはJSTとかの時刻の後ろにつくもんじゃないの?
何がしたいのかよく解からないんだが?
フィルタで使うんなら、〜が「ある時」「ない時」と選択できるようだから、
「ない時」にチェックすれば君の要件どうりなら、指定は^+0900$でよいことになる(+0900のみがない時ということになるけど)
だけど、上で疑問視したように+0900の前に時刻があるならマッチしなくなるよ +のエスケープし忘れた(仕様にエスケープはあるよね?) レスくださったみなさんありがとうございます
>>58>>60
使えませんでした
>>59
そうなんです、基本的なものしかないのでどうすればいいのか分からず
>>62
ですね
>>64
使い物にならん!
>>65
+0900以外がある時(>>56の求める結果)と+0900がない時だと、前者
じゃないと駄目なんです
自分でなんとか書いてみました
(\-[0-9][0-9]*)|(\+0[0-8][0-9]*)|(\+09[1-9][0-9]+)|(\+[0-9]*[1-9]$)|(\+09[0-9]?[1-9]+[0-9]?)|(\+0900[0-9]+)|(\+090$)|(\+0$) Beckyって基本的なものとはいえ正規表現使えるのか、いいなぁ
会社で強制使用のOutlookなんか and or しかない上に
検索語を入力中に変なところで勝手にor区切りするわフォーカス外れるわでもうムチャクチャ
仕事で何年も前のメール探すのに絞り込めなくて、最終的には数百通人間grep状態しょっちゅう… ^(\+|-|-0900)(.?|..|...|([1-9].|.[0-8])..|..([1-9].|.[1-9])|.....+)$ ^(.|-0900)(.?|..|...|(([1-9]|\D).|.([0-8]|\D))..|..(([1-9]|\D).|.([1-9]|\D))|.....+)$ ^(.|-0900)(.?|..|...|([^0].|.[^9])..|..([^0].|.[^0])|.....+)$ ^(-0900|.(.?|..|...|([^0].|.[^9])..|..([^0].|.[^0])|.....+))$ ^[^+]*$|\+(|0*[0-9]|0*[1-9][0-9]|[1-9][0-9][0-9]|0([1-7][0-9][0-9]|8[0-9][0-9])|0(90[1-9]|9[1-9][0-9])|[1-9][0-9][0-9][0-9]|[0-9][0-9][0-9][0-9][0-9]+)([^0-9]|$)
●入力と結果(✓一致 ❌不一致)
✓ Sat May 24 08:05:44 2014
✓ Tue Mar 28 06:21:47 2017 +
✓ Tue, 26 Jul 2016 23:55:46 -0
✓ Wed, 05 Oct 2016 15:24:09 -0900
✓ Wed, 4 Mar 2015 08:39:08 +09000
✓ Fri, 30 Oct 2015 07:56:41 +00900
✓ Wed, 4 Mar 2015 08:39:08 0900
❌ Wed, 25 Mar 2009 14:18:41 +0900
❌ Tue, 8 Mar 2016 16:11:55 +0900 (JST)
❌ Sat, 24 Jul 2004 03:48:21 +0900<br> >>68
wanderlust使ってて十分だがmaildirでファイル保存してるのでなんでもありだ >>72
質問に忠実な正規表現ありがとうございました
>>73
きゃー素敵!と冗談はさておき
まさに望んでいたものでした、本当にどうもありがとうございました! 正規表現を勉強し始めた者です
>>73の正規表現について2つ質問させて下さい
展開すると以下のようになりますよね
^[^+]*$ 「+」が無い行に一致。残りは「+」が在る行
(
「+」に数字が続く場合の0〜3桁とその先頭に0が続くパターン ※Q1
\+
\+0*[0-9]
\+0*[1-9][0-9] [1-9]なのは0*0[0-9]は0*[0-9]に含まれているから
\+[1-9][0-9][0-9] 3桁目で0*とすると0900にマッチしてしまう
4桁で「0900以外」のパターン ※Q2
\+0[1-7][0-9][0-9]
\+08[0-9][0-9]
\+090[1-9]
\+09[1-9][0-9]
\+[1-9][0-9][0-9][0-9]
\+[0-9][0-9][0-9][0-9][0-9]+ 5桁以上
)
([^0-9]|$) 続く文字が数字以外もしくは行末。これが無いと+0900に3桁以下の式でマッチしてしまう
Q1
3桁までの表現に0*としてるのはなぜなのでしょうか?
素人考えには
[0-9]?
[0-9][0-9]
[0-9][0-9][0-9]
で良いのでは?と思うのです。 [0-9]?|[0-9][0-9][0-9]? これでも0〜1桁と2〜3桁になりますよね?
「0*」という書き方の方が処理が速くなったりとか何か理由があるのでしょうか? Q2
\+0[1-7][0-9][0-9]
\+08[0-9][0-9]
[1-7]なのは00の場合1〜3桁の式と被るから1からなのだと思うのですが
この2つは合わせて \+0[1-8][0-9][0-9] としてはダメなのでしょうか?
「0900以外」の4桁の数字のパターンは以下のようになるかと思います
[1-9][0-9][0-9][0-9] 0xxx
[0-9][0-8][0-9][0-9] x9xx
[0-9][0-9][1-9][0-9] xx0x
[0-9][0-9][0-9][1-9] xxx0
被っているところを数値に置き換え
[1-9][0-9][0-9][0-9]
0 [0-8][0-9][0-9]
0 9 [1-9][0-9]
0 9 0 [1-9]
一応Q1と合わせ疑問に思ったところを書き換えて>>73さんのサンプルと+0〜+10000と+0000〜+9999をテキストに書き出して
テストしてみたところ問題無さそうなのを確認したのですがそれでも確信が持てず質問させて頂きました
試した式は以下になります
^[^+]*$|\+([0-9]?|[0-9][0-9]|[0-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|0[0-8][0-9][0-9]|09[1-9][0-9]|090[1-9]|[0-9][0-9][0-9][0-9][0-9]+)([^0-9]|$)
^[^+]*$|\+((|[0-9][0-9])[0-9]?|([1-9][0-9]|0[0-8])[0-9][0-9]|09([1-9][0-9]|0[1-9])|[0-9][0-9][0-9][0-9][0-9]+)([^0-9]|$)
^[^+]*$|\+(|090[1-9]|((([0-9][0-9]+|(|[1-9]))[0-9]|(|0[0-8]))[0-9]|(|09[1-9]))[0-9])([^0-9]|$)
身近に聞ける人が居ないので自分の解釈が間違っていたり何か見落としているのではないか?と悶々としております
どなたか分かる方が居られましたら2つの疑問点の回答をお願いしたいです
また解釈を間違えている箇所がありましたらそちらも指摘下さい。よろしくお願いします >>76-77
どちらも深い意味はないよ
行き当たりばったりで何とかテストに通るようにしただけだから
> 3桁までの表現に0*としてるのはなぜなのでしょうか?
コメント付けてくれた通りまさしく「0〜3桁とその先頭に0が続くパターン」
という順序で考えてたから結果的にそうなったのだと思う
まず0から999に一致するパターンを書いて、それに 0 が先行する場合 0* を足して
でも 0900 には一致しないように… とかそんな感じ
> この2つは合わせて \+0[1-8][0-9][0-9] としてはダメなのでしょうか?
ダメじゃない
その辺りはこのジェネレーターで生成した正規表現をもとにしてる
Regex Numeric Range Generator
http://gamon.webfactional.com/regexnumericrangegenerator/
100–899 ⇒ ([1-7][0-9]{2}|8[0-8][0-9]|89[0-9])
たまたま 8[0-8][0-9] と 89[0-9] がまとめられると気がついたのでそこは直したけど
全部まとめられるとは気づいてなかっただけ >>78
回答ありがとうございます
つい先日覚え始めた身ながらも>>73さんの式に感銘を受け是非とも理解したく思い
分からない事だらけの中、自分であれこれ分解したり試したりしていたのですが
疑問に思った点を自力で晴らす事が出来ず質問させて頂きました
未熟故に不理解な部分があるのではないかと思っておりましたが
「どちらも深い意味はない」との事で少々肩透かしでしたが安心しました
無知故に身構え過ぎていたようです
作成の経緯や方法まで丁寧に説明して頂きありがとうございました
今後の参考にさせて頂きます。感謝! >>80
それも少し思ったんだが重箱の隅をつついてると受け取られ答えてもらえないんじゃないかとか色々悩んだ末 出来るだけ丁寧にとこうなった
もし次があったら気を付ける。すまんかったな 丁寧な方がいいに決まってる
>>80はバカだから長文がウザいことに気付かず
丁寧語がウザいと的外れな指摘をしている。 >>83
自分を非難している相手を擁護するのは変な感じだが
バカかどうかはあの一文からは分からないでしょ
それに自分も慇懃無礼にあたらないかとは危惧していたし的外れとは言えないと思う
何でも度が過ぎるのは良くない
だが齟齬を生じさせないようにする為にはこういったスレで長文になるのは仕方なくないか?
身の丈に合わない質問して「この解釈で合ってる?」みたいな聞き方した自分にも非があるとは思うが
バカ丁寧禁止より長文禁止の方が厳しいと思うわ 正規表現で数字は、[0-9] または、\d
[0-9][0-9] なら、\d{2} と同じ 丁寧なことが必ずしも良いとは限らない
質問するときは相手のことも考えて無駄を省くことが大事
質問を整理している間に自分で気付くこともある >>84
>バカ丁寧禁止より長文禁止の方が厳しいと思うわ
読む側は馬鹿丁寧な長文=好感が持てる、長文でも許せる
丁寧でないけど長文=丁寧でない癖に長文だとぉ〜?!許せん
ってなる 長文NGしてれば見なくて済むのにわざわざ見てウゼェ言ってる奴って
マゾなの?やり方分かんないバカなの?ウゼェ言ってる俺カッケーな池沼? ダ・ヴィンチ曰く「単純であることは究極の洗練だ」
今回の例にどれほど当てはまるかはわからんが、目指すのはそこだ。 検索置換を教えて下さい。
行末の半角数字(桁数はまちまち)を行頭に移動したいです。
──────────────
■置換前■
abc1
東44
4-123
あいうえお02
──────────────
■置換後■
1abc
44東
1234-
02あいうえお
──────────────
使ってるエディタはgpadです。サクラエディタもあります。宜しくお願い致します。 >>92
gpadやサクラエディタは知らんけどJSならこんな感じ
replace(/(.*?)([0-9]*)¥n/g, "$2$1¥n")
最後の行にも改行がある前提
なければ入力の最後を示す$をOR条件として指定する >>93
ありがとうございます。レスをいただき申し訳ないのですが、
最初に書いているようにテキストエディタでできる検索置換を教えて頂きたいのです。 >>94
gpad の[検索]-[置換]で
検索文字列 ^(.*\D)(\d+)
置換文字列 $2$1
とかかな >>95
すごいできます!即レスありがとうございました!感謝です! ●Regular Expressionの使用環境
Bash on Ubuntu on Windows での sed
●検索か置換か?
置換
●説明
[ と ] で括られた最初の文言以外を削除したい
●対象データ
aaa[bbb]ccc
[ddd]eee
fff[ggg]hhh[iii]jjj
kkk
●希望する結果
bbb
ddd
ggg
空行、もしくは、そのまま(上記だとkkk)
cat hoge.txt | sed -e 's/.*\(\[.*]\)/\1/g'
で行けそうな気がしたんですが、結果は
[bbb]ccc
[ddd]eee
[iii]jjj
kkk
この有様。誰か助けてください。 cat test.txt | sed -E 's/[^\[]*(\[[^\[]*\]).*/\1/g'
sedはnon-greedyサポートしてないので[^\[]*で
"["以外の文字にマッチするように指定する >>98
cat hoge.txt | sed -e 's/\].*\|.*\[//g'
これだと3行目が2つ目の [ ] のを拾ってしまった。
bbb
ddd
iii
kkk
>>99
cat hoge.txt | sed -E 's/[^\[]*(\[[^\[]*\]).*/\1/g'
[bbb]
[ddd]
[ggg]
kkk
狙い通りのが拾えました。[ ] が付いてくるけどそれは自分で外します。
どうもありがとうございました。 ■ このスレッドは過去ログ倉庫に格納されています