Regular Expression(正規表現) Part14at TECH
Regular Expression(正規表現) Part14 - 暇つぶし2ch588:デフォルトの名無しさん
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回以上のループで正しく動くのは面白いな
一番外側の (?: )* はいらないかも

643:583
18/09/21 05:18:40.73 LI7qokUP.net
(?# 主要部)
<xx(?&Attribute)>(?&innerText)(?&roop)?+</xx>
(?# 定義部)
(?:|(?!)
(?'Attribute'(?:\s[^>]*+)?+)
(?'singletag'br)
(?'tagname'[a-z][a-z\d]*+)
(?'innerText'
(?: [^<]*+
| <(?&singletag)(?&Attribute)>
)*+
)
(?'roop'
<(?'tag'(?&tagname))(?&Attribute)>
(?&innerText)(?&roop)?+
</\k'tag+0'>
(?&innerText)(?&roop)?+
)
)

644:デフォルトの名無しさん
18/09/21 05:54:00.34 LI7qokUP.net
こだわった点
・主要部と定義部に分けて全体の構造が分かりやすくした
・繰り返しは全て強欲。無駄なバックトラックをさせない
・再帰には * を使わず、部分呼び出し自身に繰り返しをさせている
・定義部は (?:|(?!) ~ ) として定義部がサーチに使われるのを避けている
>>607には ([^<]*|\g<-3>)* という部分があって
([^<]*)* というバックトラック処理がえらいことになる部分があって気になった
あと再帰を使ってるのにループを * にさせているのを見て
* を使わずに書けるはずだと思って作ってみた

645:デフォルトの名無しさん
18/09/21 06:11:13.31 LI7qokUP.net
こういう書き方をした正規表現をサクラエディタで使おうとすると
1行に繋げなければならない、これでは不便すぎる
鬼雲の強力な正規表現を快適に使い倒せるようにするべき
出来れば複数行で書いた正規表現を1行に繋げる機能が欲しい
そうすればここのような掲示板に貼るときに便利
 逆に1行で書かれた正規表現を複数行に直す機能も欲しい
手動でいちいち改行を入れる手間が省けて快適になる
この2つの機能は正規表現ライブラリに実装されることが望ましい
そうすれば他のテキストエディタの作者も気軽に実装出来るようになる
正規表現に新しいメタ文字が作られたときの対応も容易になる

646:デフォルトの名無しさん
18/09/21 06:18:04.46 LI7qokUP.net
出来れば定義用の新しいコマンドが欲しい
定義のためのカッコなのにキャプチャが有効になってたり、
正規表現オブジェクトが無駄に肥大化してしまったりするから

647:デフォルトの名無しさん
18/09/21 07:17:48.30 fJq/snux.net
>>628
> 出来れば複数行で書いた正規表現を1行に繋げる機能が欲しい
ここはム板なので言い出しっぺの法則が適用されます

648:583
18/09/21 19:24:14.97 LI7qokUP.net
>>630
テキストエディタの正規表現の入力ウインドウに付けて欲しいんだ
次世代のテキストエディタは↓こうなって欲しい
1、画面をいっぱいに使って正規表現の複数行の記述が出来る
2、複数行で書かれた正規表現を一行に繋げるボタン
3、一行で書かれた正規表現を複数行に展開するボタン
これがスタンダードになるといいな

649:デフォルトの名無しさん
18/09/21 20:42:25.54 c6u7OXiZ.net
>>631
ガンバ w

650:デフォルトの名無しさん
18/09/21 20:44:43.75 OGYiByDT.net
やっぱそうなるよな ここではw

651:デフォルトの名無しさん
18/09/21 23:08:38.86 3+OghnRP.net
extendedフラグを付けて鬼雲に渡せば、複数行で処理してくれる。
エディタ側で1行にくっつけたりする必要はない。

652:583
18/09/21 23:41:08.24 LI7qokUP.net
>>634
そういうことじゃないんだな、>>628を読んでね
ちなみに複数行の正規表現を一行に繋げるのはかなり簡単なんだけど
一行で書かれた正規表現を複数行に展開するのはかなり難しい
正規表現のパーサを作るということになるから
だから正規表現ライブラリに実装されることが望ましい
ライブラリの作者なら細かい挙動まで把握しているから正確なパーサが作れる
逆にテキストエディタの作者がやろうとすると動作を把握しきれずに
不完全なものになったり、実装を諦めたりすることになりかねない
複数行をスタンダードにするためにはライブラリ側での実装が必須となる

653:デフォルトの名無しさん
18/09/22 02:13:48.20 EPQO3h7N.net
>>635
鬼雲とbregonig.dllの作者さんまでどうぞ
URLリンク(twitter.com)
URLリンク(github.com)
URLリンク(github.com)
URLリンク(k-takata.o.oo7.jp)
あと鬼車オリジナルの作者さんも復活してたんだね
URLリンク(github.com)
(deleted an unsolicited ad)

654:583
18/09/22 21:31:53.89 SLHR4wJP.net
>>636
bregonig.dllはプログラミング用のライブラリをテキストエディタでも
使えるようにしたっていう感じなのでプログラミングに必要のない機能は
付けたくないと思う、管理が大変になるからね
だから次世代の正規表現ライブラリと次世代のテキストエディタに期待
ちなみにテキストエディタに重きを置いたライブラリならこんなのが可能になるはず
検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) )
置換:\k'color'
対象テキスト: blue
置換結果:青
現状の bregonig.dll でこれが出来ないということはプログラミングでなんとかなる
機能は付けないということ
テキストエディタのほうは改行をまたぐマッチの実現に苦戦してるようで
この問題が解決しないと高度な正規表現は宝の持ち腐れになるだけなので
次世代のテキストエディタに期待しましょう
>鬼車オリジナルの作者さん
別人だとは知りませんでした^^;

655:デフォルトの名無しさん
18/09/26 01:40:37.36 3FykrnoG.net
xyz? を含まないものにマッチする正規表現
URLリンク(www.din.or.jp)
URLリンク(www.din.or.jp)
> fmcat =(retofm
..のところで導かれている正規表現は明らかにxyやxyzを含む正規表現だけど
これは単なるミスなのかな?こんな難しいことをやってる人がこんなミスを
見逃すとはとても思えないから何か違うものなのかなぁ・・

656:デフォルトの名無しさん
18/09/26 03:09:00.10 Rr41G2Hg.net
明らかに含むって試してから言ってる?

657:デフォルトの名無しさん
18/09/26 10:58:06.87 3FykrnoG.net
>>639
> fmcat =(retofm
で始まる3行のところの正規表現についてですよ?
(~)* x (~)* yz の形なので明らかにxyzにマッチします
*y(x*[^xy]y*)*x* は誤植でしょうけど・・

658:デフォルトの名無しさん
18/09/26 14:05:39.88 pN+YCTD5.net
あー確かににそこはおかしいな
引用っぽいけど

659:デフォルトの名無しさん
18/09/26 23:39:54.65 3FykrnoG.net
やっぱり間違いなんですかね?
プログラムを使って自動的に算出してるようなのに・・

660:デフォルトの名無しさん
18/09/27 00:18:43.29 0xNuoCxe.net
俺もわからんけど、prologらしいから、括弧や表記はスタック順になってるとかでは?

661:デフォルトの名無しさん
18/09/27 02:58:15.53 TOnM2DUW.net
>prolog
なるほど、"xyを含まない正規表現" のところに grail って書いてあったのは
prologとやらの実行ソフト名だったのか
URLリンク(github.com)
これの使い方を調べれば謎が解けそうですね
暇なときに試してみます、ありがとう

662:デフォルトの名無しさん
18/10/06 17:50:41.16 0JYIRqz1.net
検索対象文字 <test>a="akari"desu</test>
正規表現 a="*"
で、検索結果が「a="akari"」でなく、「a="」しか取得できないのはなぜでしょうか?

663:デフォルトの名無しさん
18/10/06 17:56:12.23 e52HQVrn.net
馬鹿には無理

664:デフォルトの名無しさん
18/10/06 18:01:22.57 FAIH8E2E.net
a=\".*\"
メタ文字(ダブルクォート)をバックスラシュでエスケープ
.(ピリオド)で任意文字で0文字以上(アスタリスク)をつければ
とりあえずイケル
それでも意図どおりにマッチングしないことは予見できる

665:デフォルトの名無しさん
18/10/06 18:14:31.01 OZkGL/sg.net
ワイルドカードと混同しちゃってるのか
ワイルドカードと正規表現を同時に使えるTresGrepなら動くかも

666:デフォルトの名無しさん
18/10/06 18:16:35.11 OZkGL/sg.net
正規表現っぽいIDになった?

667:デフォルトの名無しさん
18/10/06 18:23:52.49 OZkGL/sg.net
OZk   G    L     /sg
ohzakiさんゲームのリンク
な気がしたので貼る、最近更新したばっかりやん
ゲーム関係のリンク
URLリンク(www.din.or.jp)

668:デフォルトの名無しさん
18/10/14 12:53:05.30 zaukh1NH.net
>>645
ワロタw
正規表現の*とワイルドカードは違うぞ。詳しくはググれ。
多分a="[^"]*"でいけると思うけど詳しくはググれ。

669:デフォルトの名無しさん
18/10/14 14:33:15.06 eP/1gSav.net
ちょいと質問させて
a="[^"]*"
と書くことが多いんだけど
a=".*?"
と書くのとで結果に違いでるのかな? <


670:デフォルトの名無しさん
18/10/14 14:56:27.64 EqzxaMkD.net
""のなかに改行が含まれてた場合、違いが出るよ

671:デフォルトの名無しさん
18/10/14 15:11:22.83 zaukh1NH.net
あと、.*?は使えない正規表現の処理系があるんじゃなかったっけか。詳しくは(ry

672:デフォルトの名無しさん
18/10/14 15:27:34.24 eP/1gSav.net
>>653-654
なるほど、ありがとうございました

673:デフォルトの名無しさん
18/10/14 22:51:29.78 yTLvFK6H.net
1、<test>a="[^\"]*"</test>
2、<test>a=".*?"</test>
この2つが↓これにどうマッチするか試してごらん
---------------------------------------------------------------------------
<test>a="pokemon"(^-^)</test> <test>a="doramon"</test>
----------------------------------------------------------------------------

674:650
18/10/14 23:38:50.12 wMwKNjnw.net
>>656
サンプルありがとう
でも、そういった検索/置換対象の場合だったら .*? は最初から考えないとは思う

675:デフォルトの名無しさん
18/10/15 00:13:04.80 fKW/Yset.net
この誤爆のことに注意を払えているなら .*? で問題ないよ
[^"] はそういう心配をしなくて良くなるからこっちを予防的に使うのもあり

676:デフォルトの名無しさん
18/10/15 22:36:58.63 fKW/Yset.net
# 文字列 xy を含まない正規表現
$states = 3;
@matrix = ( # E A p q ※ A は求める答え
[qw(X X E E)], # A = p + q = pε + qε
[qw(E X [^x] [^xy])], # p = p[^x] + q[^xy] + ε
[qw(X X x x)], # q = px + qx
);

677:デフォルトの名無しさん
18/10/15 22:37:39.83 fKW/Yset.net
# 文字列 xyz を含まない正規表現
$states = 4;
@matrix = ( # E A p q r ※ A は求める答え
[qw(X X E E E)], # A = p + q + r = pε + qε + rε
[qw(E X [^x] [^xy] [^xz])], # p = p[^x] + q[^xy] + r[^xz] + ε
[qw(X X x x x)], # q = px + qx + rx
[qw(X X X y X)], # r = qy
);

678:デフォルトの名無しさん
18/10/18 14:54:58.45 s3Db0e4D.net
y*(x*[^xy]y*)*x* について考察
左右対称形、後ろから読めば yx を含まない正規表現になる
x の後ろでは [^xy] しかマッチ出来ないようになっている
{[^x]|x+[^xy]}*x* # 状態遷移図から導かれる正規表現
# ※ ここでは見やすいように ( ) を { } としている
# 最後の x* は状態 0 から状態 1 への遷移を表している
[^x]*{x+[^xy][^x]*}*x* # 分岐の繰り返し ( | )* の展開
([^xy]|y)*{x+[^xy]([^xy]|y)*}*x* # [^x] を ([^xy]|y) に分解
y*{x*[^xy]y*}*x* # x+ を x* にすると中央の [^xy] が分解した [^xy] と
# 同じを動作するので分解した [^xy] を消せる、完成

679:デフォルトの名無しさん
18/10/18 23:54:36.85 s3Db0e4D.net
こっちのほうがスマートだ..
# 状態遷移図から導かれる正規表現
([^x]|x+[^xy])*x*
# [^x] を分解し、[^xy] と y にする
([^xy]|y|x+[^xy])*x*
# [^xy] と x+[^xy] を1つにまとめる
(y|(x+)?[^xy])*x*
# (x+)? は x* に書き換えられる
(y|x*[^xy])*x*
# 分岐ループを展開して完成
y*(x*[^xy]y*)x*

680:デフォルトの名無しさん
18/10/20 20:45:04.19 WB0b2hD6.net
(a|b|c)* の展開についての考察
# (b|c) を1つのパーツと考えて {a|(b|c)}* を展開する
a*{(b|c)a*}*
# 分配の法則
a*{ba*|ca*}*
# 再び (x|y)* の形が現れたのでここを展開する
a*(ba*)*{ca*(ba*)*}*
a=123、b=456、c=789 とすると
^(123)*(456(123)*)*(789(123)*(456(123)*)*)*$

681:デフォルトの名無しさん
18/10/21 19:43:06.22 7AODCPK7.net
(a|b|c|d)* の展開についての考察
a*(ba*)*{ca*(ba*)*}* の a は全て a* の形になっているのでこれを利用する
a を (a|d) に置き換えることで分岐を1つ増やす
(a|d)* = a*(da*)* なので a* を a*(da*)* に置き換えるだけで答えが求まる
a*(da*)*(ba*(da*)*)*(ca*(da*)*(ba*(da*)*)*)*
(a|b|c|d|f)* を求めたいときは同じように a* を置き換えるだけで求まる
このように a* は分岐を無限に増やす入り口のような役割をする

682:デフォルトの名無しさん
18/10/21 23:04:31.26 mkrTRrBN.net
このスレで名前が挙がってたTresGrep、気が付いたらbregonig.dllにも対応してるじゃん
プルダウンのモード切替で.NETの正規表現と切り替えられるのもいい感じ
もうこれでサクラエディタのGrepはお役御免にできるかもしれない
なんだけど・・・rubyの正規表現が全部使えるわけじゃないのに
「鬼雲検索」
を名乗るのはどうなんだろう

683:662
18/10/22 01:40:50.08 oA8lJo/T.net
>>665
ちょろっと試してみたけど戻り読みも後方参照も再帰もちゃんと動いたよ?
動かないのがあるならこちらで検証するよ~

684:名無しさん@そうだ選挙に行こう! Go to vote!
18/10/22 07:15:14.86 nc1bV2B+.net
全角スペースを\u3000と書いた場合とか
bregonigだとperl互換じゃない書き方は受け入れてもらえないわけで

685:662
18/10/22 14:03:03.71 oA8lJo/T.net
自分は文字コードの知識が無いので迂闊なことは言えないから
ちょっと調べたことだけ書いておくね
ここで
URLリンク(k-takata.o.oo7.jp)
\u0149 を検索してみるとbregonigでも使えてそうなことが書かれてたよ

686:662
18/10/22 21:23:16.87 oA8lJo/T.net
サクラエディタでいろいろ実験してたら \s が全角スペースにマッチした
サクラエディタ向けの正規表現を作るときには気を付けないといけないな

687:デフォルトの名無しさん
18/10/22 23:33:25.25 aIOUU5bU.net
bregonigは鬼雲の機能限定版(perl互換の正規表現だけが動く)って話をどこかで読んだ記憶があったんだよね
どうせやるなら本家onigmoのRuby版正規表現も全部動くようにすればいいのに、って思っただけなんだ
ちょっと難癖に近いなとは自分でも思ってる
\sもそうだけど\dに全角数字がマッチしちゃって痛い目に合うのもまれによくあること
サクラに限らないんじゃないかね

688:デフォルトの名無しさん
18/10/23 00:10:38.63 W9szHIq5.net
I/Fの問題だろう
Onigmoの仕様では、\sは
 Unicode以外の場合:
  \t, \n, \v, \f, \r, \x20
 Unicodeの場合:
  0009, 000A, 000B, 000C, 000D, 0085(NEL),
  General_Category -- Line_Separator
             -- Paragraph_Separator
             -- Space_Separator
 ASCII外の文字を含むかどうかは ONIG_OPTION_ASCII_RANGE オプションに依存する。
とある
実際、サクラエディタで試すと、
 2028(LS),2029(PS),
 0009,000a,000b,000c,000d,0085,
 0020,00a0,1680,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,200a,202f,205f,3000(SS)
がマッチする
なので、サクラエディタはUnicodeで鬼雲を使ってると思われる
Janeの場合でも、StyleはSJISであり、XenoはUnicodeなので
スレリンク(software板:515番)
に対して、\d{6}がマッチするのはXenoのみである

689:662
18/10/23 00:11:35.27 FESm7ID8.net
なるほど、dll からは ONIG_SYNTAX_PERL しか使えないから
ruby を使い慣れてる人にとっては歯がゆいと..
> \dに全角数字がマッチしちゃって
ですね~、(?a) で防げるようなので覚えておきます

690:デフォルトの名無しさん
18/10/23 00:18:39.55 FESm7ID8.net
レスが被ってしまった..
>>671
ありがとうございます
サクラエディタはUnicode仕様で動いているんですね
う~ん、文字コードの話は難しいなぁ

691:デフォルトの名無しさん
18/10/23 00:24:56.92 W9szHIq5.net
なおUnicodeの空白でも、上記のCc(0009~0085)、LS,PS,Zs(Space Separator)
以外のCf(200b,200c,200d,FEFF)だとどうかなと試したが案の定マッチしなかった
さすがは仕様どおりだ

692:デフォルトの名無しさん
18/10/23 01:02:05.21 FESm7ID8.net
> 200b,200c,200d,FEFF
サクラエディタにIMEパッドから打ち込んで試してみたら同じくマッチせず
# 主要部
(?&sp)
# 定義部
(|(?!)
(?<sp>
(?u)
[\x{200b}\x{200c}\x{200d}\x{FEFF}\s]
)
)
自分がこれ使うことは永遠になさそうだけどとりあえず..

693:デフォルトの名無しさん
18/10/23 03:03:21.50 FESm7ID8.net
>>3
ジオから移転
正規表現パズル
URLリンク(oraclesqlpuzzle.ninja-web.net)

694:デフォルトの名無しさん
18/10/25 14:38:08.86 4OmhnPU0.net
あるファイルパスがありディレクトリのN階層目までのみを抽出したいのですが、正規表現について教えてください
例えばこんな入力のリストがある場合
aaa
aaa/bbb/ccc
aaa/bbb/ccc/ddd/eee/fff
で各リストに対して2階層目までを取得したい場合
aaa
aaa/bbb
aaa/bbb
となるのが期待値です。
((?:¥w+¥/?){1,2})とかしてみたんですが上手くいきませんでした、お手数ですがよろしくお願いします

695:デフォルトの名無しさん
18/10/25 15:23:45.93 RdSksp9Y.net
>>677
正規表現はプログラム言語や正規表現オブジェクトのオプションによって
動作がけっこう変化するので質問するときはそういうの書いてね
[^/]+(?:/[^/]+)?
ただしこれは正しいパスが与えられることを前提としているので注意

696:デフォルトの名無しさん
18/10/25 15:29:23.12 ZE3NVml1.net
/ の数が、0~2

697:デフォルトの名無しさん
18/10/25 15:39:26.06 5Cy/pQlU.net
./ で始まってたらどう数えるん
/ で始まってたら?

698:デフォルトの名無しさん
18/10/25 17:47:09.80 4OmhnPU0.net
>>678
ありがとうございます、perlが希望でしたので次回から書くようにします
例は2階層で固定のようですが、ちなみにn階層目とか可変で書くような場合は下記のような感じで良いでしょうか?
[^/]+(?:/[^/]+){0,n-1}

699:デフォルトの名無しさん
18/10/25 18:40:41.61 RdSksp9Y.net
ああ、N階層までのマッチという質問だったのか、ごめんね
それで合ってるよb

700:デフォルトの名無しさん
18/10/26 10:18:13.83 MwloQati.net
暇つぶしに鬼雲の再帰処理に欠陥がないか探してみたけど見つからなかった
例、\1 を空文字にマッチさせて再帰の無限ループを狙う
()(?<name>a|\1\g<name>c)
例2、<x> を複数使ってマッチするのが空文字ではないように見せかける
(?<x>)(?<x>text)(?<name>a|\g<x>\g<name>c)

701:デフォルトの名無しさん
18/10/26 23:39:01.03 MwloQati.net
・perl 5.22
if ( "a" =~ /^\Fa\E$/ )
{ print "match.\n"; }
else
{ print "no.\n"; }
# 結果: match.
・ サクラエディタ + bregonig.dll (ONIG_SYNTAX_PERL)
検索欄: ^\Fa\E$
テキスト: a
結果: 見つかりませんでした
\F の意味が知りたい..

702:デフォルトの名無しさん
18/10/26 23:58:52.37 MwloQati.net
URLリンク(perldoc.jp)
> \F \E まで畳み込み文字にします
bregonig.dll は Perl 5.14 ほぼ準拠だからまだ未対応らしい

703:デフォルトの名無しさん
18/10/28 00:53:19.71 ZnGbnC1U.net
URLリンク(jane2ch.net)
レス241からの高速化の話題を検証してみた
レス243
>1は例えば (?:http://)~ と、始めの数バイトをグループ化してやると速くなる
検証結果: 速度変わらず
レス245
> : の部分で一旦切れるようにすれば条件は平等になると思う
> (?:http:|ttp:|tp:) が速いわけではないと分かる
検証結果:
1. 10.345 ms
2. 10.560 ms
3. 05.130 ms
結論: (?:http:|ttp:|tp:) は速かった

704:デフォルトの名無しさん
18/10/28 01:36:44.44 ZnGbnC1U.net
<鬼雲のリファレンス>
(?<element> \g<stag> \g<content>* \g<etag> ){0}
(?<stag> < \g<name> \s* > ){0}
(?<name> [a-zA-Z_:]+ ){0}
(?<content> [^<&]+ (\g<element> | [^<&]+)* ){0}
(?<etag> </ \k<name+1> >){0}
\g<element>
<とんこ式記述法>
\g<element>
(?!(?!)tonco
(?<element> \g<stag> \g<content>* \g<etag> )
(?<stag> < \g<name> \s* > )
(?<name> [a-zA-Z_:]+ )
(?<content> [^<&]+ (\g<element> | [^<&]+)* )
(?<etag> </ \k<name+1> >)
)
リファレンス方式は後ろの {0} を読むまでそこが定義だと分からない
main部と定義部の境がはっきりせず読みにくい
対してとんこ式は (?!(?!)tonco 以降が定義部だと分かるので読みやすい
(?!(?!)tonco を とんこ で辞書登録しておけば {0} をコピペしなくて済む
とんこ式の とんこ とは発案者の名前とのこと

705:デフォルトの名無しさん
18/10/28 14:53:16.06 ZnGbnC1U.net
これらの記述法には1つ弱点があり
(?<name>ほにゃらら){0}
より前に
\k<name>
が出現すると文法エラーになる
例、
(?<tag>foo \k<name> bar){0}
(?<name>ほにゃらら){0}
\g<tag>
このため定義する順序が限定されてしまう、これは解消されるべき問題である

706:デフォルトの名無しさん
18/10/28 15:07:39.92 ZnGbnC1U.net
↑これの例はおかしいな、このレスは取り消し

707:デフォルトの名無しさん
18/10/28 15:36:10.31 ZnGbnC1U.net
昨日、詳説 正規表現の本を枕の下に置いて寝た
寝ている間に正規表現のパワーがもらえると思ったからだ
すると.. 夢に正規表現の神様が現れた
神様 「 \1 はな、 ${1} と書いてもマッチするんじゃよ」
朝、目覚めると飛び起きてperlを動かしてみた
if ( "aa" =~ /(a)${1}/ )
{ print "match!!\n"; }
else
{ print "no match..\n"; }
実行結果を見た私は奇跡を見ていた

708:デフォルトの名無しさん
18/10/28 20:54:51.63 ZnGbnC1U.net
revilog.com/2012/08/7939.html
> a?[a-z] という正規表現は [b-z]|aa? という正規表現と
> 等価であり置換可能
前者は ab にマッチするが後者は...
> 同様に[a-z]?[A-z]という正規表現は [A-Z]|([a-z][a-z]?)
> という正規表現と 等価であり置換可能
前者は aA にマッチするが後者は...

709:デフォルトの名無しさん
18/10/29 00:52:40.24 BYis7ms7.net
・ perl 5.22
use strict;
use warnings;
use encoding "cp932";
binmode STDERR, ':encoding(cp932)';
if ( "アイウエオ" =~ /\p{Katakana}/ ){ print "match!! <$&>\n"; }
else { print "no match..\n"; }
# 結果: match!! <ア>
・ bregonig.dll (shift_jis)
検索:\p{Katakana}
対象:アイウエオ
結果:見つかりません
サクラエディタ (unicode) ではマッチした
(?a)\p{Katakana} でもマッチ

710:デフォルトの名無しさん
18/10/29 01:00:01.03 BYis7ms7.net
perl がマッチするのはもしかしたら内部的にunicodeになってるとかかな
自分はプログラマじゃないんでさっぱり

711:デフォルトの名無しさん
18/10/29 01:09:53.75 BYis7ms7.net
どうやら当たりらしい、unicodeに変換してからマッチしてた
if ( "あ" =~ /\x{3042}/ ) # true
if ( "あ" =~ /\x{82A0}/ ) # false

712:デフォルトの名無しさん
18/10/29 19:52:31.20 BYis7ms7.net
・再帰の穴を狙う2
(str)
(?<name>
(?(1)yes|no)
\g<name>
|inner)
↓これに書き換えると
(?(1)yes) → 文法エラー
(?(1)|no) → 文法エラー
ガードが鉄壁ですごい、ほんと良く出来てるな~

713:デフォルトの名無しさん
18/10/31 16:56:37.48 ZWlmxwfj.net
(?(条件)真の式|偽の式) の不具合を発見
() に "?:" を付けるかどうかで結果が変わってしまう
対象テキスト: 13 に対し、
1、
\A(?<name>1)(?(<name>)(2|3))\z
結果:マッチ
2、
\A(?<name>1)(?(<name>)(?:2|3))\z
結果:みつかりません
bregonig.dll (shift_jis, unicode 両方で確認)
ちなみに対象テキストを 12 にするとどちらもマッチする

714:デフォルトの名無しさん
18/10/31 17:14:05.35 ZWlmxwfj.net
やっぱりこれ欲しいなぁ
検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) )
置換:\k'color'
対象テキスト: blue
置換結果:青
これの有無で便利度が数段変わるんだよね
これの代わりに複数回の置換を行うと \G を使うときに困る
同じものを複数回検索するので速度低下に繋がる

715:デフォルトの名無しさん
18/10/31 19:55:08.08 ZWlmxwfj.net
・ (?'name=~' )
変数name の中身をマッチテストする先読みの親戚のようなもの
(?'name' <div> .*? </div> )
(?:
 (?'name=~' \A .* abc .* \z)
 pattern1              # タグの間に abc があるとき
|
 (?'name=~' \A .* def .* \z)
 pattern2              # タグの間に def があるとき
|
 pattern3              # それ以外のとき
)
これもあると便利だけど (?(name) | ) で代用出来るから必要度は低い

716:デフォルトの名無しさん
18/11/01 00:56:07.61 +M+OiFJp.net
動画を正規表現に変換
URLリンク(www.youtube.com)
検索: ^(.*)タマ(.*)タマ(.*)


717:$ 置換: $1$2$3



718:デフォルトの名無しさん
18/11/01 01:35:03.88 zrOHiVOt.net
ニュタマーハタマーフ

719:デフォルトの名無しさん
18/11/01 17:25:34.93 +M+OiFJp.net
(*^-^*)

720:デフォルトの名無しさん
18/11/01 17:34:43.67 +M+OiFJp.net
>>696 のバグがrubyでも起こることを確認
ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32]
原因は bregonig.dll でなく Onigumo にあるようだ
これは気付きやすい部類のバグだと思うんだけど
今までバグ報告が無かったようなのが不思議
takata神はここ見てるのかな

721:デフォルトの名無しさん
18/11/01 17:41:25.59 +M+OiFJp.net
# ruby動作確認用コード
if '13' =~ /\A(?<name>1)(?(<name>)(?:2|3))\z/
# if '13' =~ /\A(?<name>1)(?(<name>)(2|3))\z/
p 'yes'
else
p 'no'
end

722:デフォルトの名無しさん
18/11/01 23:04:15.23 dBKH7CcG.net
>>693
perlの場合、Encode::decode()でperl内部処理用文字コード(utf8の亜種っぽい何か)に
正しく復号しないと正規表現クラスを正しく使えない。

723:デフォルトの名無しさん
18/11/02 01:26:49.16 XP4jtOby.net
>>704
解説ありがとうございます
ということは今まで自分はperl内部の独自の文字コードにエンコードされた文字列に
対して正規表現を使っていたわけですね、恥ずかしながら初めて知りました

724:デフォルトの名無しさん
18/11/05 20:41:07.84 SJelCvn/.net
>>685
畳み込み文字ってなんですか?

725:デフォルトの名無しさん
18/11/05 23:47:01.14 xCFT0arz.net
(?:
  ( V ) > (0 -1)
 |
  ( . ) >  (1  0)
)
  俺も分からん

726:デフォルトの名無しさん
18/11/06 18:39:37.29 4TN3vyid.net
<正常>
(1)?
(?(1)(?:2|3)|4)
(1)?
(?(1)(?:2|3)|(?:4|5))
(1)?
(?(1)2|(?:3|4))
(1)?
(?(1)(2|3))
(1)?
(?(1)(?>2|3))
----------------------------
<異常>
(1)?
(?(1)(?:2|3))

727:デフォルトの名無しさん
18/11/06 19:30:27.97 4TN3vyid.net
<異常>
(1)?
(?(1)(?:2|(3)))
置換: [$2]
対象テキスト: 3
結果: [3]
-----------
<正常>
(1)?
(?(1)(?>2|3)|4)
(1)?
(?(1)(?>2|3)|(?>4|5))

728:デフォルトの名無しさん
18/11/06 19:36:59.61 4TN3vyid.net
>>709 の実験でバグの原因が分かった
1、不要なカッコを取り除く処理が (?: ) を取り去った
2、分岐の "|" の意味合いが変わってしまった
ということだね、原因が分かれば回避が簡単なのでこのまま放置でも良さそう

729:デフォルトの名無しさん
18/11/09 18:21:43.84 BZlL2mTg.net
perl5.14
# 1文字が2文字にマッチ
if ( "fi" =~ /\A\x{fb01}\z/i ){ print "true\n"; } else { print "false\n"; }

730:デフォルトの名無しさん
18/11/09 18:52:26.91 BZlL2mTg.net
if ( "K" =~ /\A\x{212A}\z/i ) true
if ( "K" =~ /\A\x{212A}\z/il ) false

731:デフォルトの名無しさん
18/11/09 21:22:21.15 BZlL2mTg.net
if ( "\x{212A}" =~ /[[:print:]]/ )  true
if ( "\x{212A}" =~ /[[:print:]]/a ) false

732:デフォルトの名無しさん
18/11/10 00:04:00.21 EY2CMtcP.net
\d{0,32766}
# ok
\d{0,32767}
# error "Quantifier in {,} bigger than 32766 in regex;"

733:デフォルトの名無しさん
18/11/10 00:21:29.46 EY2CMtcP.net
# \d{0,} は 32766回 を超えてマッチ可能
my $str = "";
for ( $count = 0; $count < 33000; $count++)
{ $str = $str."0"; }
print "\$str\.length = " , length($str) , "\n";
if ( $str =~ /\A\d{0,}\z/ )
{ print "true\n"; } else { print "false\n"; }
# 結果
# $str.length = 33000
# true

734:デフォルトの名無しさん
18/11/10 18:21:06.77 EY2CMtcP.net
# 検索表現の途中にある \G をマッチさせる
my $str = 'abcde';
$str =~ /abc/g;
if ($str =~ /abc\Gd/){ print "true\n"; } else { print "false\n"; }

735:デフォルトの名無しさん
18/11/13 00:16:05.06 QabZTjVa.net
# (?1) の直前に (?i) を置いても効かない
if ( "Aa" =~ m/(?i)(A)(?1)/ )
{ print "true <$1>\n"; } else { print "false\n"; }
# 結果:true <A>
if ( "Aa" =~ m/(A)(?i)(?1)/ )
{ print "true <$1>\n"; } else { print "false\n"; }
# 結果:false

736:デフォルトの名無しさん
18/11/13 05:19:20.83 QabZTjVa.net
## (?{code}) を使って >>697 の置換
if ( "ybrybrb" =~ /
\A
(?|
(?<赤>r)(?{ "aka"; })
| (?<青>b)(?{ "ao"; })
| (?<黄>y)(?{ "ki"; })
)*
brybrb ## バックトラックに対応出来るか試す
\z
/x )
{ print "true. Color <${1}> is <${^R}> .\n"; } else { print "false.\n"; }
## 結果: true. Color <r> is <aka> .
## バックトラックの対応、成功

737:デフォルトの名無しさん
18/11/13 21:32:36.34 QabZTjVa.net
# 仲間外れを探せ
if ("\x{1990}" =~ /
\N{U+1990}
#\N{1990}
#\N{NEW TAI LUE LETTER HIGH NA}
/x){ print "match.\n"; } else { print "false.\n"; }

738:デフォルトの名無しさん
18/11/14 10:41:07.07 Hh1ptiAj.net
717

739:デフォルトの名無しさん
18/11/14 14:37:49.07 duOGmOFb.net
ワロタw

740:デフォルトの名無しさん
18/11/14 18:45:40.17 I91AeKub.net
このクイズだか検証だかよくわからんの書き連ねてるのは何なの?
一人で無意味に書き連ねてるの?誰かとやりとりしてるの?

741:デフォルトの名無しさん
18/11/14 23:41:31.78 cpUdYoRF.net
正規表現の勉強をしながら気付いたことをメモってるだけです
基本的には一人でやってます
仲間が欲しい...

742:デフォルトの名無しさん
18/11/14 23:44:34.67 CNd6PM4x.net
ここはお前のチラシの裏なのか
ある程度まとまってんならともかくメモ書きなら他所でやれよ

743:デフォルトの名無しさん
18/11/15 00:11:59.19 Ow4iH1sO.net
需要ないかな?無いならやめます

744:デフォルトの名無しさん
18/11/15 22:32:34.48 IM0UsOCP.net
無いよ

745:デフォルトの名無しさん
18/11/16 17:20:00.59 eADG8kUk.net
bregonig.dll の (?a)\w の処理速度が遅い
(?u)\w と同じ速さ
\s や \d や [a-zA-Z_] より4倍の遅い
改善の余地ありそうだね

746:デフォルトの名無しさん
18/11/17 03:22:15.33 YADh6pBI.net
## (?(R1)yes|no) のサンプルコード
if ("abc23yz" =~ /
\A
( # $1
( # $2
a(?1)z
|
b(?2)y
|
c(?(R1)1|2)(?(R2)3|4)
) # $2
) # $1
/x){ print "match. <$&> \n"; } else { print "false.\n"; }
# 結果: match. <abc23yz>
# aとzの間にあるcは (?1) の中でマッチしているが
# bとyの間でもあるため (?2) の中でもある
# この場合はcを直接覆っている (R2) だけがyesになる
# 直接でない (R1) はnoになる

747:デフォルトの名無しさん
18/11/17 12:49:09.25 Oiq/x6oK.net
いつまで続くの?

748:デフォルトの名無しさん
18/11/21 19:34:31.80 CU3gUCH4.net
●Regular Expressionの使用環境
C#
●検索か置換か?
置換
●説明
先頭の全角スペースのみを置換したい
先頭の全角スペースは1文字の場合もある
●対象データ
   ああああ あ あ あ あ あ
●希望する結果
空空空ああああ あ あ あ あ あ

749:デフォルトの名無しさん
18/11/21 23:39:43.26 UsYfXb0d.net
>>730
Regex.Replace(str, @"(?<=^\s*)\s", "空");

750:デフォルトの名無しさん
18/11/21 23:41:52.91 UsYfXb0d.net
あ全角スペースか
\sを全角スペースに変えて

751:デフォルトの名無しさん
18/11/22 01:15:55.43 YNRtrxPu.net
可変長の戻り読みは便利だけどコールバックで処理するのが普通じゃないかな
URLリンク(ideone.com)

752:729
18/11/22 03:09:11.69 YAZbwzDX.net
>>733
たしかにそっちの方が倍くらい速かった
ちなみに正規表現関係ないけど
var trimed = str.TrimStart(' ');
var replaced = new string('空', str.Length - trimed.Length) + trimed;
とか
var sb = new StringBuilder(str);
for(int i = 0; i < sb.Length; i++) if (sb[i] == ' ') sb[i] = '空'; else


753:break; とかにするとさらに10倍以上速かった 正規表現使わないでもいい時はなるべく使わないほうがええね



754:デフォルトの名無しさん
18/11/22 11:43:47.30 sD3Vu3lJ.net
>>731-734
どうもありがとうございました

755:デフォルトの名無しさん
18/11/26 03:08:54.11 bvNwlvbS.net
Regex.Replace(str, @"\G ", "空");
でもいけるよ

756:デフォルトの名無しさん
18/11/26 06:49:56.12 OBhrl1nm.net
>>736
・・・っ、すごい。サクラエディタとかでも使える。
\Gのありがたみ知らなかった。私は、まだまだ精進が足りないようだ。

757:デフォルトの名無しさん
18/11/27 00:09:50.92 5gbDlA47.net
\Gを知らないのに正規表現を使いこなせるということはproxomitronのユーザーさんかな

758:デフォルトの名無しさん
18/11/28 15:10:22.46 N4CCGDXj.net
\Gの使い方を覚えたら>>716が面白く感じるかもね
知ってれば今更感しかないが

759:デフォルトの名無しさん
18/11/29 02:42:35.12 Fz25AUlj.net
>>507-508
すごい
こういう書き込みが初心者の質問とその回答で埋もれてしまうのはもったいない
質問スレとは別に正規表現の本スレらしいスレがあるといいな

760:デフォルトの名無しさん
18/11/29 02:52:05.30 rs9fzmaE.net
頑張ったなぁとは思うけど URLリンク(regex101.com) じゃあかんかったか?とも思う
というかリンク貼れんの? URLリンク(goo.gl)

761:デフォルトの名無しさん
18/11/29 08:19:27.68 nDdllTwV.net
自分で立てればいいのになんで他人頼みなの?

762:デフォルトの名無しさん
18/12/02 03:28:37.05 s0yCsMa3.net
>>740
じゃあ俺が立てるわ、テンプレの準備にちょっとかかるが

763:デフォルトの名無しさん
18/12/08 16:06:50.58 7G2k61ed.net
twitter.com/munesuk
enya_go/status/1071188833515954176
先輩w

764:デフォルトの名無しさん
18/12/08 20:04:57.14 RNQqcEtu.net
アンド検索をしたいのですが、どう書けばいいでしょうか
^(?=.*あああ)(?=.*かかか).*$
このコードを見つけました
あああ と かかか の含まれる行がヒットします
ただ、ロジックがちょっとわかりません
先読みをつかっているのですが、先読み対象の語が指定されていません
これはどういうことでしょうか
分かりやすい解説サイトでもあれば教えてください

765:デフォルトの名無しさん
18/12/08 20:32:25.49 Dx33rAX6.net
このへんかな
>正規表現で論理積(AND)を実現する
>URLリンク(qiita.com)
自分流のちょっと乱暴な理解解釈だと
1. (?=検索対象) は、この条件が満たされないと後続のマッチを調べない
2. (?=検索対処) 自体は、この条件が満たされてた時点である意味消滅したかのようにふるまう
って動きを取るような感じ

ちなみにAND検索ができるgrepツール(TresGrep)がどんな正規表現を組み立てるか調べてみたら
「xxx&yyy&zzz」

「xxx.*?(yyy.*?zzz|zzz.*?yyy)|yyy.*?(xxx.*?zzz|zzz.*?xxx)|zzz.*?(xxx.*?yyy|yyy.*?xxx)」
なんてのを吐き出した
安直だけどまあこれも間違ってはいない

766:デフォルトの名無しさん
18/12/08 20:35:48.50 Dx33rAX6.net
あ、先読み対象の語は「^」だけで
「行頭から始まるという条件さえ満たせば何でもよ


767:い」と指定してる



768:デフォルトの名無しさん
18/12/08 22:19:09.33 7G2k61ed.net
環境が分からない
何を検索したいのか分からない
>先読みをつかっているのですが、先読み対象の語が指定されていません
??? 指定されてないって何のことだろう、意味不明
正規表現うんぬんの前にまともな質問の仕方を学ぶべき

769:デフォルトの名無しさん
18/12/08 22:26:59.96 RNQqcEtu.net
>>746
先読み対象は行頭ということですね
^(?=.*あああ)
これだと意味としては
「あああの前に行頭が存在すればヒット」
ということになると思います
これってもう少しかみ砕いた表現にできませんか?
まだ、理解が追い付いてないです
行頭が存在すればヒットということは、「行の中にあああがあればヒット」と同じことですか?

770:デフォルトの名無しさん
18/12/08 23:05:31.04 hZepSGXS.net
>>749
^は検索位置を示すもので、先頭を表す記号、
(?=)は先読みで検索開始位置を移動しないもの
つまり、
^(?=.*あああ)
は、先頭から(改行までの間に)文字列「あああ」がある場合
(先読みなのでマッチ後も次の検索開始位置はまだ先頭のまま)
よって
^(?=.*あああ)(?=.*かかか)
は、先頭から(改行までの間に)「あああ」があり、且つ先頭から「かかか」がある場合
.*$は不要だが、付けると、改行が存在すると絶対マッチしなくなる点が異なる

771:デフォルトの名無しさん
18/12/09 06:54:41.50 C3Qast1U.net
↑かっこを二つならべると、()と()という感じで、アンドになるんでしょうか?
あと
(?=)は先読みで検索開始位置を移動しないもの
の部分なんですが、検索開始位置を移動しないというのはどういうことでしょうか
?=キーワード
で設定した場合、キーワードの相対位置から前を検索する、という認識でした

772:デフォルトの名無しさん
18/12/09 08:43:46.17 UT294bNs.net
質問者は正規表現の基礎知識が足りてないと思われる
たとえるなら、(?=)の先読みは高校受験レベルで求められる英文法だとすると
質問者の場合は入門レベル(そもそもの基本ルールとか「.*」とか)の知識がごそっと抜けてる
なのでここまで出てきた説明を読んでもちんぷんかんぷんにしかならないのだろう
ちょっと遠回りになるけどちゃんと正規表現の基礎を理解したほうがいい
URLリンク(qiita.com)
あたりを最終回(その4)まで読め
それでも理解できないなら、貴方には正規表現を扱うのは無理だからあきらめろ

773:デフォルトの名無しさん
18/12/09 09:50:40.98 vJutpfX/.net
>>751
()()でandになるわけではなく、()の次に()があるかどうかとなる(順序関係ができている)
^(a)(b)と書くと、abにはマッチするがaやbやbaにはマッチしない
これは、^(a)がマッチした時点で検索位置がaの次に移動しているためである
^(?=a)(b)と書くと、何もマッチしなくなる
これは先頭からaが見つかった場合、検索開始位置が移動しないため(?=a)を検索する前のまま(つまり先頭)になっている
次にbが先頭にあればいいわけだがそこにはaがあるからマッチしない

774:デフォルトの名無しさん
18/12/09 10:39:42.84 bsA2M6bZ.net
ID:vJutpfX/
頭が良すぎて教えるのが下手なパターン
バカ語で話さないと通じないよ

775:デフォルトの名無しさん
18/12/09 10:51:59.84 bsA2M6bZ.net
こんな最低限のこともググらず、自分で努力せずに人に聞くようなのに
教えてはいけないと思う、居ついてしまうからエサを与えないで欲しい

776:デフォルトの名無しさん
18/12/09 11:55:43.32 C3Qast1U.net
>>753
動かしながら覚えてみます
ありがとうございます

777:デフォルトの名無しさん
18/12/09 12:38:27.41 H3JhKeet.net
動かしながら覚えるんじゃなくて
>>752でも何でも良いけど、説明読んで覚えて欲しい
中途半端な事してるから、>>751みたいに間違った解釈になるんでしょ

778:744
18/12/09 19:23:00.27 i2SuH64K.net
うーん、一応はレス内容から質問者がどの程度内容を理解したか/理解する気でいるか
透けて見えるんだけどね
>>746のURLの記事を読んだうえでこの程度のレスしか返ってこず、さらに
最終的には>>756のようなリアクションが返ってきたか
回答して残念な気持ちになったよ

779:デフォルトの名無しさん
18/12/09 19:57:20.13 sTKdTIE5.net
位置の理解は言うほど易しくはないとおもわれ
正規表現検索とはテキストエディタでカーソルを1つずつ進めながら
合致する文字を1文字ずつ探っていくようなものだというイメージが必要だけど
そこをちゃんと説明してるものはあまり見かけない

780:デフォルトの名無しさん
18/12/09 20:00:27.58 bzQOhihu.net
知恵遅れに場所を移動したらしい
URLリンク(detail.chiebukuro.yahoo.co.jp)
まずは自習しろよw

781:デフォルトの名無しさん
18/12/09 21:49:11.61 bsA2M6bZ.net
回答した人は親切丁寧に回答出来ていたよ、お疲れ様
上にも書いたように頭のいい人にしか理解出来ない回答になっていた
俗にいう分かってる人にしか分からない説明ってやつ
俺はこういうバカに教えるのは得意だから俺が回答を付ければ理解されたと
思うけど注意をスルーされたのでスルーした

782:デフォルトの名無しさん
18/12/10 14:42:13.07 RU/iAdEK.net
知恵袋で質問を4000件以上やりとりしてる人だったのか
それなのに質問の仕方がまったくダメって

783:デフォルトの名無しさん
18/12/10 17:07:38.24 RU/iAdEK.net
質問のペースがおかしい、1日に質問6つしてる
ググるより先に質問してんのか?

784:デフォルトの名無しさん
18/12/10 17:25:29.04 RU/iAdEK.net
URLリンク(detail.chiebukuro.yahoo.co.jp)
おまえらはこんなの相手に一生懸命教えてたのか
自分を安売りしすぎ、もってけ泥棒状態

785:デフォルトの名無しさん
18/12/10 17:25:37.52 RTUhzLAF.net
そして回答はアダルトカテゴリのみという…

786:デフォルトの名無しさん
18/12/10 17:29:58.71 RU/iAdEK.net
やっぱ質問スレと本スレは分けるべきだな
この流れになると賢い人が来なくなってしまう

787:729
18/12/10 18:14:05.41 PtRqcV9k.net
なんで馬鹿が一匹きただけでそういう話になるんだよ
過剰対応の典型やろ

788:デフォルトの名無しさん
18/12/10 21:59:56.06 RU/iAdEK.net
入門サイトすら読んでないような人の質問とその回答にうんざりして
来なくなった人は大勢いると思うんだがそういう人達が集まれるスレが
あったらひょっとしたらすごいスレになるんじゃないかという期待がある
実際はただ過疎るだけなんだろうけどね

789:デフォルトの名無しさん
18/12/11 02:31:31.29 oKdEGQIj.net
隔離スレなんて作るだけ無駄だろ
機能してるところなんて見たこと無い

790:デフォルトの名無しさん
18/12/11 02:44:05.34 4gYtUlOJ.net
PCサロン板なら迷惑にならなそうなので立ててみた
【PCサロン】正則表現 part1
スレリンク(pc2nanmin板)
基本過疎進行ですが正規表現を使いこなせる人同士で語りたい方はこちらで

791:デフォルトの名無しさん
18/12/13 17:01:35.11 IMhQiOyS.net
回答が付いた。でも微妙におかしい。つっこんであげるべきか?

792:デフォルトの名無しさん
18/12/14 20:59:53.53 DlmPms4F.net
^
(?:
(?!あああ|かかか).
)*+
(?>
(あああ)
|
かかか
)
(?:
(?!あああ|かかか).
)*+
(?(1)かかか|あああ)
.*+$

793:デフォルトの名無しさん
18/12/14 21:11:35.41 DlmPms4F.net
^
(?~あああ|かかか)
(?>
(あああ)
|
かかか
)
(?~あああ|かかか)
(?(1)かかか|あああ)
.*$

794:デフォルトの名無しさん
19/01/10 03:02:56.41 mY602DpM.net
FirefoxやChromeのブックマークにこれ登録して
URLリンク(i.imgur.com)
ブラウザのアドレスバーに
re foo|bar|baz
と入れると
URLリンク(regexper.com)
に飛べるようになる
簡易チェッカーとして便利

795:デフォルトの名無しさん
19/01/10 14:50:11.25 Q3mhk3sM.net
>>774
いいねw まったく思い付きもしなかったアイデアwww

796:デフォルトの名無しさん
19/01/10 15:21:01.00 Q3mhk3sM.net
>>774
chrome on mac だけどブックマークではダメで、設定→検索エンジン→検索エンジンの管理→追加 から登録しないといけなかったわ。

797:デフォルトの名無しさん
19/01/13 18:46:07.60 vFHHKg45.net
URL(http|https)の正規表現って難しいのかね
URLリンク(mathiasbynens.be)
38charsのが好きだわ

798:デフォルトの名無しさん
19/01/26 10:17:12.64 rNPVIr5d.net
否定先読み
と言うのがなかなか理解出来ないのですが、
サンプルを動かすと確かに動作するのですが、
今一つ仕組みが分かりません。
どんなふうに理解すれば良いのでしょうか?

799:729
19/01/26 10:42:36.00 K4a4emwR.net
文字じゃなくて位置(文字と文字の間)に一致すると考えればいい
たとえば
abcdef
が対象の場合
肯定先読み(?=def)は直後にdefがある位置(cとdの間の位置)に一致する
abc[ここ]def
否定先読み(?!def)は直後にdefがない位置に一致する
[ここ]a[ここ]b[ここ]cd[ここ]e[ここ]f[ここ]
行頭の^や行末の$も文字じゃなくて位置に一致する

800:デフォルトの名無しさん
19/01/26 11:13:09.45 yVAkGzul.net
なるほどthx

801:デフォルトの名無しさん
19/01/26 11:53:37.94 mL4if6wW.net
>>779
横からだけど、否定のほうはなるほどだわ
条件を絞るつもりが広げちゃってる場合があるんだな

802:デフォルトの名無しさん
19/01/26 15:19:07.07 exLOU4gz.net
先読みはマッチさせたら、マッチ開始位置に戻るから、
単なる位置指定で、幅を持たない。
単なる条件を追加した、フィルター
否定先読みはマッチしない場合に、マッチ開始位置に戻る
先読みは、マッチ位置の直後の条件を指定するが、
戻り読みは、マッチ位置の直前の条件を指定する

803:デフォルトの名無しさん
19/01/27 10:46:10.47 Th+zYLMn.net
>>779
ありがとうございました。
良く分かりました。

804:デフォルトの名無しさん
19/01/28 10:47:47.80 wg8XKdax.net
.netでの正規表現に迷ってます。
次の文字列のとき、"efgh/1"以降に"/"が含まれないときマッチするような正規表現を書きたいのです。
URLリンク(192.168.1.100)  →True
URLリンク(192.168.1.100) →False
URLリンク(192.168.1.100)  →True
URLリンク(192.168.1.100)  →False
URLリンク(192.168.1.100)  →True
次のような正規表現を試してみましたが、数値1文字しか対応できませんでした。
\/efgh\/[0-9]+(?!\/)

805:デフォルトの名無しさん
19/01/28 10:57:25.94 DdBbxYrt.net
\/efgh\/1[^/]*$
ではダメかな

806:デフォルトの名無しさん
19/01/28 12:18:39.25 c4Y7c3OH.net
>>785でいいと思う
あとスラッシュにエスケープは不要だから/efgh/1[^/]*$
否定先読みが使いたいなら /efgh/[0-9]+(?!.*/)
(?!.*/)はそれ以降/が含まれない位置という意味
(?!/)だと直後に/がない位置という意味だから数字が2文字以上続いたらマッチしてしまう

807:デフォルトの名無しさん
19/01/28 12:21:15.63 c4Y7c3OH.net
ごめん1って決まってるならこれでいいな
/efgh/1(?!.*/)

808:782
19/01/28 15:51:48.42 wg8XKdax.net
>>785-787
ありがとうございます!
正しい判断をすることが出来ました。
数値は1以外もありえるため、次の正規表現を使います。
/efgh/[0-9][^/]*$
/efgh/[0-9](?!.*/)
>>786
正規表現の意味まで教えてもらい、本当に助かります。
今後の役に立てていきます。

809:デフォルトの名無しさん
19/01/29 06:11:22.47 mzqJgDrY.net
$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)
URLリンク(www.humblebundle.com)

810:デフォルトの名無しさん
19/01/29 06:32:49.85 mzqJgDrY.net
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

811:デフォルトの名無しさん
19/01/31 16:07:48.62 Sc+6fvIO.net
誰かこの鬼雲のバグ修正PR投げてあげて
URLリンク(github.com)

812:デフォルトの名無しさん
19/01/31 16:08:40.61 Sc+6fvIO.net
URLリンク(github.com)
(?(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

813:デフォルトの名無しさん
19/02/13 00:35:05.11 HRhgNpoV.net
鬼雲には鬼雲を知ろうとすればするほど謎のテキストエディタの
情報が集まってくるという不思議な不具合があるがこのフィックスは不可能 :-)

814:デフォルトの名無しさん
19/03/07 20:57:23.09 sEA+6w2y.net
今日元号の改正の準備で日付関連のコード書いてきたんだけど
>>697の置換が出来ると便利だったなという所があった
再帰が使えるのにこれが使えないのはバランス感覚に欠ける気がします
どうしてこうなった?

815:デフォルトの名無しさん
19/03/12 13:14:07.01 vSZ9R6NM.net
先読みの(?=huge)をつけると、後方がキャプチャーされません
そもそも前方に文字のない?=って使い方あってるでしょうか?
ちなみに言語はVB6です

816:デフォルトの名無しさん
19/03/13 00:19:48.81 heD+eXgL.net
Are you japanese?
Your japan language is strange.
Please show me sample codes.

817:デフォルトの名無しさん
19/03/13 01:39:37.63 bUFEpZHr.net
あなたの英語も変ですよ。
日本人はJapaneseとキャピタライズしてください。
日本語もjapan languageではなくJapanese languageです。
Japaneseだけで日本語という意味になりますが、前の文で日本人という意味で使っているのでlanguageを付けるのはいい判断でした。
また最後の文は、どうしても複数の例を見たいことを強調するのでない限りcodesではなくのcodeがふつうです。
不定冠詞のaも付けません。(絶対にただひとつの例だけ欲しいのでない限り)

818:デフォルトの名無しさん
19/03/13 02:16:45.79 heD+eXgL.net
自分の英語力は小学生相当なのでこんなもんです
教えてくれてありがとね

819:デフォルトの名無しさん
19/03/13 02:29:04.73 Z/ka/TFK.net
irregular expression, exactly.

820:デフォルトの名無しさん
19/03/13 08:53:04.20 heD+eXgL.net
I am good at irregular expression.

821:デフォルトの名無しさん
19/03/13 14:12:32.68 ZUOT1OTB.net
nativeのひとに「あなた英語上手ですね」って言われても誉め言葉じゃないからな
その時点で下に観られてる

822:デフォルトの名無しさん
19/03/14 17:54:44.14 k53fNhgw.net
上手ですねと言われる可能性が0なので大丈夫です

823:デフォルトの名無しさん
19/04/22 20:21:53.32 GQt1LKrG.net
sed
置換
1に挟まれたN個以下の0または-で構成された文字列を、同数の1で置き換える
10001→11111
100-1→11111
1---1→11111
10-0-0001→111111111
置換対象と同数の文字列で置換するというところをどう正規表現で表すかわからず、、、
よろしくお願いします

824:デフォルトの名無しさん
19/04/23 05:37:05.12 TbAsj7lM.net
正規表現で数を数えるのは無理
マッチさせて自力で文字を数えるコード書いて入れ替えて
ちなみに\Gが使える正規表現環境なら正規表現単独で可能

825:デフォルトの名無しさん
19/04/23 07:05:11.04 k/th3sVe.net
>>803
sed ':r; s/1[0-]\([0-]*1\)/11\1/; tr'
前方に 1 のある 10 を 11 に置換する
置換に成功したら tラベル で :ラベル の位置に戻って繰り返す

826:デフォルトの名無しさん
19/04/23 08:49:46.57 ef59e0DS.net
>>803
たぶんこれだけでは不要なところを置換しそう
:a;s/1([^0\-]*)(?:[0\-])(.*)1/1$11$21/g;t a
例題をこなすのは確認

827:デフォルトの名無しさん
19/04/23 10:21:33.54 yIB0exXp.net
>>803
100010
とか
1000101
とか
があるのか?
あった場合はどうすべきか
そこは明記しような。
謎だらけの設計書書く奴はIT向いてない。

828:デフォルトの名無しさん
19/04/23 11:46:04.64 ef59e0DS.net
>>807
>>806で> 100010→111110、> 1000101→1111111は確認
というかオレは前後にゴミがつくことは何ら影響がある題とは思わなかった
>>803の「1に挟まれたN個以下の0または-で構成された文字列を、同数の1で置き換える」にはその前後について言及ないから「触らない」と判断
後者を1000101→1111101で求めるかという点は気になるところ
最初の1~1ブロックのみなのか、行中の1~1最長一致ブロックなのか(すべての1~1ブロックを個別処理も同一)

829:デフォルトの名無しさん
19/04/23 12:07:17.02 yIB0exXp.net
>>808
()で囲うとなってれば入れ子のケースは当然問題になるんだから
入れ子を考慮する必要があるかを明確に定義してないのは駄目な仕様。
10-以外が現れた場合の扱いも明記されていない
→現れることはないとみなしている
んだから
100010は現れないと想定して書く選択肢もある。
いずれにしろ、不明瞭な仕様を書く奴は無能だし、
勝手に解釈するのも実際の仕事じゃトラブルの元。

830:デフォルトの名無しさん
19/04/23 12:23:27.03 ZY45SR7V.net
Ruby なら、
re = /1([^1]+)1/ # 1~1 で、はさまれた部分
str = "x10-0y0-1x"
# $1 は、capture 部分で、0-0y0-。この部分を置換する。
# 結果は、x1 (111y11) 1x
p str.sub( re ) { |s| "1" + $1.gsub( /[0-]/, "1" ) + "1" }

831:デフォルトの名無しさん
19/04/23 12:38:52.51 ef59e0DS.net
>>809
反論と取られたのかな
反論でも賛意でもないよ
個人的には>>803が「よい定義や仕様」とは欠片も思わない一方で「ダメダメ」とも思わない
組んでいく中で詳細を詰めていくことも現実としてある
あなたが求めているようながっちり仕様が決まっていたらむしろやることなんてほぼないかも
単に日本語を翻訳する作業になるのでむしろ苦痛かな…
そこまで詰められるなら日本語で指示しないで自分で書けよと思ってしまうかも
スレ的に読み替えればがっちり仕様を出した上で「これは正規表現で可能か?」という命題に繋がるのでスレでがっちり仕様を出すなと言う意味ではないです(念為)
仕事でもなし頭の体操的にてきとーに答えてるだけなんでこれくらいなら気にしない派

832:デフォルトの名無しさん
19/04/23 13:02:53.90 k/th3sVe.net
% printf '100010\n1000101\n' | sed ':r; s/1[0-]\([0-]*1\)/11\1\n/; tr; s/\n//g'
111110
1111101
%

833:801
19/04/23 13:49:39.47 CFFnqXFD.net
問題が曖昧であったため議論を紛糾させてしまいました。すみません。
たしかに入れ子のことや、一致する最初の文字列か、最長か、01-以外の文字の存在などを明確に記載できていませんでした。
今回の問題で聞きたかったことをシンプルに表現すると、検索文字列の文字数(1~N個)に依存した置換が可能なのか、になります。
そこについては先の人が回答してくださった通り、文字数を記憶しておくような処理は不可能であるから正規表現の範疇ではないと思いました。
これまでの意見から当初目的ではないものの多くのヒントをもらいました。ありがとうございました。
問題提示者としていたらないながら、この話はクローズさせていただきます。

834:デフォルトの名無しさん
19/04/23 13:52:46.13 yIB0exXp.net
>>811
反論だなんて受取ってないから妄想やめて。
定義が曖昧過ぎてねえ…
としか言ってないから。
01-以外でいいのか、1.*1でいいのか
などなど要件がこんな不明瞭じゃねえ
と言う話しかしてないのであしからず。

835:デフォルトの名無しさん
19/04/23 13:54:41.14 yIB0exXp.net
>>811
というか、そもそもお前宛じゃないのに
なんでお前が絡んで来てるのか謎。
勝手にお前が批判されたと妄想するなよ。

836:デフォルトの名無しさん
19/04/23 15:45:58.43 ef59e0DS.net
>>815
> というか、そもそもお前宛じゃないのに
ふあ?
>>809(ID:yIB0exXp)で>>808(ID:ef59e0DS)に安価されてるからですよ
んーなんなんかな(´д`)

837:デフォルトの名無しさん
19/04/23 17:14:05.07 yIB0exXp.net
>>816
>>807のことだが。
お前宛じゃないのに絡んで来たのお前だろ。
記憶喪失ワロタw

838:デフォルトの名無しさん
19/04/23 19:20:56.30 GneiHx9I.net
まーまー、ここはわしの顔を立てて双方おとなしくしてくれまいか。

839:デフォルトの名無しさん
19/04/23 19:41:58.96 ef59e0DS.net
>>817
あーきみがいいたいのはそっちか
例題をこなす正規表現を提示している>>805,806宛と捉えたんだよね
すでに>>805,806出てるのになにも提示してないでぐちぐち言ってるんで
まあ気に障ったようなので安価張って絡んだ形になったのは謝るよ

840:デフォルトの名無しさん
19/04/23 19:46:57.33 yIB0exXp.net
>>819
>>807>>803宛だと明示してるし
>>805>>806なんてどこにも書かれていないのに勝手に勘違いされてもさあ。
どこをどう見たってお前が勝手に絡んで来てるのに
「絡んだ形」とかふざけた言い方すんなよ。

841:デフォルトの名無しさん
19/04/24 19:37:45.85 kN2xWSes.net
質問者の例題は数に応じた置換の簡単なサンプルが欲しくて書いたものだと思う
再帰的に無理やり導くクソコードなんて書かれても迷惑なだけでしょ

842:デフォルトの名無しさん
19/04/24 21:35:46.86 SVxlletW.net
端からは大人と子供
ご愁傷様

843:デフォルトの名無しさん
19/04/25 02:00:13.99 nkf4NYVZ.net
pythonスレで似たテーマ観たからマルチ認定

844:デフォルトの名無しさん
19/04/26 22:15:29.45 pXwlHtT3.net
sedとpythonじゃまるで違うから別件だろうな
>>819
勘違いして迷惑かけた分際で「ぐちぐち」って言葉を使うか普通..
というかこの文体、昔セガBBSにいた南瓜さんという人にそっくりだな
別人だろうけど思い出してワロタ

845:デフォルトの名無しさん
19/04/26 22:34:09.92 7hEPz6dq.net
しばらくぶりにノゾいたらワロタ
ID:yIB0exXp
URLリンク(hissi.org)


846:/read.php/tech/20190423/eUlCMGV4WHA.html 平日の朝から晩まで 内容がとっても抽象的 ネット弁慶クンってホントにいるんだな!w



847:デフォルトの名無しさん
19/04/26 23:09:55.86 DINb0EDe.net
マ板恒例、湿度高めの展開になってきましたー

848:デフォルトの名無しさん
19/04/27 13:12:59.58 W9D3URJl.net
オブジェクト指向最高さんは今回まったく落ち度が無い
迷惑かけといて素直に謝ることも出来ないくそコード製造機はもう来なくていい

849:デフォルトの名無しさん
19/04/27 21:25:24.59 CxhHumup.net
翌日以降もこんな感じですよ
URLリンク(hissi.org)
URLリンク(hissi.org)
URLリンク(hissi.org)
URLリンク(hissi.org)
こちらで引き取ってもらえませんか?

850:デフォルトの名無しさん
19/05/04 22:49:23.33 Wy3P56AZ.net
引き取ってくれてありがとう~(^。^)

851:デフォルトの名無しさん
19/05/29 23:29:43.55 NoMeOMsF.net
よろしくお願い致します。
●Regular Expressionの使用環境
Python 3.7
●検索か置換か?
検索
●説明
3つ目と4つ目のダブルクオートの間の文字列を探す
●対象データ
"文字列1":[1000:"文字列2"]
●希望する結果
文字列2

852:デフォルトの名無しさん
19/05/30 07:22:28.54 NTWA4E5y.net
>>830
Javaの正規表現テストサイト(*1)でしか試してないけど…
(?:[^"]*"){3}([^"]*)"
*1 URLリンク(regex-testdrive.com)

853:デフォルトの名無しさん
19/05/30 08:48:50.22 ZbLZAkBS.net
>>831
文字列1が空だと空振るのでいっそベタ書きするかな
それと対象の規模によっては計算量も30%少なくて済む
"[^"]*"[^"]*"([^"]*)"
くどいーと思ってまとめてみても
"(?:[^"]*"){2}([^"]*)"
若干悪化して15%offくらいに留まる

854:デフォルトの名無しさん
19/05/30 09:14:01.64 js+SNbQS.net
やっぱり可変長の戻り読み使えないなら後方参照で抜き出すしかないよね
というか正規表現以外で抜き出した方が処理軽いんじゃ

855:デフォルトの名無しさん
19/05/30 10:41:49.43 NTWA4E5y.net
>>832
> 文字列1が空だと空振るのでいっそベタ書きするかな
空振るの意味がよくわからん
効率は考えてない

856:デフォルトの名無しさん
19/05/30 16:00:31.98 0UuZnvit.net
>>834
皆様、ありがとうございます。
>>831にてご提案頂いたものに、Pythonのエスケープシーケンスを加えて採用しました。
ほか、ご提案頂いたものも大変勉強になりました。

857:デフォルトの名無しさん
19/06/12 18:51:34.75 8qMgnvIv.net
正規表現で全角記号だけ抜き出す事はできますか?
★ファイル名 
みたいにして先頭に来るようにしてたんですが、全角記号はエラーおこすことがあるようです

858:デフォルトの名無しさん
19/06/12 20:16:21.08 ATCcrAWn.net
なんの処理系か書けよな

859:デフォルトの名無しさん
19/06/12 20:18:49.53 0U8oWwW8.net
使用する文字コードも

860:デフォルトの名無しさん
19/06/17 00:16:17.89 ks+4WGLz.net
助けてください。おながいします
●Regular Expressionの使用環境
Sakura Editor
(begonig.dll ver.3.06 with Onigmo 5.15.0)
●検索か置換か?
検索
●説明
日本語の文章の中に、全角英字が混じっています。
「全角英字の単語直後の任意の1文字」をマッチさせたいです。
(?<=[a-zA-Z]+).
でいけると思ったのですが、invalid pattern in look-behindでエラーになってしまいます。
どうもDLLの仕様で肯定後読みの式は固定文字長でなければならないらしく


861:、代替案がないかなーと…… ●対象データ ああいいいabcうABCえおかきくけ ●希望する結果 「う」、「え」の2か所



862:デフォルトの名無しさん
19/06/17 02:22:40.96 FPrxRapn.net
(?<=[a-zA-Z])[^a-zA-Z]

863:デフォルトの名無しさん
19/06/17 06:40:06.13 LXSfy5ij.net
>>839
> 「全角英字の単語直後の任意の1文字」
> ああいいいabcうABCえおかきくけ
bcうBCえ
> 「う」、「え」の2か所
任意とは

864:デフォルトの名無しさん
19/06/17 21:52:38.33 ks+4WGLz.net
>>840
天才!天才!解決しました。大量に感謝
発想が . に囚われていた……勉強になります
>>841
単語というのが1文字じゃなくて英字で構成されたブロックの~という意味でした。わかりにくくてスマソ

865:デフォルトの名無しさん
19/06/18 22:51:14.09 y1gFJJpS.net
ちょっとした疑問
アラビア語のような右書き言葉だと正規表現をどう書くのだろう
文字列も正規表現も右書きだから、/xyz$/ は /$zyx/ ?
(レス不要です)

866:デフォルトの名無しさん
19/06/19 05:02:00.28 tVNS+22r.net
【出資】松本卓朗 人工知能詐欺【注意】
スレリンク(rikei板)

867:デフォルトの名無しさん
19/06/19 14:27:57.27 Yoy0IPRe.net
いし正が左らか右は語本日

868:デフォルトの名無しさん
19/06/23 22:51:37.03 WHM6Ibwm.net
>>836
理論上は
|
で全部やればできる

ちょうど単なる全角(
1文字が2つの幅をもつ
ロシアの言語なども2幅
)
を捉えようとしていたので道具を紹介
URLリンク(i.imgur.com)
正規表現は (.) で1文字を習得し
バイト数が1でないものを拾うロジック

869:デフォルトの名無しさん
19/06/24 06:26:17.63 F4CLQWNj.net
URLリンク(so-zou.jp)
こういうので全角記号だけさっくり選ばせろって事なんだろうけど
全角半角はユニコードだとフォント依存なので曖昧
ascii 以外って意味で言ってるんだろうけど
恐らく"ファイル名"て事からSJisの範疇外の文字って事かなと

870:デフォルトの名無しさん
19/06/24 21:23:57.79 4+LiJo6+.net
一文字決めうち かつ あらっぽいコレクション
vim の :h digraphs には結構ある
[??????????▲△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]

871:デフォルトの名無しさん
19/06/24 21:24:32.12 4+LiJo6+.net
[??????????▲△??▼▽??◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]

872:デフォルトの名無しさん
19/06/24 21:24:52.95 4+LiJo6+.net
[??????????△??▼▽??◆◇?○◎●??????★☆?????♀♂?????♪?♭?♯??? 、。〃?々〆〇《》]

873:デフォルトの名無しさん
19/06/24 21:28:31.79 4+LiJo6+.net
おわった
NG word 群が正規表現を妨げる
一文字限定なら [] の処理が早い
vim の :h digraphs
には 1300個ぐらいの 記号を含むデータリストがあるから
それから組みたてやすい とおもう

874:デフォルトの名無しさん
19/06/24 21:56:38.71 meJBThiE.net
NGワードと文字化けの区別ができない人は書き込んじゃダメ。

875:デフォルトの名無しさん
19/06/24 23:17:52.70 4+LiJo6+.net
そういえばブラウザに NG word に指定したのは自分だった
あらしが記号を使ってたことがあったので

876:デフォルトの名無しさん
19/06/25 07:18:11.77 0Do2GL77.net
荒らしが記号を使うことと書き込みを制限することに全く関連が無い

877:デフォルトの名無しさん
19/06/25 08:36:20.64 Y04/VZ6Y.net
URLリンク(i.imgur.com)
こう見えていたんだ
左がわひどいね ごめんね

878:デフォルトの名無しさん
19/07/08 00:38:09.05 m6vFYfK4.net
●Regular Expressionの使用環境
サクラ


879:エディタ(か秀丸エディタ) ●検索か置換か? 置換 ●説明 不定回数のパターンを置換したい。 ●対象データ [A=a,A=b,A=c,A=d,・・・・] ・・・・の部分はどこまで続くのかは決まってない。が、多くても20個くらい ●希望する結果 A=a,b,c,d・・・・



880:デフォルトの名無しさん
19/07/08 05:29:01.40 9IE9wmRC.net
(?<!^)A=

881:854
19/07/08 23:27:17.45 Rb/08H3f.net
>>857
ありがとうございます。
否定戻り読みってこうやって使うのですね。
もうちょっと深掘りして以下の場合どのようになるでしょう。
■対象データ
[A=a OR A=b OR A=c OR A=d・・・・]
[B=d OR B=c OR B=b OR B=a・・・・]
[C=a OR C=b OR C=c OR C=d・・・・]
■希望結果
A=a,b,c,d
B=d,c,b,a
C=a,b,c,d
ORの部分が難しくて混乱しています。。

882:デフォルトの名無しさん
19/07/10 08:43:33.27 WA2fRW/e.net
\s++OR\s++.=
,

883:デフォルトの名無しさん
19/07/10 09:18:54.80 StxWbt+s.net
ここの住民の正規表現能力は超人的だ
お節介させてくれ
もし使用環境に perl があれば、
ウルトラ難しい正規表現を理解可能な小さなパーツに分類できる
cat /dev/clipboard
[A=a OR A=b OR A=c OR A=d・・・・]
[B=d OR B=c OR B=b OR B=a・・・・]
[C=a OR C=b OR C=c OR C=d・・・・]
cat /dev/clipboard | perl -ne 'if ( m{^ \[ ( \w+ [=] ) }xcm) {print $1}; { if ( m{ = (\w+) \s }xcg ) {print "$1,"; redo} if ( m{ = (\w+) \S }xc ) {print "$1\n"} }'
A=a,b,c,d
B=d,c,b,a
C=a,b,c,d

884:デフォルトの名無しさん
19/07/10 09:35:40.67 StxWbt+s.net
そして同じような形を処理するのに
必要な正規表現が大きく変わったりしない
cat /dev/clipboard
[A=a,A=b,A=c,A=d,A=e,A=f,A=g,A=h,A=i,A=j]
cat /dev/clipboard | perl -ne 'if ( m{^ \[ ( \w+ [=] ) }xcm) {print $1}; { if ( m{ = ( \w+ [,] ) }cxg ) {print "$1"; redo} if ( m{ = (\w+) [^,] }xc ) {print "$1\n"} }'
A=a,b,c,d,e,f,g,h,i,j

885:854
19/07/11 01:01:12.77 /KpWZOtx.net
>>859
すごい。。
置換できましたありがとうございます。
が、情けない話ですがなぜこういう置換結果になるのかが理解できません。
良ければどなたか解説いただけないでしょうか
>>860
ほんと、超人的ですね。。
Perlでのご教授ありがとうございます。
1度組んでしまえば汎用的に使えそうですね。

886:デフォルトの名無しさん
19/07/11 21:00:44.92 SCYCuKB+.net
>>862
URLリンク(github.com)

887:デフォルトの名無しさん
19/07/13 20:47:25.54 57lWPs8z.net
動作についての質問です。よろしくお願いします。
●Regular Expressionの使用環境
JavaScript (chrome)
●検索か置換か?
検索
●説明
'@time;prop1:style1;prop2:style2'.match(/(^|[@;])[^@;]*/g); が
["", ";prop1:style1", ";prop2:style2"] になる理由が分かりません。私の理解では、
["", "@time",";prop1:style1", ";prop2:style2"] となって欲しいところです。
どなたか説明お願いします。
^は文字列検索位置を「動かさない」と認識しています。
(以前は「動かす」と誤認識していましたが、何かで見解を改められたことを記憶しています)
●対象データ
ID@time;style 形式の指定で、
ID、time、styleの省略は全てありで、timeとstyleの順序は自由(IDは必ず先頭)
@開始はtime指定、それ以外はstyle指定とし、デリミタは ; としています。
この形式で任意の文字列(ユーザー入力)を処理します。
なお、'@time;prop1:style1;prop2:style2'.match(/(^.|[@;])[^@;]*/g); では希望の解
["@time", ";prop1:style1", ";prop2:style2"] を得られていますが、
デバッグ中に上記に引っかかったので、分かりましたらよろしくお願いいたします。


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