X



Regular Expression(正規表現) Part14 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0527デフォルトの名無しさん
垢版 |
2018/06/24(日) 13:33:59.68ID:wSHpLaLO
文字列の中から数字13桁(それ未満でも超えてもNG)を抽出するにはどうしたらいいでしょう
JANコードらしきを抜き取りたいのです。

候補を抽出してから後でチェックデジット計算しますので
数字13桁のみで大丈夫です。
0528デフォルトの名無しさん
垢版 |
2018/06/24(日) 15:06:08.45ID:F1zD07yq
数字40桁くらい連続してたらどうする?
0531530
垢版 |
2018/06/24(日) 20:41:43.34ID:LPLL+qJx
先頭と末尾も考慮すると
https://regex101.com/r/xT760t/2
(?:(?<=[^0-9])|^)[0-9]{13}(?:(?=[^0-9])|$)

ただかなりバックトラックするから性能は悪い
どうせチェックディジット確認するなら13桁以上で全抽出して桁数チェック追加した方がマシに見える

https://regex101.com/r/xT760t/4
[0-9]{13,}
0532デフォルトの名無しさん
垢版 |
2018/06/24(日) 23:39:40.09ID:chBT6m1a
結構、難しい

A <13桁の数字> B

A の部分が、文字列の先頭か、数字以外で、
B の部分が、文字列の末尾か、数字以外
0534デフォルトの名無しさん
垢版 |
2018/06/25(月) 08:32:20.35ID:g3low2hV
>>531
先読み後読みは先頭や末尾にも一致するからそういうのは無駄
>>530の二つ目で完成している
0535デフォルトの名無しさん
垢版 |
2018/06/25(月) 09:21:19.58ID:9/L2g6Oc
>>534
せやな, 否定前後読みならそのままでよかったわ(肯定で試しちゃった)
ただどのみちバックトラック多くて無駄だから正規表現だけでやるのでなければ13桁以上でマッチングして桁数判定入れるべきだと思う
0536デフォルトの名無しさん
垢版 |
2018/06/25(月) 21:12:44.36ID:lRi8bnr9
13桁を超えていても候補として受け取っておいて
チェックデジットの計算の手前で落とします。

どうもありがとうございました。
0537デフォルトの名無しさん
垢版 |
2018/06/26(火) 18:51:05.99ID:PFtq6YS9
文字列の先頭の文字以外を*に変換する
というのはどう書けばいいでしょうか?
0538デフォルトの名無しさん
垢版 |
2018/06/26(火) 20:16:27.74ID:IMFKH44M
こういうこと?

$perl -pe 's/(?!^)./*/g'
alpha
a****
beta
b***
gamma
g****
$

良い方法かどうかはわからないが。
0539デフォルトの名無しさん
垢版 |
2018/06/26(火) 20:22:51.32ID:IMFKH44M
perl -pe 's/(?<!^)./*/g'
とすべきだったかな。
0540デフォルトの名無しさん
垢版 |
2018/07/04(水) 22:06:49.23ID:gFgZc5FG
J1Q
0542デフォルトの名無しさん
垢版 |
2018/07/16(月) 14:08:24.67ID:80hpbb9v
1 2 3 の3つの文字を、順番不同で、必ず各々、1つ以上含む

a23b1 → 真
1a2 → 偽

これは順番の組み合わせだから、正規表現で出来ますか?
0543デフォルトの名無しさん
垢版 |
2018/07/16(月) 14:41:45.67ID:/+vnEc6c
>>542
先読みが使えれば

^(?=.*1)(?=.*2)(?=.*3)
0544デフォルトの名無しさん
垢版 |
2018/07/25(水) 19:56:10.60ID:1XdhMp/e
サクラエディタで
<>で囲まれていない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が沢山あるので変換しきれません
何とかならないでしょうか
0547デフォルトの名無しさん
垢版 |
2018/07/26(木) 09:15:37.25ID:4NbdqkDU
>>545>>546
できた!できました!
ありがとうございます
0548デフォルトの名無しさん
垢版 |
2018/07/29(日) 09:53:04.64ID:JxpitKP8

パターン1, (\d+)月(\d+)日
パターン2, (\d+)月(\d+)数字以外(\d+)日
これを一回で取得したい

●対象データ
7月1日
7月2〜4日
7月6から10日
7月12・13日

●希望する結果
7,1
7,2,4
7,6,10
7,12,13

お願いします
0552デフォルトの名無しさん
垢版 |
2018/07/29(日) 11:42:16.30ID:kCYuy8BN
数字取り出して変数に入れるだけなら /(\d+)月(\d+)(?:\D+(\d+))?日/gu で仕舞いだが
0556デフォルトの名無しさん
垢版 |
2018/08/12(日) 20:55:52.79ID:MOc1ccj1
C#で正規表現を使ってHTML内から文字コードをとってきたいのですが
以下の場合だと"UTF"としか取得できません。
"UTF-8"と取得する場合どうすればいいでしょうか?

<[^>]*\bcharset\s*=\s*[""']?(?<charset>\w+)\b


<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
0557デフォルトの名無しさん
垢版 |
2018/08/12(日) 21:30:40.27ID:mMH07JtW
>>556
HTMLは扱いが難しいからパーサ使った方がいい
どうしても正規表現だというなら,

1. とりあえず的な修正
https://regex101.com/r/sIUmzD/2
/<[^>]*\bcharset\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)")\b/$1$2$3/i

2. もう少し気合の入れた修正
https://regex101.com/r/sIUmzD/1
|<meta
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*
(?:\s+charset(?:\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)"))?)
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>|$1$2$3|i

ぐらいか
でもこれ後で読むのしんどいでしょ
0559557
垢版 |
2018/08/12(日) 21:53:09.85ID:mMH07JtW
2.の方を若干修正, charsetには値が必要ですわ
https://regex101.com/r/sIUmzD/3
|<meta
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*
(?:\s+charset\s*=\s*(?:([^\s"'=><`]+)|'([^']*)'|"([^"]*)"))
(?:\s+[^\s"'>/=]+(?:\s*=\s*(?:[^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>|$1$2$3|i
0560デフォルトの名無しさん
垢版 |
2018/08/12(日) 22:00:37.17ID:MOc1ccj1
>>557
ありがとうございます!
当方がやりたかったことは、HTMLをテキストデータとして大量に取得して、その中から特定のワードでの絞り込みです。
正しい文字コードでHTMLを落としてからパースしようと思ったのですが、確かにパーサでやる手もありそうですね

正規表現は今まで避けてきたので、読むのがシンドイっていうかチンプンカンプンですが
求めていた動作です。とても助かりました。
使わせてももらいます。ありがとうございました。
0561デフォルトの名無しさん
垢版 |
2018/08/12(日) 23:56:24.69ID:2UQfVx23
HTML のように、要素に親子関係があるもの・構造化されたものは、正規表現じゃ無理

<1><x></x><y></y></1>

開き・閉じタグで、前から一致させると、
<1></x> が対応してしまう

ネストも無限にできるから、対応させるのは無理。
パーサを使うべき
0564デフォルトの名無しさん
垢版 |
2018/08/13(月) 03:34:58.19ID:EnLsbSTB
>>561
一部の環境では括弧等のネスト構造を取り扱いをサポートした正規表現があるよ
PCRE(Perl 5.10以降)やruby(鬼雲)、Python,PHPなどでも
C#の.NET Framework環境でもあったんじゃないかな
0567デフォルトの名無しさん
垢版 |
2018/08/24(金) 02:29:36.02ID:cgE41D9D
>>561
> HTML のように、要素に親子関係があるもの・構造化されたものは、正規表現じゃ無理

そういうこともできるように拡張した正規表現があればいいのに
さらに階層、treeも可
0570デフォルトの名無しさん
垢版 |
2018/08/24(金) 10:38:07.25ID:wb3Q/jKx
なんか知識が数年前で止まっちゃってる人がちらほらいるな
正規表現がネストに対応したのなんてもう一昔前ってイメージだけど
0572デフォルトの名無しさん
垢版 |
2018/08/24(金) 12:48:35.65ID:ZVlysGry
なんでも正規表現で済まそうとするひとって
意地でもVBA使い続けてるひとと大差ない
0575デフォルトの名無しさん
垢版 |
2018/08/24(金) 18:58:08.09ID:wb3Q/jKx
>>572
賢い人程手段をたくさん知り
その中から取捨選択するからな

>>571
さすがに勉強不足すぎだろw
何年前で知識止まってんだよ
0577デフォルトの名無しさん
垢版 |
2018/08/25(土) 00:35:41.84ID:I7tIpqHO
底辺に行くほど知識自慢はしかたがないだろ、正規表現に限らず

ただ掲示板的に質問したいのにバカがしゃしゃり出てきて迷惑だよな
0578デフォルトの名無しさん
垢版 |
2018/08/25(土) 10:52:22.58ID:J+b/MRtJ
的確な指示されても気に入らない回答だからと人の話を聴かない人は成長しないよ
自分の気に入る回答しかも自分と同じレベルの回答もらって喜んでればいい
0579デフォルトの名無しさん
垢版 |
2018/08/26(日) 15:08:37.66ID:sCPJIsfv
俺なんか中学の勉強もロクにしなかったのに正規表現を理解したいから
今、大学レベルの数学を勉強してる・・なかなか進まないけどね・・

>>556 の質問からパーサとか出てくるのはちょっと違うと思うよ
metaタグ拾えばいいだけだよね?難しく考えすぎだよ

あとHTMLソースのほうが糞で実際の文字コードとmetaタグで指定されてる
文字コードが違うなんてことや、文字コードの指定が複数個所あるなんていう
2ページ分のHTMLをそのままくっ付けましたなんていうのも稀にあるから
そういう糞なHTMLを相手にする場合は対応を考えないといけないね
0583デフォルトの名無しさん
垢版 |
2018/08/26(日) 18:08:41.45ID:sCPJIsfv
自分用に作るならこんな感じかなぁ、動作確認してないので使わないでね

|
<meta (?=\s) [^<>]* \s charset \s* = \s* (?:["']\s*)? ([^\s"'<>;]+)
|x;

こういうのは想定外  ※  " " の中に > がある

<meta comment="a>b" charset="UTF-8">
0585デフォルトの名無しさん
垢版 |
2018/08/26(日) 18:36:53.61ID:sCPJIsfv
>>583 のほうがスマートなのは一目瞭然でしょ
ただ >>583 は こんな感じ 程度のものなのでツッコミ所があっても知らないよ
0586デフォルトの名無しさん
垢版 |
2018/08/26(日) 18:37:23.43ID:5oVMxLBv
mataタグでのcharsetは定型的でしか使われないんで、仕様的に色々な場合に対応するのは無駄
俺が使うなら、こんなので十分
/<meta[^>]*\scharset=(["'])((?:(?!\1).)+)/i
0588デフォルトの名無しさん
垢版 |
2018/08/27(月) 04:46:33.83ID:2QlJLeh2
マッチングテスト

[1] <meta charset="UTF-8">
>>557 1. 失敗
>>559   マッチ
>>583   マッチ
>>586   マッチ

[2] このスレのHTML
557 1. マッチ
559   失敗
583   マッチ
586   失敗
0589デフォルトの名無しさん
垢版 |
2018/08/29(水) 16:43:59.44ID:4UnjToZE
こんなバカが回答者してたのか
過去レス見ると前から張り付いてるようだね
0591デフォルトの名無しさん
垢版 |
2018/08/31(金) 21:09:12.34ID:5NewXZva
bregonig.dll 2017/01/17 Ver.4.10 非包含オペレータに対応

うーん、非包含にマッチする正規表現はいつか自分で作れるように
なりたいと思ってたけど内部で勝手に作ってくれる時代になってしまったか〜

自分の知識は2013あたりで止まってるから浦島だ
0592デフォルトの名無しさん
垢版 |
2018/09/01(土) 01:28:06.31ID:0IlLcsWm
ab(?~ba)ba

これを

ab((?!ba).)*ba

この従来通りの方式をベースに記述して、かつ、前者とまったく同じ
動作に書き直すことは可能かな?

両者の違いについては>>590のリンク参照
0593デフォルトの名無しさん
垢版 |
2018/09/01(土) 22:17:13.09ID:0IlLcsWm
(?~abc)
これは↓とまったく同じ動作になると言って良さそう
(?:(?!abc).)*(?:(?=abc).{1,2})?

否定したい文字列が固定長なら先読みで書き換え可能らしい
0594デフォルトの名無しさん
垢版 |
2018/09/12(水) 19:47:12.85ID:j29ToL0A
正規表現を言語化できるようなとこ知りませんか?

/^ab/
これを入れると、

「abで始まる」
と変換されるようなサービスって無いでしょうか?
0595デフォルトの名無しさん
垢版 |
2018/09/13(木) 09:47:15.83ID:l9KSlvFS
せっかく正規表現にした意味が無い
0597デフォルトの名無しさん
垢版 |
2018/09/13(木) 13:28:20.78ID:a9m+mGXQ
視覚的に見れるサイトじゃなくて視覚的に作れるサイトがあったら便利かな
メタ文字を覚える必要が無くなるし動作を把握しながら作れる
そういうのが普及したらいいね
0598デフォルトの名無しさん
垢版 |
2018/09/14(金) 00:35:39.11ID:qC9qAPWt
そういうのとはちょっと違う&grepツールになっちゃうけど
TresGrepってのが入力欄でのマウス右クリックから正規表現を指定出来たり
正規表現1文字入力ごとにエラーチェック⇒NGならエラーメッセージを表示したりと
ちょっと便利
0600デフォルトの名無しさん
垢版 |
2018/09/14(金) 14:14:58.44ID:grBP2MzP
TresGrep使ってみたけど良くできてる
正規表現に何かしらの思い入れがあるのが分かる気がする

特に正規表現の複数行入力が出来るのはいい
自分は複数行入力が当たり前になるべきだと前から考えていて
それが実装されててちょっと感動してしまった
0601デフォルトの名無しさん
垢版 |
2018/09/17(月) 12:06:03.62ID:SR+usNFF
C#、System.Text.RegularExpressions.Regexの正規表現で

xxの中を取り出すにはどうしたらいいのでしょう?
ただし取り出したいのはトップのxxで、xxが閉じる前にyyがあるときはそのxxは無視という条件付きです

対象文字列 "<xx><xx><yy>111</yy></xx></xx><xx>222</xx><xx>333</xx>";
試した正規表現 @"<xx>.*?[^(</yy>)]</xx>"

結果
 <xx><xx><yy>111</yy></xx></xx><xx>222</xx>
 <xx>333</xx>

欲しい結果
 <xx><xx><yy>111</yy></xx></xx>
 <xx>222</xx>
 <xx>333</xx>
0602デフォルトの名無しさん
垢版 |
2018/09/17(月) 13:51:51.89ID:tNilsymD
プログラムとはちょっと違うのですが、2chMateで荒らしをNGする正規表現を作りたくて悩んでます

日本語で書くと、

"http://";又は"https://";が合わせてn回以上出てきた場合(対象は複数の改行を含む文字列)

にマッチするような正規表現って可能でしょうか?
0604602
垢版 |
2018/09/17(月) 15:04:16.06ID:tNilsymD
>>603
迅速なご回答ありがとうございます。
この方法でうまくいきました!
0605デフォルトの名無しさん
垢版 |
2018/09/18(火) 00:00:11.49ID:lHFpavF+
>>601
.NET Frameworkの正規表現は知らんけど、鬼雲でなら
(?=<xx>)(<(\w+)>([^<]*|\g<-3>)*</\k<-2-0>>)
これは最低限のものでイレギュラーなものには対応しない
  文字列でエスケープされてるとかコメントが入ってるとか
  タグにタグ名以外の余計なものが入ってるとか(</a href=...>とか<br />とか)
  ペアでないタグがあるとか(<br>のような単独タグ,<xx>と</xx>のどちらかしかないとか)
そういうのにも対応させるなら工夫して

一応、.NET Frameworkの正規表現の再帰については
https://qiita.com/HMMNRST/items/15800514bbe66f504789
0606デフォルトの名無しさん
垢版 |
2018/09/18(火) 00:12:00.46ID:oPOmCM6y
ありがと。もう少し単純にできるかと思っていたけどそんなに複雑になるのね
正規表現使わずにやる方向で考えてみます
0607583
垢版 |
2018/09/18(火) 00:55:53.38ID:t0fL3l18
>>605のリンク先見てやっつけで作ってみた

<xx>(?>(?:(?!</?xx>).)*)</xx>|<xx>((?'open'<xx>(?>(?:(?!</?xx>).)*))+(?'-open'</xx>(?>(?:(?!</?xx>).)*))+)*</xx>(?(open)(?!))
0609583
垢版 |
2018/09/18(火) 02:17:30.59ID:t0fL3l18
ミスってた、>>607はボツってことで・・
タグとタグの間の文字列の扱いが意外と難しい
0610デフォルトの名無しさん
垢版 |
2018/09/18(火) 06:08:34.66ID:oPOmCM6y
確かにダメ質問者w
「xxが閉じる前にyyがあるときはそのxxは無視」という一見簡単そうなルールが予想以上に難しいようで
楽したいから正規表現使いたいのだけどあまり複雑になると楽じゃないからほかに逃げたくなる
0611デフォルトの名無しさん
垢版 |
2018/09/18(火) 07:04:18.68ID:iA/s8q9i
ぶっちゃけ欲しい結果が何なのか結局よく分かってない

<xx>(?:(?<tag><(?!yy>)(?<tagname>[a-z]+)>)*\d+(?<-tag></\k<tagname>>)*(?(tag)(?!)))*</xx>
0612デフォルトの名無しさん
垢版 |
2018/09/18(火) 07:13:00.25ID:oqy73oSH
ID変わった
その表現だと <xx><xx><yy>111</yy></xx>
欲しい結果は<xx><xx><yy>111</yy></xx></xx>
こういう尻切れになることが多い
0613デフォルトの名無しさん
垢版 |
2018/09/18(火) 07:16:10.21ID:iA/s8q9i
どういうことよ
>>611の正規表現で <xx><xx><yy>111</yy></xx></xx><xx>222</xx><xx>333</xx> にマッチングすると

<xx>222</xx> と <xx>333</xx> にマッチするでしょ?
<xx><xx><yy>111</yy></xx> はどこから出てきたの?
0614デフォルトの名無しさん
垢版 |
2018/09/18(火) 07:42:45.15ID:oqy73oSH
申し訳ないミス。"<xx>.*?</xx>"の1件目の結果だったw
その正規表現だと2件マッチ
欲しい結果は>>601にある3件
0615デフォルトの名無しさん
垢版 |
2018/09/18(火) 07:46:54.65ID:iA/s8q9i
> xxが閉じる前にyyがあるときは
これは直前ってこと?
<xx><yy>111</yy></xx> にはマッチしないってことでいいの?
0616デフォルトの名無しさん
垢版 |
2018/09/18(火) 07:55:40.50ID:lHFpavF+
>ただし取り出したいのはトップのxxで
これだけで<yy></yy>があろうがなかろうが良いと俺は思ったんだけど
0617デフォルトの名無しさん
垢版 |
2018/09/18(火) 08:27:12.31ID:iA/s8q9i
yyがどうでもよければ
<xx>(?:(?:<(?<tag>[a-z]+)>)*\d+(?:</(?<-tag>\k<tag>)>)*(?(tag)(?!)))*</xx>
かなぁ
0618デフォルトの名無しさん
垢版 |
2018/09/18(火) 08:36:05.56ID:oqy73oSH
閉じる前というのは直前という意味で
対象が"<xx><xx><yy>111</yy></xx></xx><xx>222</xx><xx>333</xx><xx><yy>444</yy></xx>"
の場合は、<xx><yy>444</yy></xx>を無視したの3件マッチにしたい
>>611>>617ベースできそうだからがんばってみます。ありがとう
0620583
垢版 |
2018/09/18(火) 12:56:18.97ID:t0fL3l18
本来の数学的な正規表現という意味では向いてる質問なんだけどね
これぞ正規表現の仕事っていう質問

でもプログラムの検索で使う正規表現ではなかなか使われないね
0621583
垢版 |
2018/09/18(火) 13:25:09.30ID:t0fL3l18
>>607を修正

<xx>(?>(?:(?!</?xx>).)*)((?'open'<xx>(?>(?:(?!</?xx>).)*))+(?'-open'</xx>(?>(?:(?!</?xx>).)*))+)*</xx>(?(open)(?!))

これは>>605のリンク先の例を↓のように書き換えただけ

< を <xx>・・・
> を </xx>・・・
\A を <xx>
\z を </xx>

「・・・」 は<xx>または</xx>の間に挟まれている文字列

>スタック使う構文が必要な時点で
ああ、その通りだ、(r+s+)+ だけでは作れない
0622583
垢版 |
2018/09/18(火) 13:29:58.42ID:t0fL3l18
間違い
\A を <xx>

正しくは
\A を <xx> ・・・
0623583
垢版 |
2018/09/18(火) 18:51:49.51ID:t0fL3l18
>>611のはミスってるね
<xx><b><a>111</a></a></xx> にマッチする
<xx><b><a>111</a></b></xx> にマッチしない
この問題は>>617で修正されてる

()* \d+ ()* のところが0回以上のループで正しく動くのは面白いな
一番外側の (?: )* はいらないかも
0624583
垢版 |
2018/09/21(金) 05:18:40.73ID:LI7qokUP
(?# 主要部)
<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)?+
)
)
0625デフォルトの名無しさん
垢版 |
2018/09/21(金) 05:54:00.34ID:LI7qokUP
こだわった点

・主要部と定義部に分けて全体の構造が分かりやすくした
・繰り返しは全て強欲。無駄なバックトラックをさせない
・再帰には * を使わず、部分呼び出し自身に繰り返しをさせている
・定義部は (?:|(?!) 〜 ) として定義部がサーチに使われるのを避けている

>>605には ([^<]*|\g<-3>)* という部分があって
([^<]*)* というバックトラック処理がえらいことになる部分があって気になった

あと再帰を使ってるのにループを * にさせているのを見て
* を使わずに書けるはずだと思って作ってみた
0626デフォルトの名無しさん
垢版 |
2018/09/21(金) 06:11:13.31ID:LI7qokUP
こういう書き方をした正規表現をサクラエディタで使おうとすると
1行に繋げなければならない、これでは不便すぎる
鬼雲の強力な正規表現を快適に使い倒せるようにするべき

出来れば複数行で書いた正規表現を1行に繋げる機能が欲しい
そうすればここのような掲示板に貼るときに便利
 逆に1行で書かれた正規表現を複数行に直す機能も欲しい
手動でいちいち改行を入れる手間が省けて快適になる

この2つの機能は正規表現ライブラリに実装されることが望ましい
そうすれば他のテキストエディタの作者も気軽に実装出来るようになる
正規表現に新しいメタ文字が作られたときの対応も容易になる
0627デフォルトの名無しさん
垢版 |
2018/09/21(金) 06:18:04.46ID:LI7qokUP
出来れば定義用の新しいコマンドが欲しい

定義のためのカッコなのにキャプチャが有効になってたり、
正規表現オブジェクトが無駄に肥大化してしまったりするから
0628デフォルトの名無しさん
垢版 |
2018/09/21(金) 07:17:48.30ID:fJq/snux
>>626
> 出来れば複数行で書いた正規表現を1行に繋げる機能が欲しい
ここはム板なので言い出しっぺの法則が適用されます
0629583
垢版 |
2018/09/21(金) 19:24:14.97ID:LI7qokUP
>>628
テキストエディタの正規表現の入力ウインドウに付けて欲しいんだ
次世代のテキストエディタは↓こうなって欲しい

1、画面をいっぱいに使って正規表現の複数行の記述が出来る
2、複数行で書かれた正規表現を一行に繋げるボタン
3、一行で書かれた正規表現を複数行に展開するボタン

これがスタンダードになるといいな
0632デフォルトの名無しさん
垢版 |
2018/09/21(金) 23:08:38.86ID:3+OghnRP
extendedフラグを付けて鬼雲に渡せば、複数行で処理してくれる。
エディタ側で1行にくっつけたりする必要はない。
0633583
垢版 |
2018/09/21(金) 23:41:08.24ID:LI7qokUP
>>632
そういうことじゃないんだな、>>626を読んでね

ちなみに複数行の正規表現を一行に繋げるのはかなり簡単なんだけど
一行で書かれた正規表現を複数行に展開するのはかなり難しい
正規表現のパーサを作るということになるから

だから正規表現ライブラリに実装されることが望ましい
ライブラリの作者なら細かい挙動まで把握しているから正確なパーサが作れる

逆にテキストエディタの作者がやろうとすると動作を把握しきれずに
不完全なものになったり、実装を諦めたりすることになりかねない
複数行をスタンダードにするためにはライブラリ側での実装が必須となる
0635583
垢版 |
2018/09/22(土) 21:31:53.89ID:SLHR4wJP
>>634
bregonig.dllはプログラミング用のライブラリをテキストエディタでも
使えるようにしたっていう感じなのでプログラミングに必要のない機能は
付けたくないと思う、管理が大変になるからね
だから次世代の正規表現ライブラリと次世代のテキストエディタに期待

ちなみにテキストエディタに重きを置いたライブラリならこんなのが可能になるはず

検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) )
置換:\k'color'

対象テキスト: blue
置換結果:青

現状の bregonig.dll でこれが出来ないということはプログラミングでなんとかなる
機能は付けないということ

テキストエディタのほうは改行をまたぐマッチの実現に苦戦してるようで
この問題が解決しないと高度な正規表現は宝の持ち腐れになるだけなので
次世代のテキストエディタに期待しましょう

>鬼車オリジナルの作者さん
別人だとは知りませんでした^^;
0636デフォルトの名無しさん
垢版 |
2018/09/26(水) 01:40:37.36ID:3FykrnoG
xyz? を含まないものにマッチする正規表現
http://www.din.or.jp/~ohzaki/regex.htm#WithoutXY
http://www.din.or.jp/~ohzaki/regex.htm#WithoutXYZ

> fmcat =(retofm

..のところで導かれている正規表現は明らかにxyやxyzを含む正規表現だけど
これは単なるミスなのかな?こんな難しいことをやってる人がこんなミスを
見逃すとはとても思えないから何か違うものなのかなぁ・・
0638デフォルトの名無しさん
垢版 |
2018/09/26(水) 10:58:06.87ID:3FykrnoG
>>637
> fmcat =(retofm
で始まる3行のところの正規表現についてですよ?
(〜)* x (〜)* yz の形なので明らかにxyzにマッチします

*y(x*[^xy]y*)*x* は誤植でしょうけど・・
0640デフォルトの名無しさん
垢版 |
2018/09/26(水) 23:39:54.65ID:3FykrnoG
やっぱり間違いなんですかね?
プログラムを使って自動的に算出してるようなのに・・
0641デフォルトの名無しさん
垢版 |
2018/09/27(木) 00:18:43.29ID:0xNuoCxe
俺もわからんけど、prologらしいから、括弧や表記はスタック順になってるとかでは?
0642デフォルトの名無しさん
垢版 |
2018/09/27(木) 02:58:15.53ID:TOnM2DUW
>prolog
なるほど、"xyを含まない正規表現" のところに grail って書いてあったのは
prologとやらの実行ソフト名だったのか
https://github.com/RichardMoot/Grail

これの使い方を調べれば謎が解けそうですね
暇なときに試してみます、ありがとう
0643デフォルトの名無しさん
垢版 |
2018/10/06(土) 17:50:41.16ID:0JYIRqz1
検索対象文字 <test>a="akari"desu</test>

正規表現 a="*"

で、検索結果が「a="akari"」でなく、「a="」しか取得できないのはなぜでしょうか?
0644デフォルトの名無しさん
垢版 |
2018/10/06(土) 17:56:12.23ID:e52HQVrn
馬鹿には無理
0645デフォルトの名無しさん
垢版 |
2018/10/06(土) 18:01:22.57ID:FAIH8E2E
a=\".*\"

メタ文字(ダブルクォート)をバックスラシュでエスケープ
.(ピリオド)で任意文字で0文字以上(アスタリスク)をつければ
とりあえずイケル

それでも意図どおりにマッチングしないことは予見できる
0646デフォルトの名無しさん
垢版 |
2018/10/06(土) 18:14:31.01ID:OZkGL/sg
ワイルドカードと混同しちゃってるのか
ワイルドカードと正規表現を同時に使えるTresGrepなら動くかも
0649デフォルトの名無しさん
垢版 |
2018/10/14(日) 12:53:05.30ID:zaukh1NH
>>643
ワロタw
正規表現の*とワイルドカードは違うぞ。詳しくはググれ。

多分a="[^"]*"でいけると思うけど詳しくはググれ。
0650デフォルトの名無しさん
垢版 |
2018/10/14(日) 14:33:15.06ID:eP/1gSav
ちょいと質問させて
a="[^"]*"
と書くことが多いんだけど
a=".*?"
と書くのとで結果に違いでるのかな?
0652デフォルトの名無しさん
垢版 |
2018/10/14(日) 15:11:22.83ID:zaukh1NH
あと、.*?は使えない正規表現の処理系があるんじゃなかったっけか。詳しくは(ry
0654デフォルトの名無しさん
垢版 |
2018/10/14(日) 22:51:29.78ID:yTLvFK6H
1、<test>a="[^\"]*"</test>
2、<test>a=".*?"</test>

この2つが↓これにどうマッチするか試してごらん
---------------------------------------------------------------------------
<test>a="pokemon"(^-^)</test> <test>a="doramon"</test>
----------------------------------------------------------------------------
0655650
垢版 |
2018/10/14(日) 23:38:50.12ID:wMwKNjnw
>>654
サンプルありがとう
でも、そういった検索/置換対象の場合だったら .*? は最初から考えないとは思う
0656デフォルトの名無しさん
垢版 |
2018/10/15(月) 00:13:04.80ID:fKW/Yset
この誤爆のことに注意を払えているなら .*? で問題ないよ
[^"] はそういう心配をしなくて良くなるからこっちを予防的に使うのもあり
0657デフォルトの名無しさん
垢版 |
2018/10/15(月) 22:36:58.63ID:fKW/Yset
# 文字列 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
);
0658デフォルトの名無しさん
垢版 |
2018/10/15(月) 22:37:39.83ID:fKW/Yset
# 文字列 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
);
0659デフォルトの名無しさん
垢版 |
2018/10/18(木) 14:54:58.45ID:s3Db0e4D
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] を消せる、完成
0660デフォルトの名無しさん
垢版 |
2018/10/18(木) 23:54:36.85ID:s3Db0e4D
こっちのほうがスマートだ..

# 状態遷移図から導かれる正規表現
([^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*
0661デフォルトの名無しさん
垢版 |
2018/10/20(土) 20:45:04.19ID:WB0b2hD6
(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)*)*)*$
0662デフォルトの名無しさん
垢版 |
2018/10/21(日) 19:43:06.22ID:7AODCPK7
(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* は分岐を無限に増やす入り口のような役割をする
0663デフォルトの名無しさん
垢版 |
2018/10/21(日) 23:04:31.26ID:mkrTRrBN
このスレで名前が挙がってたTresGrep、気が付いたらbregonig.dllにも対応してるじゃん
プルダウンのモード切替で.NETの正規表現と切り替えられるのもいい感じ
もうこれでサクラエディタのGrepはお役御免にできるかもしれない

なんだけど・・・rubyの正規表現が全部使えるわけじゃないのに
「鬼雲検索」
を名乗るのはどうなんだろう
0664662
垢版 |
2018/10/22(月) 01:40:50.08ID:oA8lJo/T
>>663
ちょろっと試してみたけど戻り読みも後方参照も再帰もちゃんと動いたよ?
動かないのがあるならこちらで検証するよ〜
0666662
垢版 |
2018/10/22(月) 14:03:03.71ID:oA8lJo/T
自分は文字コードの知識が無いので迂闊なことは言えないから
ちょっと調べたことだけ書いておくね

ここで
http://k-takata.o.oo7.jp/mysoft/bregonig.html
\u0149 を検索してみるとbregonigでも使えてそうなことが書かれてたよ
0667662
垢版 |
2018/10/22(月) 21:23:16.87ID:oA8lJo/T
サクラエディタでいろいろ実験してたら \s が全角スペースにマッチした
サクラエディタ向けの正規表現を作るときには気を付けないといけないな
0668デフォルトの名無しさん
垢版 |
2018/10/22(月) 23:33:25.25ID:aIOUU5bU
bregonigは鬼雲の機能限定版(perl互換の正規表現だけが動く)って話をどこかで読んだ記憶があったんだよね
どうせやるなら本家onigmoのRuby版正規表現も全部動くようにすればいいのに、って思っただけなんだ
ちょっと難癖に近いなとは自分でも思ってる

\sもそうだけど\dに全角数字がマッチしちゃって痛い目に合うのもまれによくあること
サクラに限らないんじゃないかね
0669デフォルトの名無しさん
垢版 |
2018/10/23(火) 00:10:38.63ID:W9szHIq5
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なので
https://egg.5ch.net/test/read.cgi/software/1536058236/515
に対して、\d{6}がマッチするのはXenoのみである
0670662
垢版 |
2018/10/23(火) 00:11:35.27ID:FESm7ID8
なるほど、dll からは ONIG_SYNTAX_PERL しか使えないから
ruby を使い慣れてる人にとっては歯がゆいと..

> \dに全角数字がマッチしちゃって
ですね〜、(?a) で防げるようなので覚えておきます
0671デフォルトの名無しさん
垢版 |
2018/10/23(火) 00:18:39.55ID:FESm7ID8
レスが被ってしまった..

>>669
ありがとうございます
サクラエディタはUnicode仕様で動いているんですね
う〜ん、文字コードの話は難しいなぁ
0672デフォルトの名無しさん
垢版 |
2018/10/23(火) 00:24:56.92ID:W9szHIq5
なおUnicodeの空白でも、上記のCc(0009〜0085)、LS,PS,Zs(Space Separator)
以外のCf(200b,200c,200d,FEFF)だとどうかなと試したが案の定マッチしなかった
さすがは仕様どおりだ
0673デフォルトの名無しさん
垢版 |
2018/10/23(火) 01:02:05.21ID:FESm7ID8
> 200b,200c,200d,FEFF

サクラエディタにIMEパッドから打ち込んで試してみたら同じくマッチせず

# 主要部
(?&sp)
# 定義部
(|(?!)
(?<sp>
(?u)
[\x{200b}\x{200c}\x{200d}\x{FEFF}\s]
)
)

自分がこれ使うことは永遠になさそうだけどとりあえず..
0675デフォルトの名無しさん
垢版 |
2018/10/25(木) 14:38:08.86ID:4OmhnPU0
あるファイルパスがありディレクトリのN階層目までのみを抽出したいのですが、正規表現について教えてください

例えばこんな入力のリストがある場合
aaa
aaa/bbb/ccc
aaa/bbb/ccc/ddd/eee/fff
で各リストに対して2階層目までを取得したい場合
aaa
aaa/bbb
aaa/bbb
となるのが期待値です。

((?:¥w+¥/?){1,2})とかしてみたんですが上手くいきませんでした、お手数ですがよろしくお願いします
0676デフォルトの名無しさん
垢版 |
2018/10/25(木) 15:23:45.93ID:RdSksp9Y
>>675
正規表現はプログラム言語や正規表現オブジェクトのオプションによって
動作がけっこう変化するので質問するときはそういうの書いてね

[^/]+(?:/[^/]+)?

ただしこれは正しいパスが与えられることを前提としているので注意
0678デフォルトの名無しさん
垢版 |
2018/10/25(木) 15:39:26.06ID:5Cy/pQlU
./ で始まってたらどう数えるん
/ で始まってたら?
0679デフォルトの名無しさん
垢版 |
2018/10/25(木) 17:47:09.80ID:4OmhnPU0
>>676
ありがとうございます、perlが希望でしたので次回から書くようにします
例は2階層で固定のようですが、ちなみにn階層目とか可変で書くような場合は下記のような感じで良いでしょうか?
[^/]+(?:/[^/]+){0,n-1}
0680デフォルトの名無しさん
垢版 |
2018/10/25(木) 18:40:41.61ID:RdSksp9Y
ああ、N階層までのマッチという質問だったのか、ごめんね
それで合ってるよb
0681デフォルトの名無しさん
垢版 |
2018/10/26(金) 10:18:13.83ID:MwloQati
暇つぶしに鬼雲の再帰処理に欠陥がないか探してみたけど見つからなかった

例、\1 を空文字にマッチさせて再帰の無限ループを狙う
()(?<name>a|\1\g<name>c)

例2、<x> を複数使ってマッチするのが空文字ではないように見せかける
(?<x>)(?<x>text)(?<name>a|\g<x>\g<name>c)
0682デフォルトの名無しさん
垢版 |
2018/10/26(金) 23:39:01.03ID:MwloQati
・perl 5.22

if ( "a" =~ /^\Fa\E$/ )
{ print "match.\n"; }
else
{ print "no.\n"; }
# 結果: match.

・ サクラエディタ + bregonig.dll (ONIG_SYNTAX_PERL)

検索欄: ^\Fa\E$
テキスト: a
結果: 見つかりませんでした

\F の意味が知りたい..
0684デフォルトの名無しさん
垢版 |
2018/10/28(日) 00:53:19.71ID:ZnGbnC1U
http://jane2ch.net/community/kako/1299/12999/1299979723.html
レス241からの高速化の話題を検証してみた

レス243
>1は例えば (?:http://)〜 と、始めの数バイトをグループ化してやると速くなる

検証結果: 速度変わらず

レス245
> : の部分で一旦切れるようにすれば条件は平等になると思う
> (?:http:|ttp:|tp:) が速いわけではないと分かる

検証結果:
1. 10.345 ms
2. 10.560 ms
3. 05.130 ms

結論: (?:http:|ttp:|tp:) は速かった
0685デフォルトの名無しさん
垢版 |
2018/10/28(日) 01:36:44.44ID:ZnGbnC1U
<鬼雲のリファレンス>

(?<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} をコピペしなくて済む
とんこ式の とんこ とは発案者の名前とのこと
0686デフォルトの名無しさん
垢版 |
2018/10/28(日) 14:53:16.06ID:ZnGbnC1U
これらの記述法には1つ弱点があり

(?<name>ほにゃらら){0}

より前に

\k<name>

が出現すると文法エラーになる

例、
(?<tag>foo \k<name> bar){0}
(?<name>ほにゃらら){0}
\g<tag>

このため定義する順序が限定されてしまう、これは解消されるべき問題である
0688デフォルトの名無しさん
垢版 |
2018/10/28(日) 15:36:10.31ID:ZnGbnC1U
昨日、詳説 正規表現の本を枕の下に置いて寝た
寝ている間に正規表現のパワーがもらえると思ったからだ

すると.. 夢に正規表現の神様が現れた

神様 「 \1 はな、 ${1} と書いてもマッチするんじゃよ」

朝、目覚めると飛び起きてperlを動かしてみた

if ( "aa" =~ /(a)${1}/ )
{ print "match!!\n"; }
else
{ print "no match..\n"; }

実行結果を見た私は奇跡を見ていた
0689デフォルトの名無しさん
垢版 |
2018/10/28(日) 20:54:51.63ID:ZnGbnC1U
revilog.com/2012/08/7939.html
> a?[a-z] という正規表現は [b-z]|aa? という正規表現と
> 等価であり置換可能

前者は ab にマッチするが後者は...

> 同様に[a-z]?[A-z]という正規表現は [A-Z]|([a-z][a-z]?)
> という正規表現と 等価であり置換可能

前者は aA にマッチするが後者は...
0690デフォルトの名無しさん
垢版 |
2018/10/29(月) 00:52:40.24ID:BYis7ms7
・ 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} でもマッチ
0691デフォルトの名無しさん
垢版 |
2018/10/29(月) 01:00:01.03ID:BYis7ms7
perl がマッチするのはもしかしたら内部的にunicodeになってるとかかな
自分はプログラマじゃないんでさっぱり
0692デフォルトの名無しさん
垢版 |
2018/10/29(月) 01:09:53.75ID:BYis7ms7
どうやら当たりらしい、unicodeに変換してからマッチしてた

if ( "あ" =~ /\x{3042}/ ) # true

if ( "あ" =~ /\x{82A0}/ ) # false
0693デフォルトの名無しさん
垢版 |
2018/10/29(月) 19:52:31.20ID:BYis7ms7
・再帰の穴を狙う2

(str)
(?<name>
(?(1)yes|no)
\g<name>
|inner)

↓これに書き換えると
(?(1)yes) → 文法エラー
(?(1)|no) → 文法エラー

ガードが鉄壁ですごい、ほんと良く出来てるな〜
0694デフォルトの名無しさん
垢版 |
2018/10/31(水) 16:56:37.48ID:ZWlmxwfj
(?(条件)真の式|偽の式) の不具合を発見

() に "?:" を付けるかどうかで結果が変わってしまう

対象テキスト: 13 に対し、

1、
\A(?<name>1)(?(<name>)(2|3))\z
結果:マッチ

2、
\A(?<name>1)(?(<name>)(?:2|3))\z
結果:みつかりません

bregonig.dll (shift_jis, unicode 両方で確認)

ちなみに対象テキストを 12 にするとどちらもマッチする
0695デフォルトの名無しさん
垢版 |
2018/10/31(水) 17:14:05.35ID:ZWlmxwfj
やっぱりこれ欲しいなぁ

検索:( red(?'color='赤) | blue(?'color='青) | yellow(?'color='黄) )
置換:\k'color'

対象テキスト: blue
置換結果:青

これの有無で便利度が数段変わるんだよね

これの代わりに複数回の置換を行うと \G を使うときに困る
同じものを複数回検索するので速度低下に繋がる
0696デフォルトの名無しさん
垢版 |
2018/10/31(水) 19:55:08.08ID:ZWlmxwfj
・ (?'name=~' )

変数name の中身をマッチテストする先読みの親戚のようなもの

(?'name' <div> .*? </div> )
(?:
 (?'name=~' \A .* abc .* \z)
 pattern1              # タグの間に abc があるとき
|
 (?'name=~' \A .* def .* \z)
 pattern2              # タグの間に def があるとき
|
 pattern3              # それ以外のとき
)

これもあると便利だけど (?(name) | ) で代用出来るから必要度は低い
0700デフォルトの名無しさん
垢版 |
2018/11/01(木) 17:34:43.67ID:+M+OiFJp
>>694 のバグがrubyでも起こることを確認
ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32]

原因は bregonig.dll でなく Onigumo にあるようだ

これは気付きやすい部類のバグだと思うんだけど
今までバグ報告が無かったようなのが不思議
takata神はここ見てるのかな
0701デフォルトの名無しさん
垢版 |
2018/11/01(木) 17:41:25.59ID:+M+OiFJp
# 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
0702デフォルトの名無しさん
垢版 |
2018/11/01(木) 23:04:15.23ID:dBKH7CcG
>>691
perlの場合、Encode::decode()でperl内部処理用文字コード(utf8の亜種っぽい何か)に
正しく復号しないと正規表現クラスを正しく使えない。
0703デフォルトの名無しさん
垢版 |
2018/11/02(金) 01:26:49.16ID:XP4jtOby
>>702
解説ありがとうございます
ということは今まで自分はperl内部の独自の文字コードにエンコードされた文字列に
対して正規表現を使っていたわけですね、恥ずかしながら初めて知りました
0704デフォルトの名無しさん
垢版 |
2018/11/05(月) 20:41:07.84ID:SJelCvn/
>>683
畳み込み文字ってなんですか?
0706デフォルトの名無しさん
垢版 |
2018/11/06(火) 18:39:37.29ID:4TN3vyid
<正常>

(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))
0707デフォルトの名無しさん
垢版 |
2018/11/06(火) 19:30:27.97ID:4TN3vyid
<異常>

(1)?
(?(1)(?:2|(3)))

置換: [$2]
対象テキスト: 3
結果: [3]

-----------
<正常>

(1)?
(?(1)(?>2|3)|4)

(1)?
(?(1)(?>2|3)|(?>4|5))
0708デフォルトの名無しさん
垢版 |
2018/11/06(火) 19:36:59.61ID:4TN3vyid
>>707 の実験でバグの原因が分かった

1、不要なカッコを取り除く処理が (?: ) を取り去った
2、分岐の "|" の意味合いが変わってしまった

ということだね、原因が分かれば回避が簡単なのでこのまま放置でも良さそう
0709デフォルトの名無しさん
垢版 |
2018/11/09(金) 18:21:43.84ID:BZlL2mTg
perl5.14

# 1文字が2文字にマッチ
if ( "fi" =~ /\A\x{fb01}\z/i ){ print "true\n"; } else { print "false\n"; }
0713デフォルトの名無しさん
垢版 |
2018/11/10(土) 00:21:29.46ID:EY2CMtcP
# \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
0714デフォルトの名無しさん
垢版 |
2018/11/10(土) 18:21:06.77ID:EY2CMtcP
# 検索表現の途中にある \G をマッチさせる
my $str = 'abcde';
$str =~ /abc/g;
if ($str =~ /abc\Gd/){ print "true\n"; } else { print "false\n"; }
0715デフォルトの名無しさん
垢版 |
2018/11/13(火) 00:16:05.06ID:QabZTjVa
# (?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
0716デフォルトの名無しさん
垢版 |
2018/11/13(火) 05:19:20.83ID:QabZTjVa
## (?{code}) を使って >>695 の置換
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> .
## バックトラックの対応、成功
0717デフォルトの名無しさん
垢版 |
2018/11/13(火) 21:32:36.34ID:QabZTjVa
# 仲間外れを探せ
if ("\x{1990}" =~ /
\N{U+1990}
#\N{1990}
#\N{NEW TAI LUE LETTER HIGH NA}
/x){ print "match.\n"; } else { print "false.\n"; }
0718デフォルトの名無しさん
垢版 |
2018/11/14(水) 10:41:07.07ID:Hh1ptiAj
717
0720デフォルトの名無しさん
垢版 |
2018/11/14(水) 18:45:40.17ID:I91AeKub
このクイズだか検証だかよくわからんの書き連ねてるのは何なの?
一人で無意味に書き連ねてるの?誰かとやりとりしてるの?
0721デフォルトの名無しさん
垢版 |
2018/11/14(水) 23:41:31.78ID:cpUdYoRF
正規表現の勉強をしながら気付いたことをメモってるだけです
基本的には一人でやってます

仲間が欲しい...
0722デフォルトの名無しさん
垢版 |
2018/11/14(水) 23:44:34.67ID:CNd6PM4x
ここはお前のチラシの裏なのか

ある程度まとまってんならともかくメモ書きなら他所でやれよ
0725デフォルトの名無しさん
垢版 |
2018/11/16(金) 17:20:00.59ID:eADG8kUk
bregonig.dll の (?a)\w の処理速度が遅い

(?u)\w と同じ速さ
\s や \d や [a-zA-Z_] より4倍の遅い

改善の余地ありそうだね
0726デフォルトの名無しさん
垢版 |
2018/11/17(土) 03:22:15.33ID:YADh6pBI
## (?(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になる
0728デフォルトの名無しさん
垢版 |
2018/11/21(水) 19:34:31.80ID:CU3gUCH4
●Regular Expressionの使用環境
C#

●検索か置換か?
置換

●説明
先頭の全角スペースのみを置換したい
先頭の全角スペースは1文字の場合もある

●対象データ
   ああああ あ あ あ あ あ

●希望する結果
空空空ああああ あ あ あ あ あ
0732729
垢版 |
2018/11/22(木) 03:09:11.69ID:YAZbwzDX
>>731
たしかにそっちの方が倍くらい速かった
ちなみに正規表現関係ないけど

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 break;

とかにするとさらに10倍以上速かった
正規表現使わないでもいい時はなるべく使わないほうがええね
0735デフォルトの名無しさん
垢版 |
2018/11/26(月) 06:49:56.12ID:OBhrl1nm
>>734
・・・っ、すごい。サクラエディタとかでも使える。
\Gのありがたみ知らなかった。私は、まだまだ精進が足りないようだ。
0736デフォルトの名無しさん
垢版 |
2018/11/27(火) 00:09:50.92ID:5gbDlA47
\Gを知らないのに正規表現を使いこなせるということはproxomitronのユーザーさんかな
0738デフォルトの名無しさん
垢版 |
2018/11/29(木) 02:42:35.12ID:Fz25AUlj
>>505-506
すごい

こういう書き込みが初心者の質問とその回答で埋もれてしまうのはもったいない
質問スレとは別に正規表現の本スレらしいスレがあるといいな
0743デフォルトの名無しさん
垢版 |
2018/12/08(土) 20:04:57.14ID:RNQqcEtu
アンド検索をしたいのですが、どう書けばいいでしょうか

^(?=.*あああ)(?=.*かかか).*$
このコードを見つけました

あああ と かかか の含まれる行がヒットします
ただ、ロジックがちょっとわかりません
先読みをつかっているのですが、先読み対象の語が指定されていません
これはどういうことでしょうか

分かりやすい解説サイトでもあれば教えてください
0744デフォルトの名無しさん
垢版 |
2018/12/08(土) 20:32:25.49ID:Dx33rAX6
このへんかな
>正規表現で論理積(AND)を実現する
>https://qiita.com/n4o847/items/dbcd0b8af3781d221424

自分流のちょっと乱暴な理解解釈だと
1. (?=検索対象) は、この条件が満たされないと後続のマッチを調べない
2. (?=検索対処) 自体は、この条件が満たされてた時点である意味消滅したかのようにふるまう
って動きを取るような感じ


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

「xxx.*?(yyy.*?zzz|zzz.*?yyy)|yyy.*?(xxx.*?zzz|zzz.*?xxx)|zzz.*?(xxx.*?yyy|yyy.*?xxx)」
なんてのを吐き出した
安直だけどまあこれも間違ってはいない
0745デフォルトの名無しさん
垢版 |
2018/12/08(土) 20:35:48.50ID:Dx33rAX6
あ、先読み対象の語は「^」だけで
「行頭から始まるという条件さえ満たせば何でもよい」と指定してる
0746デフォルトの名無しさん
垢版 |
2018/12/08(土) 22:19:09.33ID:7G2k61ed
環境が分からない
何を検索したいのか分からない

>先読みをつかっているのですが、先読み対象の語が指定されていません

??? 指定されてないって何のことだろう、意味不明
正規表現うんぬんの前にまともな質問の仕方を学ぶべき
0747デフォルトの名無しさん
垢版 |
2018/12/08(土) 22:26:59.96ID:RNQqcEtu
>>744
先読み対象は行頭ということですね
^(?=.*あああ)
これだと意味としては
「あああの前に行頭が存在すればヒット」
ということになると思います

これってもう少しかみ砕いた表現にできませんか?
まだ、理解が追い付いてないです

行頭が存在すればヒットということは、「行の中にあああがあればヒット」と同じことですか?
0748デフォルトの名無しさん
垢版 |
2018/12/08(土) 23:05:31.04ID:hZepSGXS
>>747
^は検索位置を示すもので、先頭を表す記号、
(?=)は先読みで検索開始位置を移動しないもの
つまり、
^(?=.*あああ)
は、先頭から(改行までの間に)文字列「あああ」がある場合
(先読みなのでマッチ後も次の検索開始位置はまだ先頭のまま)

よって
^(?=.*あああ)(?=.*かかか)
は、先頭から(改行までの間に)「あああ」があり、且つ先頭から「かかか」がある場合
.*$は不要だが、付けると、改行が存在すると絶対マッチしなくなる点が異なる
0749デフォルトの名無しさん
垢版 |
2018/12/09(日) 06:54:41.50ID:C3Qast1U
↑かっこを二つならべると、()と()という感じで、アンドになるんでしょうか?
あと
(?=)は先読みで検索開始位置を移動しないもの
の部分なんですが、検索開始位置を移動しないというのはどういうことでしょうか
?=キーワード
で設定した場合、キーワードの相対位置から前を検索する、という認識でした
0750デフォルトの名無しさん
垢版 |
2018/12/09(日) 08:43:46.17ID:UT294bNs
質問者は正規表現の基礎知識が足りてないと思われる
たとえるなら、(?=)の先読みは高校受験レベルで求められる英文法だとすると
質問者の場合は入門レベル(そもそもの基本ルールとか「.*」とか)の知識がごそっと抜けてる

なのでここまで出てきた説明を読んでもちんぷんかんぷんにしかならないのだろう
ちょっと遠回りになるけどちゃんと正規表現の基礎を理解したほうがいい
https://qiita.com/jnchito/items/893c887fbf19e17d3ff9
あたりを最終回(その4)まで読め
それでも理解できないなら、貴方には正規表現を扱うのは無理だからあきらめろ
0751デフォルトの名無しさん
垢版 |
2018/12/09(日) 09:50:40.98ID:vJutpfX/
>>749
()()でandになるわけではなく、()の次に()があるかどうかとなる(順序関係ができている)
^(a)(b)と書くと、abにはマッチするがaやbやbaにはマッチしない
これは、^(a)がマッチした時点で検索位置がaの次に移動しているためである
^(?=a)(b)と書くと、何もマッチしなくなる
これは先頭からaが見つかった場合、検索開始位置が移動しないため(?=a)を検索する前のまま(つまり先頭)になっている
次にbが先頭にあればいいわけだがそこにはaがあるからマッチしない
0752デフォルトの名無しさん
垢版 |
2018/12/09(日) 10:39:42.84ID:bsA2M6bZ
ID:vJutpfX/

頭が良すぎて教えるのが下手なパターン
バカ語で話さないと通じないよ
0753デフォルトの名無しさん
垢版 |
2018/12/09(日) 10:51:59.84ID:bsA2M6bZ
こんな最低限のこともググらず、自分で努力せずに人に聞くようなのに
教えてはいけないと思う、居ついてしまうからエサを与えないで欲しい
0755デフォルトの名無しさん
垢版 |
2018/12/09(日) 12:38:27.41ID:H3JhKeet
動かしながら覚えるんじゃなくて
>>750でも何でも良いけど、説明読んで覚えて欲しい
中途半端な事してるから、>>749みたいに間違った解釈になるんでしょ
0756744
垢版 |
2018/12/09(日) 19:23:00.27ID:i2SuH64K
うーん、一応はレス内容から質問者がどの程度内容を理解したか/理解する気でいるか
透けて見えるんだけどね
>>744のURLの記事を読んだうえでこの程度のレスしか返ってこず、さらに
最終的には>>754のようなリアクションが返ってきたか

回答して残念な気持ちになったよ
0757デフォルトの名無しさん
垢版 |
2018/12/09(日) 19:57:20.13ID:sTKdTIE5
位置の理解は言うほど易しくはないとおもわれ
正規表現検索とはテキストエディタでカーソルを1つずつ進めながら
合致する文字を1文字ずつ探っていくようなものだというイメージが必要だけど
そこをちゃんと説明してるものはあまり見かけない
0759デフォルトの名無しさん
垢版 |
2018/12/09(日) 21:49:11.61ID:bsA2M6bZ
回答した人は親切丁寧に回答出来ていたよ、お疲れ様
上にも書いたように頭のいい人にしか理解出来ない回答になっていた
俗にいう分かってる人にしか分からない説明ってやつ

俺はこういうバカに教えるのは得意だから俺が回答を付ければ理解されたと
思うけど注意をスルーされたのでスルーした
0760デフォルトの名無しさん
垢版 |
2018/12/10(月) 14:42:13.07ID:RU/iAdEK
知恵袋で質問を4000件以上やりとりしてる人だったのか
それなのに質問の仕方がまったくダメって
0761デフォルトの名無しさん
垢版 |
2018/12/10(月) 17:07:38.24ID:RU/iAdEK
質問のペースがおかしい、1日に質問6つしてる
ググるより先に質問してんのか?
0764デフォルトの名無しさん
垢版 |
2018/12/10(月) 17:29:58.71ID:RU/iAdEK
やっぱ質問スレと本スレは分けるべきだな
この流れになると賢い人が来なくなってしまう
0765729
垢版 |
2018/12/10(月) 18:14:05.41ID:PtRqcV9k
なんで馬鹿が一匹きただけでそういう話になるんだよ
過剰対応の典型やろ
0766デフォルトの名無しさん
垢版 |
2018/12/10(月) 21:59:56.06ID:RU/iAdEK
入門サイトすら読んでないような人の質問とその回答にうんざりして
来なくなった人は大勢いると思うんだがそういう人達が集まれるスレが
あったらひょっとしたらすごいスレになるんじゃないかという期待がある
実際はただ過疎るだけなんだろうけどね
0770デフォルトの名無しさん
垢版 |
2018/12/14(金) 20:59:53.53ID:DlmPms4F
^
(?:
(?!あああ|かかか).
)*+
(?>
(あああ)
|
かかか
)
(?:
(?!あああ|かかか).
)*+
(?(1)かかか|あああ)
.*+$
0771デフォルトの名無しさん
垢版 |
2018/12/14(金) 21:11:35.41ID:DlmPms4F
^
(?~あああ|かかか)
(?>
(あああ)
|
かかか
)
(?~あああ|かかか)
(?(1)かかか|あああ)
.*$
0774デフォルトの名無しさん
垢版 |
2019/01/10(木) 15:21:01.00ID:Q3mhk3sM
>>772
chrome on mac だけどブックマークではダメで、設定→検索エンジン→検索エンジンの管理→追加 から登録しないといけなかったわ。
0776デフォルトの名無しさん
垢版 |
2019/01/26(土) 10:17:12.64ID:rNPVIr5d
否定先読み
と言うのがなかなか理解出来ないのですが、
サンプルを動かすと確かに動作するのですが、
今一つ仕組みが分かりません。
どんなふうに理解すれば良いのでしょうか?
0777729
垢版 |
2019/01/26(土) 10:42:36.00ID:K4a4emwR
文字じゃなくて位置(文字と文字の間)に一致すると考えればいい
たとえば

abcdef

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

abc[ここ]def

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

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

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

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

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

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

>>784
正規表現の意味まで教えてもらい、本当に助かります。
今後の役に立てていきます。
0788デフォルトの名無しさん
垢版 |
2019/01/29(火) 06:32:49.85ID:mzqJgDrY
Tools for Working with Regular Expressions
RegexBuddy
RegexPal
RegexMagic

More Online Regex Testers
RegexPlanet
regex.larsolavtorvik.com
Nregex
Rubular
myregexp.com

More Desktop Regular Expression Testers
Expresso
The Regulator
SDL Regex Fuzzer
PowerGREP
Windows Grep
RegexRenamer
0791デフォルトの名無しさん
垢版 |
2019/02/13(水) 00:35:05.11ID:HRhgNpoV
鬼雲には鬼雲を知ろうとすればするほど謎のテキストエディタの
情報が集まってくるという不思議な不具合があるがこのフィックスは不可能 :-)
0792デフォルトの名無しさん
垢版 |
2019/03/07(木) 20:57:23.09ID:sEA+6w2y
今日元号の改正の準備で日付関連のコード書いてきたんだけど
>>695の置換が出来ると便利だったなという所があった
再帰が使えるのにこれが使えないのはバランス感覚に欠ける気がします
どうしてこうなった?
0793デフォルトの名無しさん
垢版 |
2019/03/12(火) 13:14:07.01ID:vSZ9R6NM
先読みの(?=huge)をつけると、後方がキャプチャーされません

そもそも前方に文字のない?=って使い方あってるでしょうか?
ちなみに言語はVB6です
0795デフォルトの名無しさん
垢版 |
2019/03/13(水) 01:39:37.63ID:bUFEpZHr
あなたの英語も変ですよ。
日本人はJapaneseとキャピタライズしてください。
日本語もjapan languageではなくJapanese languageです。
Japaneseだけで日本語という意味になりますが、前の文で日本人という意味で使っているのでlanguageを付けるのはいい判断でした。
また最後の文は、どうしても複数の例を見たいことを強調するのでない限りcodesではなくのcodeがふつうです。
不定冠詞のaも付けません。(絶対にただひとつの例だけ欲しいのでない限り)
0797デフォルトの名無しさん
垢版 |
2019/03/13(水) 02:29:04.73ID:Z/ka/TFK
irregular expression, exactly.
0799デフォルトの名無しさん
垢版 |
2019/03/13(水) 14:12:32.68ID:ZUOT1OTB
nativeのひとに「あなた英語上手ですね」って言われても誉め言葉じゃないからな
その時点で下に観られてる
0801デフォルトの名無しさん
垢版 |
2019/04/22(月) 20:21:53.32ID:GQt1LKrG
sed
置換
1に挟まれたN個以下の0または-で構成された文字列を、同数の1で置き換える

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

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

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

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

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

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

10-以外が現れた場合の扱いも明記されていない
→現れることはないとみなしている
んだから
100010は現れないと想定して書く選択肢もある。
いずれにしろ、不明瞭な仕様を書く奴は無能だし、
勝手に解釈するのも実際の仕事じゃトラブルの元。
0808デフォルトの名無しさん
垢版 |
2019/04/23(火) 12:23:27.03ID:ZY45SR7V
Ruby なら、

re = /1([^1]+)1/ # 1〜1 で、はさまれた部分

str = "x10-0y0-1x"

# $1 は、capture 部分で、0-0y0-。この部分を置換する。
# 結果は、x1 (111y11) 1x
p str.sub( re ) { |s| "1" + $1.gsub( /[0-]/, "1" ) + "1" }
0809デフォルトの名無しさん
垢版 |
2019/04/23(火) 12:38:52.51ID:ef59e0DS
>>807
反論と取られたのかな
反論でも賛意でもないよ

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

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

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

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

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

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

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

というかこの文体、昔セガBBSにいた南瓜さんという人にそっくりだな
別人だろうけど思い出してワロタ
0825デフォルトの名無しさん
垢版 |
2019/04/27(土) 13:12:59.58ID:W9D3URJl
オブジェクト指向最高さんは今回まったく落ち度が無い
迷惑かけといて素直に謝ることも出来ないくそコード製造機はもう来なくていい
0826デフォルトの名無しさん
垢版 |
2019/04/27(土) 21:25:24.59ID:CxhHumup
翌日以降もこんな感じですよ
ttp://hissi.org/read.php/tech/20190424/M1dYN3QzOXA.html
ttp://hissi.org/read.php/tech/20190425/VThrOUNyV3U.html
ttp://hissi.org/read.php/tech/20190426/NGZaS2JZWkg.html
ttp://hissi.org/read.php/tech/20190427/QzZmMHJVWmE.html
こちらで引き取ってもらえませんか?
0828デフォルトの名無しさん
垢版 |
2019/05/29(水) 23:29:43.55ID:NoMeOMsF
よろしくお願い致します。

●Regular Expressionの使用環境
Python 3.7

●検索か置換か?
検索

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

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

●希望する結果
文字列2
0830デフォルトの名無しさん
垢版 |
2019/05/30(木) 08:48:50.22ID:ZbLZAkBS
>>829
文字列1が空だと空振るのでいっそベタ書きするかな
それと対象の規模によっては計算量も30%少なくて済む
"[^"]*"[^"]*"([^"]*)"

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

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

●検索か置換か?
検索

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

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

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

●希望する結果
「う」、「え」の2か所
0839デフォルトの名無しさん
垢版 |
2019/06/17(月) 06:40:06.13ID:LXSfy5ij
>>837
> 「全角英字の単語直後の任意の1文字」

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

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

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

(レス不要です)
0843デフォルトの名無しさん
垢版 |
2019/06/19(水) 14:27:57.27ID:Yoy0IPRe
いし正が左らか右は語本日
0844デフォルトの名無しさん
垢版 |
2019/06/23(日) 22:51:37.03ID:WHM6Ibwm
>>834
理論上は
|
で全部やればできる


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

一文字限定なら [] の処理が早い
vim の :h digraphs
には 1300個ぐらいの 記号を含むデータリストがあるから
それから組みたてやすい とおもう
0851デフォルトの名無しさん
垢版 |
2019/06/24(月) 23:17:52.70ID:4+LiJo6+
そういえばブラウザに NG word に指定したのは自分だった
あらしが記号を使ってたことがあったので
0854デフォルトの名無しさん
垢版 |
2019/07/08(月) 00:38:09.05ID:m6vFYfK4
●Regular Expressionの使用環境
サクラエディタ(か秀丸エディタ)

●検索か置換か?
置換

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


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

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

もうちょっと深掘りして以下の場合どのようになるでしょう。
■対象データ
[A=a OR A=b OR A=c OR A=d・・・・]
[B=d OR B=c OR B=b OR B=a・・・・]
[C=a OR C=b OR C=c OR C=d・・・・]

■希望結果
A=a,b,c,d
B=d,c,b,a
C=a,b,c,d

ORの部分が難しくて混乱しています。。
0858デフォルトの名無しさん
垢版 |
2019/07/10(水) 09:18:54.80ID:StxWbt+s
ここの住民の正規表現能力は超人的だ
お節介させてくれ
もし使用環境に perl があれば、
ウルトラ難しい正規表現を理解可能な小さなパーツに分類できる

cat /dev/clipboard
[A=a OR A=b OR A=c OR A=d・・・・]
[B=d OR B=c OR B=b OR B=a・・・・]
[C=a OR C=b OR C=c OR C=d・・・・]

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

cat /dev/clipboard
[A=a,A=b,A=c,A=d,A=e,A=f,A=g,A=h,A=i,A=j]

cat /dev/clipboard | perl -ne 'if ( m{^ \[ ( \w+ [=] ) }xcm) {print $1}; { if ( m{ = ( \w+ [,] ) }cxg ) {print "$1"; redo} if ( m{ = (\w+) [^,] }xc ) {print "$1\n"} }'
A=a,b,c,d,e,f,g,h,i,j
0860854
垢版 |
2019/07/11(木) 01:01:12.77ID:/KpWZOtx
>>857
すごい。。
置換できましたありがとうございます。

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

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

Perlでのご教授ありがとうございます。
1度組んでしまえば汎用的に使えそうですね。
0862デフォルトの名無しさん
垢版 |
2019/07/13(土) 20:47:25.54ID:57lWPs8z
動作についての質問です。よろしくお願いします。

●Regular Expressionの使用環境
JavaScript (chrome)

●検索か置換か?
検索

●説明
'@time;prop1:style1;prop2:style2'.match(/(^|[@;])[^@;]*/g); が
["", ";prop1:style1", ";prop2:style2"] になる理由が分かりません。私の理解では、
["", "@time",";prop1:style1", ";prop2:style2"] となって欲しいところです。
どなたか説明お願いします。
^は文字列検索位置を「動かさない」と認識しています。
(以前は「動かす」と誤認識していましたが、何かで見解を改められたことを記憶しています)

●対象データ
ID@time;style 形式の指定で、
ID、time、styleの省略は全てありで、timeとstyleの順序は自由(IDは必ず先頭)
@開始はtime指定、それ以外はstyle指定とし、デリミタは ; としています。
この形式で任意の文字列(ユーザー入力)を処理します。
なお、'@time;prop1:style1;prop2:style2'.match(/(^.|[@;])[^@;]*/g); では希望の解
["@time", ";prop1:style1", ";prop2:style2"] を得られていますが、
デバッグ中に上記に引っかかったので、分かりましたらよろしくお願いいたします。
0865デフォルトの名無しさん
垢版 |
2019/07/14(日) 04:59:50.53ID:XILHsvHP
この質問内容ならここで合ってます、jsスレよりもこのスレ向きです
正規表現には統一規格みたいなものは存在しないので環境によって動作が異なります

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

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

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

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

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

JavaScriptのString.matchについては単にパッチを実装する場所を間違えただけ。
結果、String.match と RegExp.exec での結果が異なるという、言語内での不一致を引き起こしてる。
そしてこれはもう修正されることはない。
仕様バグとして永久に残り、プログラマに無駄な時間を消費させるだけのものとなる。
結果、言語が腐っていく。

正しくは RegExp.exec 側を修正し、両方とも無限ループにならずに
["", "@time",";prop1:style1", ";prop2:style2"]
を返すべきだった。
RegExp.lastIndex だけで状態管理出来ると「間違えた」からそうなった。
本来は先頭マッチフラグ RegExp.canMatchHead みたいなのが必要で、それを実装すれば両方とも正しい結果を返せた。
それを実装せず、String.match に間違ったパッチを当てたからそうなった。
これは実装者(おそらくブレンダンアイク本人)の判断ミスだ。

正規表現はPerlが再定義したと言っていい状況だ。だからみんなPCREを見てる。
PHPはさっさと取り込んだ。これは正しい判断だ。
JavaScriptはPCREを見てる。というか本来は取り込みたいのだろうが、上記のように今更部分がありすぎる。
Pythonには歴史的経緯があるのだろう、状況は知らん。
Goは最初から既にゴミだ。確実に廃れるだろうし、俺もそれを願っている。
そもそもGoなんてPCREが覇権取ったあとに出てきたのにPCREを採用してない時点でゴミ。
それ以外にもあの言語は独自路線を行き過ぎていて、ユーザーに無駄な勉強時間を強いている。
結果、既に他言語で慣らした強者が近づかず、結果的に馬鹿の楽園になってWeb系の馬鹿共に大受けしてるだけ。
Goの正規表現については詳しくは知らんが、仮にそれが奇妙な振る舞いをしたとして、お前はGo側の怠慢だと思わないのか?
JavaScriptやPython等それなりの歴史があるのならともかく、Goの場合は確実に防げた問題でしかない。
連中はそれを「わざと」やらなかったんだぞ。俺はそんな言語は支持しないし、ゴミだと何度でも断言する。

いずれにしても、今からの初心者が学ぶべきはPCREだろ。
お前は何が言いたいんだ?
0870デフォルトの名無しさん
垢版 |
2019/07/14(日) 13:05:26.62ID:LdVrbIxu
>>869
お前は実装と仕様の違いを理解出来てないタイプだな。


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

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

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


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

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

この記事の動作のことを言いたかったんですがうろ覚えのまま
適当に書いてしまいました、ごめんなさい
0872デフォルトの名無しさん
垢版 |
2019/07/14(日) 13:28:58.74ID:wR6d2dgQ
>>868
PCREに統一中だという主張の根拠を聞いたんだがそれへの回答はないわけだ
PCREが素晴らしい実装で最初に触っとけばいいというのは同意するが, それが最良だなんてのはあり得ないし単なる妄想だよ
0873デフォルトの名無しさん
垢版 |
2019/07/14(日) 14:15:14.24ID:LdVrbIxu
>>871
ああなるほど、Perlも似たようなゴミ実装になってるな。

> そこで,Perl では空文字列に マッチするような場合には,初回は空文字列がマッチするがそれ以降は マッチせずに必ず 1文字分は進むようにマッチしようとする.
これも実装ミスだな。
正しくは、このフラグを「空文字以外のマッチごとにセット」すればいいだけで、修正は1行で済むのだが、こちらも今更なのだろう。
「初回は」というのが間違いで、「空文字にマッチした直後は」が正しい。
ついでにもっと具体的に言っておくと、「初回は」というのが正しければ、
今の実装は検索起動時にフラグをセットして空文字マッチ後にリセットしているはず。
このフラグを「空文字以外のマッチ後」に毎回セットし直すように1行入れる。これで直る。
君がPERL等のOSSか何かにcontributeする気があって修正案を出してくるのなら見てあげるけど。
(俺自身ではそこまでやる気はない)

まあしかし、JavaScriptだけがゴミじゃない、ってのは分かった。
というかもしかしてJavaScriptの実装ってPERL実装互換に敢えてしてる?



>>872
お前は何派なんだよ?
JavaScriptに関してはMDNでも前は「PCREで大体使えます」みたいな事書いてたぞ。
最近大幅リニューアルしてその記述はなくなったが。
(というより色々見にくくなってあまり確認してない)

鬼車派ならこの手の「実装ミス」をひたすら潰しておけばワンチャンあるかもしれんよ。
JavaScriptにしてもPerlにしてもこの辺のミスは確実に足枷になってる。
具体的に言うと遭遇した全プログラマが数時間ずつ無駄に検索その他をさせられる羽目になってる。
これは「新規プログラマ」からすると上達を妨げる障壁でしかない。
JavaScriptで言うと「IEデハー」な件を全部暗記してて今もそれにすがっている奴のウザさみたいなもんだ。
仕様バグがない、というのはそれなりに武器になる。
0874デフォルトの名無しさん
垢版 |
2019/07/14(日) 15:13:19.95ID:LdVrbIxu
>>867
今更regex101で確認してみたが、PCREだけは(これに関しては)正しく通るじゃねえかよ。

Perlの「初回は」というのはつまり g の時だけおかしくなるということであり、今回は当たらないからだが。
だからJavaScriptも仮にPerl実装互換にしようとしたとしてもしくってるな。


>>871
ちなみに
> > と < は後読みと先読みにして外に出すことができるので
の意味分かる?
おそらくはバックトラックを小さくする為(つまり高速化)だと思うのだが、
実際 regex101で試す限り余計に遅くなる。
テストサンプルはそこの下の「XMLタグを加工する」の上側半分のxmlで、こちらだと
(?:^|>)(.*?)(?:$|<) の場合は 29matches, 1277steps だが
(?:^|(?<=>))(.*?)(?:$|(?=<)) の場合は 29matches, 1875stepsで、余計に遅くなってる。
格好良くはないが別に $1$2$3 で置換しても問題ないと思うのだが。
0875デフォルトの名無しさん
垢版 |
2019/07/14(日) 15:29:05.53ID:XILHsvHP
>>874
> > と < は後読みと先読みにして外に出すことができるので

これは文字を消費しないための措置
マッチさせたい部分以外の部分にまでマッチしてしまうと次回の
検索開始位置が意図しないところに進んでしまったりするので先読みを
使って消費しないようにします

あとあなたが言ってることにはおおむね同意です
変な挙動は無くなるといいですね、perl6に期待したいところだけど
perl6では出来る限り最長文字数のマッチを目指す挙動になると聞いたような..
自分にとっては処理が重くなるのであまり嬉しくないですね..
0876デフォルトの名無しさん
垢版 |
2019/07/14(日) 16:03:14.68ID:LdVrbIxu
>>875
ああなるほど、\G使ってるからずれるのか、確かに。

BRE出身だから個人的には最初から />[^<]*</ が第一選択肢で、
筆者の発想が意味不明だったのだが、確かにそうだな。
ここら辺は正規表現だけで何とか出来る(Perl)思想と、
BREだけではどうにもならないからざっくり切り出して自前でプログラミングする(AWK)思想の違いだな。

Perl6はガン無視されてる感があるけどね。
今更Perlで組めるかよ、というのはPerlを使っている奴自身が感じていることらしいし。
(もっとも嫌われてる言語がPerl、2017はダントツの一位、
しかし同じStackOverflow実施の2018の結果はVBでperlは落ち着いたようだが)
https://stackoverflow.blog/2017/10/31/disliked-programming-languages/
https://news.mynavi.jp/article/20180604-639227/
もしかしてPerl6って徐々に使われだしてる?

> perl6では出来る限り最長文字数のマッチを目指す挙動になると聞いたような..
ん?
全てのプログラミング言語では最長マッチがデフォ、
というかそもそも下位の正規表現(BRE等)にはそれしかないが。(non-greedyがない)
XPATH等の文書検索側の人かな?だからって別に特に問題はないが。
0877デフォルトの名無しさん
垢版 |
2019/07/15(月) 15:22:14.71ID:y88H95dP
Ruby で、

str = "@time;prop1:style1;prop2:style2"

re = /((^|[@;])[^@;]*)/

p results = str.scan( re )
# [["", ""], [";prop1:style1", ";"], [";prop2:style2", ";"]]

[ 0 ]がマッチした部分、[ 1 ]がキャプチャー部分

>>862
の、["", ";prop1:style1", ";prop2:style2"] と同じ結果
0878デフォルトの名無しさん
垢版 |
2019/07/15(月) 16:42:33.19ID:xqOJLOC2
>>877
テストしてくれたって事か?なら一応まとめておく。


/(^|[@;])[^@;]*/g に対してテスト文字列 '@time;prop1:style1;prop2:style2' で
PCRE: ["", "@time",";prop1:style1", ";prop2:style2"]
JavaScript, Python, Go, Ruby, : ["",";prop1:style1", ";prop2:style2"]

結論、PCRE以外全部ゴミ
現時点でPCREが最良だ馬鹿タレ >>872
お前が何派か知らんが、PCREが最良でないと言い張るのなら少なくとも通るライブラリを具体的に提示しろ


ただまあこれにはちょっと情状酌量の余地有りで、
おそらく ^ が「先頭文字」ではなく「位置」にマッチすると再定義したのはPerlだ。
そもそもBREには | がない。従って (^| のような「先頭の空文字」マッチなんて書けない。
だからBREだと先頭の「位置」なのか「文字」なのかを厳密に区別する必要がない。
| が導入されたのはEREからだが、EREなんて大して使われてない。
結果、BRE育ちの連中が「位置」だと厳密に認識せずにコーディングすると間違える、というわけ。
そしてJavaScript, Python, Go, Ruby は全滅だ。

JavaScriptに関してはPerlを模倣したわけでもなく、単なるミスだ。言語内不一致を生じているし。
他言語は知らん。

Rubyみたいに「実装が仕様だボケ」と言い張る糞言語ではこの手の仕様バグを永久に修正出来ない。
よって新人は毛嫌いして離れていく。当たり前の話だ。
JavaScriptはおそらくバグだと認識されているが、今更直せない。
Perl6はこの点、仕様と実装を分離したから、バージョンアップと共に確実に修正する。
従って最良は現時点でもPCREだし、今後ともPCREだ馬鹿タレ >>872
0879デフォルトの名無しさん
垢版 |
2019/07/15(月) 23:23:32.64ID:3MPTmFRg
BREの正規表現と今の正規表現の使い方の違いの話は面白いなぁ

しかしこの人こんなにすごいスキルとモチベがあるなら質問なんかせずに
自力でなんとか出来たのではw
質問してくれたおかげで面白い話をいろいろ聞けたからこちらは嬉しいけどネ

おかしな挙動と言えばperl5とOnigmoでは\Gの挙動に違いが
あってどちらかが違和感のある動作をしたはず
\Gの概念自体が微妙に違ったはずだけどメモるの忘れた
興味のある人はぐぐってね
0881デフォルトの名無しさん
垢版 |
2019/07/16(火) 16:08:47.84ID:cpfSTA9t
>JavaScript, Python, Go, Ruby, : ["",";prop1:style1", ";prop2:style2"]
深くて理解できないことが多いが、これはやばい気がする
0882デフォルトの名無しさん
垢版 |
2019/07/16(火) 17:23:30.54ID:hAAouWtx
読んでるだけで何も考えてなかったけど

/(^|[@;])[^@;]*/g

この書き方以外の書き方で意図した動作になるように書けないのかな
ここの人はこういうの得意だからもしかしたら・・?
0884デフォルトの名無しさん
垢版 |
2019/07/16(火) 19:27:45.24ID:hAAouWtx
言ってることに説得力がありすぎて聞き入ってしまってたよ
どんどん言いたいことを言って欲しい
昔のdanさんを思い出すなぁ
0885デフォルトの名無しさん
垢版 |
2019/07/16(火) 20:41:55.62ID:bFMew56o
入力フォーマットが正しいという前提で /@?[^@;]+/ の方が好み
そもそも正規表現使うより ; でsplitした方が良くね?とおm
0886デフォルトの名無しさん
垢版 |
2019/07/16(火) 21:03:17.33ID:hMJFhr7R
>>881
深くはない、単にバグってるだけ。
そしてそれはやばいどころではなく、全く話にならないレベルの物だ。使い物にならない。

例えば、図書館の蔵書をユーザーにも検索出来るようにしたとして、正規表現検索も選べるとしよう。
この場合、検索結果に現れないケースが発生することになり、使い物にならない。
プログラミング言語内の正規表現エンジンは「今までのプログラムが動かなくなる」危険があるからそうそう交換出来ないが、
図書館DBの検索フロントエンド内のエンジンなんて即交換可能なんだから、問題があればすぐ乗り換えられる。
PCREが気に入らないのならこんなところで無駄吠えするのではなく、
PCREがバグっているケース(例のタグ外側マッチとか)でもばっちり動く検索エンジンを提供して、乗り換えを待てばいいだけ。
現状、PCRE以外全部バグっているのだから救いようがないが。

JavaScriptの場合はatomエディターなる物があって、htmlやプログラムソースコードを編集出来るが、
JavaScriptの場合はreplaceもバグっているので、命中すれば、全置換しても全置換出来てないケースが発生する。
リファクタ等で変数名を変えるとき、手でやるとバグるので、当然エディタ機能で全置換させるわけだが、この場合にもバグる訳だ。
そしてユーザーはこのときに置換漏れが発生するとは全く思わないので、かなり手間取ることになる。
(atomでは対策されていると信じたい)

JavaScriptの場合はこのバグも「仕様」としてしまっているので、
逆に言えば仕様通りならバグに命中したときの挙動も確定してる。だから対策は出来るが、
Rubyみたいに「実装が仕様だ」と言い張る糞言語だとどういう挙動か確認してみなければ分からず、対策が出来ない。
ここらへんもRubyの思想は数周遅れている。

いずれにしてもこんな基本的なところのバグはあっても迷惑でしかなく、さっさと直せ、でしかない。
「速い」以前に「ヒットしない」エンジンなんて使い物にならないだろ。
エンジン競争しているつもりの馬鹿共も、方向性を完全に間違ってる。
「間違いなく動作する」エンジンを提供すれば、文書検索側の人間はサクッと乗り換えてくれるだろうさ。
速い遅いはその後の話だ。
0887デフォルトの名無しさん
垢版 |
2019/07/16(火) 21:18:41.35ID:hMJFhr7R
>>879
BREの場合はやりきる前提ではないので、例えば例のタグ外側マッチだと、
元の文字列に > と < を足してしまって置換し、出力時に削る、みたいなことをする。
具体的には以下。

('>' + str + '<').replace(/>[^<]*</,'>bar<').slice(1,-1)

だからBREしか使えないAWKでも意外と何とかなったりする。
ただしこれはプログラミング出来る前提であって、
Webページに検索窓だけ提供されているような状態ではどうにもならないが。


>>885
それは正しい。実際俺もそれに近いことをしている。
デリミタが最初に出現もあり、最後に付加もあり、つまり
';prop:style1' や
'prop:style1;prop:style2;' もありなので、
結局 /(^|[@;])[^@;]*/g だと後のコードが綺麗に書けなかった。 /(^.|[@;])[^@;]*/g でも同じ。
意味的には @ もデリミタ扱いしているだけなので、実もフタもないが、@を ;@にしてsplitした。
具体的には以下。
str.replace(/@/g,';@').split(';').filter(v=>v)
0889デフォルトの名無しさん
垢版 |
2019/07/17(水) 08:28:41.50ID:2/Bgill9
>>873訂正
俺は俺のケースだけ考えていたが、これだと871内URLの筆者のケースと合致しない。
そこで一応、両方とも合致する実装を考えてみた。
(といってもバグってる実装について推測すること自体はあまり意味がないが)

Perlはおそらく、^のフラグではなくて、空文字マッチ後のそのマッチ区間の*を+にしてる。
(というより筆者もそう言っているのだが俺が早とちりしてしまった)
871のケースだと、正規表現 (?:^|>)(.*?)(?:$|<) に対して、
1回目:(?:^|>)(.*?)(?:$|<)
2回目:(?:^|>)(.+?)(?:$|<)
というわけだ。結果、2回目は「先頭、<含んだ1文字、次の<まで、となり、
その筆者の説明通り先頭タグを含んで次タグ或いは文末まで伸びることになる。

俺のケースでは、正規表現 (^|[@;])[^@;]* に対して、
1回目:(^|[@;])[^@;]*
2回目:(^|[@;])[^@;]+
だから '@time;prop1:style1;prop2:style2' に対して @time のマッチも正しく取れることになる。

こういった場合、実装者は安全側に倒したくなる物だが、
現実は安全側に倒しすぎて余分なケースを含んでしまい、結果、バグっているというわけだ。
JavaScriptは最高に安全な実装、「空文字マッチは1文字進める」とした。(おそらくRubyその他もそう)
これだと絶対に無限ループはしないが、俺のケースでバグる。
Perlの実装だと俺のケースは通るが、871内URLの筆者のケースでバグる。
その他バグケースも出してくれれば俺の推測で合っているかどうかは答える。
0890デフォルトの名無しさん
垢版 |
2019/07/17(水) 08:28:59.00ID:2/Bgill9
正しい実装は、「経路全体」(つまりツリーのリーフ)に対してフラグを持たないといけない。
Perlは「区間」(=経路の一部)に対してフラグをつけてしまったところが間違いだ。
871のケース、単純化する為に (A0|A1)B(C0|C1)として、
1回目:A0BC1 で空文字マッチ
そして空文字マッチの場合はこれを記録し、これと同一の場合は次回以降はスキップする。
結果、2回目:最初に A0BC1 がマッチするがこれは捨てられ、次に A1BC0またはA1BC1となる。
そして非空文字マッチとなったので、この記録を全破棄して、同様にループを繰り返せばいい。

実装の修正は、探索関数そのものにだいぶ手を入れないといけないのでそれなりに大変だ。
まずは全部の最終段に「最終チェック」を入れて上記リストと照合、記載有ればマッチ失敗として探索継続、としなければならないが、
おそらくこれが1ヶ所では済まない。
ただしこれはリターンパスを辿ればいいので何らかのツールが有ればほぼ自動でいけるかもしれない。
次に上記リストを作成する為に全経路を出力させなければならない。
デバッグ用にこれが既にあればラッキーだが、なければ自前で作らなければいけない。
といっても内容はツリーのノードを辿るだけなので、ツリーのフォーマットが分かればすぐだが、
ゴリゴリに高速化とかしていると割と意味不明なコードになっていることが多いので、
その状態で確認するのは結構辛いとは思う。
リストの管理は、空文字マッチなら追記、非空文字マッチならクリア、なので、これはやるだけだ。
リストの管理も探索関数にやらせて、探索関数は
今:マッチ場所とマッチ長さを返す
修正後:マッチ場所とマッチ長さを含んだ『配列』を返す、とし、
「空文字マッチの場合は自動で継続、非空文字マッチまたは終了まで探索、まとめて配列で結果を返す」とするのがいいだろう。
0891デフォルトの名無しさん
垢版 |
2019/07/17(水) 08:29:16.56ID:2/Bgill9
なおPerlの実装だと『上位関数のみ』で対策できるため、
「取り敢えず1時間で直せ」と言われたらこうなるのも分からなくはない。
しかしいまだにそのままだというのは怠慢でしかないが。
JavaScript等も同様、『上位関数のみ』で対策出来るところで留まっている点からも、これは言える。
しかし現時点で世界中のプログラマがどれだけ無駄な時間を消費することになっているのかを考えれば、
こんなのは手間であろうがさっさと直せ、でしかないが。

いずれにしても、俺が修正してやる、修正案はこれだ!と具体的に出してくるのならレビューはする。
我こそは!という奴は頑張れ。
0892デフォルトの名無しさん
垢版 |
2019/07/17(水) 09:46:24.93ID:u050lnGw
話を単純化すると、
1. ある文字、例えば@ から、次の@ の直前の文字まで
2. 先頭が、@ でなければ、先頭から、@ の直前の文字まで。
つまり、先頭が、@ でなければ、先頭文字を、@ とみなして処理する

つまり、ルール1・2は、同時に適用させず、先にルール1を適用し、
ルール1に適用しないものだけを、ルール2に使う

(^|[@;])[^@;]*

だから、この正規表現がおかしい。
定義があいまいになる、解釈を含んでいる!

OR の部分が、並列ではない。
ルール1を優先すべき!
0893892
垢版 |
2019/07/17(水) 09:51:38.77ID:u050lnGw
(^|[@;])[^@;]*

OR を使うと、両方に該当する場合に、どちらの処理がされるのか、あいまい!
つまり、先頭文字が@; の場合に、両方に該当するので、処理があいまい!

A|B
A, B 両方に該当する場合に、A,B どちらの処理がされるのか、あいまい!
0895877
垢版 |
2019/07/17(水) 10:06:18.04ID:u050lnGw
>>889
Ruby で、

str = "@time;prop1:style1;prop2:style2"

re = /((^|[@;])[^@;]*)/

p results = str.scan( re )
# [["", ""], [";prop1:style1", ";"], [";prop2:style2", ";"]]

[ 0 ]がマッチした部分、[ 1 ]がキャプチャー部分

>>862
の、["", ";prop1:style1", ";prop2:style2"] と同じ結果

# * を、+ に変えた。
re_2 = /((^|[@;])[^@;]+)/

p results_2 = str.scan( re_2 )
# [["@time", "@"], [";prop1:style1", ";"], [";prop2:style2", ";"]]
0896デフォルトの名無しさん
垢版 |
2019/07/17(水) 13:38:56.68ID:FD/sfaX1
小飼って糖尿病で死んだんだっけ
0897デフォルトの名無しさん
垢版 |
2019/07/17(水) 14:01:11.32ID:fOq5lc1d
質問させてください。
PCRE や bregonig で大文字・小文字の区別なしで\x{017F}がsやSにマッチしてしまうのは仕様ですか?
0898デフォルトの名無しさん
垢版 |
2019/07/17(水) 15:07:35.98ID:Jmalh7Yl
>>887
>('>' + str + '<').replace(/>[^<]*</,'>bar<').slice(1,-1)

おぉ、perlの正規表現なら正規表現だけで大抵のことは出来るから
自分には前処理をするという発想がなかった、目からうろこでした

今回のケースもこの方法でデータの前後に ; を付ければ簡単になりましたね

>>897
\w が あ にマッチするくらいなので仕様なのでは
オプションでマッチしなくしたり出来るのでオプションのヘルプを見ましょう
0899デフォルトの名無しさん
垢版 |
2019/07/17(水) 20:30:56.60ID:2/Bgill9
>>894
ないね。
聞いたこと無いし、JavaScriptで試した限り ([@;]|^)[^@;]* でも結果は同じだった。
ただ、確かに普通に考えたら左優先でいいし、上記入れ替えで @time をキャプチャ出来るようになるべきではある。
言われてみれば優先順位が決まってないことに驚きだ。
0901デフォルトの名無しさん
垢版 |
2019/07/17(水) 20:40:11.08ID:2/Bgill9
>>895
お前は毎回Rubyの話をどのスレにも持ち込んでいる荒らしだろ。
何か言いたいことがあるのなら必ず結論を書け。
何が言いたいのか分からないのでウザイ。だから荒らしなんだよ。


+ に変えて空文字マッチをなくし、結果、希望の文字列を得る、という運用で回避するのはありだ。
ただ、その場合は、プログラマにそう分かるように、
「Rubyの正規表現エンジンは空文字マッチ周りにバグがあるので、注意してください。
空文字マッチがある正規表現を与えた場合、予期せぬ動作になることがあります。」とアナウンスしないといけない。
事実上空文字マッチが使えないが、事実なんだからそうするしかないだろ。
Rubyはこういう事を全くしないからゴミなんだよ。Rubyは滅ぶべくして滅んで行ってるだけ。
JavaScriptは少なくとも仕様に明記はしてる。
ただそれだと弱いからMDNにも書け、というのが俺の主張であり、JavaScriptスレに勝手に依頼しておいた。
以前RegExp.testの件で同様に依頼したら追記されたから、そうなるのを願っている。
そういう、「落とし穴」は共同して塞いでいかないと駄目なんだよ。

完璧な言語なんてない。だから多少バグがあるのは仕方ないとして、
それを未来永劫新規プログラマに押しつけて「キャハハー、お前も落ちたか!」なんてやっているようでは駄目なんだ。
Rubyはプログラマに対してリスペクトが全くない。だから廃れるし、俺もそうなることを願っている。
お前はRubyを吹聴しさえすれば布教出来ると勘違いしているようだが、そんなことはない。
当たり前だが新人にとってはこんなバグにつき合わされること自体大迷惑でしかないんだよ。
今回のでもPCREが一番ましだし、Rubyなんて選ばれる理由がないだろ。
ゴミだと分かっているものを広めるのは、単なる詐欺師でしかないぞ。
お前はお前の行為によってRubyへの反感を得ているだけなことを自覚した方がいい。
あちこちのスレでお前は相当ウザがられてる。

そういうのではなくて、バグを修正するとか、仕様書に明記するとか、
何でそういう建設的な方向に努力出来ないんだ?
こういう地道な積み重ねを全くやってないからRubyの現状はあるわけでさ。
0902デフォルトの名無しさん
垢版 |
2019/07/18(木) 16:11:19.79ID:Y8yxmCyC
今の複雑化した正規表現エンジンってエンジンを作った人ですらどう動くのか
予測が難しいところがあるのでは

バグと言えばバグだけど総合的に考えてみてこの動作が最適だからこのままにしよう
という部分もたくさんあると思う
だから怠慢という言葉はちょっと違う気がするなぁ

あとrubyの正規表現エンジンは空文字マッチが〜の件は
つまりonigmoのことを言ってるんだけどonigmo自体は空文字マッチに
対応してると記憶してるからrubyモードの仕様なんじゃないかな
0903デフォルトの名無しさん
垢版 |
2019/07/18(木) 20:03:10.71ID:PnG1z3PK
>>902
Ruby周りにはお前みたいなクズしかいないから駄目なんだよ。
プログラミング出来ないのなら黙ってろ。

今のお前が為すべきは、お前が持っているonigmo環境で該当パターンを試し、結果を共有することだ。
Rubyの評判を気にすることではない。

Ruby+onigmoの組み合わせでばっちり動くのなら、
「他環境はゴミです!みなさんの悩みはRubyで解決出来ます!この機会に乗り換えてください!」と言えばいいだけだ。
動くんじゃないかな、みたいなお前の希望的観測なんて何の役にも立たない。

或いは、onigmo単独では動くがRubyのバグ互換モードでは動かない、というのが事実なら、
「Rubyは次のメジャーアップデートでここが対策されます!みなさんご期待ください!」
と言えばいいだけだ。
実際、正規表現の方言/バグに参っている連中はいるんだから、それで乗り換えてくれるだろうさ。

実際、Rubyの奴らはこういう事を全くしない。
そしてRubyの評判だけを気にしているからRubyはゴミのままなんだよ。


871の件、Perl5.6だがPCREもか?と思って試したが、PCREもだ。
そしてPCREには
> using the same syntax and semantics as Perl 5.
と書いてある。つまりこれが本当ならPerl5のバグも含めて挙動は同一、ということになる。
しかしバグまで含めて同一とするにはPerlがこれを仕様化していないとほぼあり得ない。
そこでPerlを確認してみたが、どうやら以下がそれらしい。
> Repeated Patterns Matching a Zero-length Substring
> https://perldoc.perl.org/perlre.html
グダグダ説明はしてあるがPerlは読めんから詳細まで俺の読み通りかは分からんが。
いずれにしても、JavaScriptとPerlは仕様化してる。
Rubyが仕様化しておらず、これが大問題だと認識出来ないのは、Ruby界隈にはまともなプログラマがいないからだよ。
0904デフォルトの名無しさん
垢版 |
2019/07/18(木) 20:22:20.04ID:Y8yxmCyC
BREという超シンプルな正規表現エンジンが持っていた明解な動作の分かりやすさを
現代の超複雑な正規表現エンジンに求めることには無理がある

ちょっと挙動が変なところがあるけどこのほうが便利だよねってのが現代の考え方
なんじゃないかな、それに適応してるのが現代のプログラマということだろう

ゼロ幅マッチで1歩進む件もそういう挙動にするメリットがあるから
そうしてるんだろう、どんなメリットなのかは分からないが
コスト的な問題やセキュリティ的な問題かも知れない

時代遅れのプログラマが何を言おうが正直興味ないわ
現代の正規表現で見れば初心者だし
初心者が内部動作の仮説を立てたところで当たるわけがない
しかもたった数例のコードの動作を見ただけでだ、あほらしい
0905デフォルトの名無しさん
垢版 |
2019/07/18(木) 20:44:40.06ID:PnG1z3PK
>>902
お前みたいなゴミに回答する意味はないが、一応つけておいてやる。

> 今の複雑化した正規表現エンジンってエンジンを作った人ですらどう動くのか
> 予測が難しいところがあるのでは
そんなわけあるか馬鹿タレ。
今現在もスクリプタはプログラマからすると一段下に見られてて、
「スクリプタをプログラマと呼ぶな」という奴も一定数居るだろ。
その理由がこれだよ。
ガチのプログラマは数年前に他人が記述したコードでも必要あれば修正するしかない。
だからこの為に多大なる手間をかけてコードを整備してる。
スクリプタがやってる、今書いて今動いたら捨てておk、なんて甘い世界ではない。

まともなコードなら未来永劫整備可能だし、また、それを目指しているのがプログラマだ。
実際、Linuxなんて30年越しで整備され続けてるだろ。
数年前にお前が書いたコードすら読めないのは、お前の問題であって、それを全体のように言うな。
だからスクリプタは馬鹿にされるし、嫌われるんだよ。

正規表現エンジンなんてプログラミング全体からするとかなり簡単な部類だ。
動けばいいだけのエンジンなら再帰しまくりで1000行程度だろう。
最悪全交換でいい規模だから、そこまでガチで整備されている事は期待出来ないが、
それにしてもこの程度の規模のプログラムを読めない、ってことはあり得ない。
高速化はプログラムに対して「複雑度」を増すものではない。
具体的に言うと、静的コールグラフを複雑化することはなく、
単に遅い関数を速い関数に入れ替える、というのが基本になる。
だから、正規表現エンジンを読めない、というのなら、書いた奴か読む奴が馬鹿なだけであって、
ちゃんとした奴が書いたエンジンをちゃんとした奴が読めば確実に読める。
0906デフォルトの名無しさん
垢版 |
2019/07/18(木) 20:46:26.35ID:PnG1z3PK
> バグと言えばバグだけど
単なるバグだ馬鹿タレ。
> 総合的に考えてみてこの動作が最適だからこのままにしようという部分もたくさんあると思う
非互換になるのでどこでアップデートして修正するかは言語側の選択となる。
だからその前段階、つまり今どこにバグがあってどれくらい問題なのか把握し、
それを広報して共有し、どのタイミングで修正するかを話し合わないといけない。
Rubyはこれが全く出来てない。だからゴミのままなんだよ。
> だから怠慢という言葉はちょっと違う気がするなぁ
バグだと認識した上で、それを仕様として広報するのが最低の義務。
JavaScriptとPerlはそれをやっている。
Rubyの現状はバグに気づいてないか、敢えて黙っているかで、どちらにしても糞でしかない。

> つまりonigmoのことを言ってるんだけどonigmo自体は空文字マッチに
> 対応してると記憶してるから
お前がどんだけ馬鹿なのか分からないが、「バグ」ってのは意図してない動作のことを言うんだぞ。
つまり、対応してるつもりが対応できてないから「バグ」なんだよ。
> rubyモードの仕様なんじゃないかな
そう言うのはちゃんと調べてから言え。希望的観測ではミスリードを大量発生させる。
そしてこれをやりまくっているのがJavaScript界隈で、結果、JavaScripterは馬鹿が再生産されまくってる。
そういうのは止めろ。お互いに得る物がない。


>>904
まあ書いた後に読んだから投稿はしておいた。
話すつもりがないのならさようならでいい。
お前は、自身の問題を認識出来てないタイプだ。まあこのタイプもよくいるが。
0907デフォルトの名無しさん
垢版 |
2019/07/18(木) 21:56:03.46ID:xdHI+pcE
荒らしと会話するな!
荒らしと会話する者も、荒らしだぞ!

プログラマーとは、コードで語る者だけ!
能書きはいらない!

そいつらは荒らしだから、会話するな!
0908デフォルトの名無しさん
垢版 |
2019/07/18(木) 22:31:51.56ID:PnG1z3PK
>>907
お前はコードだけで語りすぎだけどな。
結論を書くようにしろよ。


というかRuby界隈の問題は典型的にこれなんだよ。
Rubyの連中と話してても話が前に進まない。

俺が老害プログラマで荒らしだったとして、
それはRubyの為にも、またこのスレを読んでいる連中の知識になるものでもないだろ。
Rubyの連中は精神年齢がちっと低すぎる。

onigumoが該当パターンに対して正しい答えを出せるのなら喧伝すればいいし、
駄目なら今現在正しく返せるPCRE以下だという現実を受け入れるしかない。
どっちでもないってのは、俺には頭おかしいとしか思えないけどな。

まあ確実に言えるのは、Rubyを今から学ぶのは止めとけ、ってことだ。
Rubyはコミュニティの腐り方がどうも他とは違う。
(JavaScriptも腐ってはいるが、あれは「若すぎる」のが原因だ。
かといって放置しても自然に改善するものでもないが)
0910デフォルトの名無しさん
垢版 |
2019/07/19(金) 00:50:19.02ID:CNkXpMDT
>>909
というかお前もそうだが、onigmo使ってるなら何で試して動作報告してくれないんだ?
そういうところがRubyのコミュニティはおかしいんだよ。
「みんなで前に進む」という感覚がない。

ちなみに
> 鬼車の中の人と Ruby の間の確執がなければとっくの昔に実装されていたのだろうかと思ったり思わなかったり。
> https://qiita.com/k-takata/items/4e45121081c83d3d5bfd
これって何?知ってたら教えてくれれば助かる。
0911デフォルトの名無しさん
垢版 |
2019/07/19(金) 02:29:00.41ID:CNkXpMDT
>>909
入る予定なんてないだろう。
> 8.2 Perl
> Perl には最短一致の繰り返し、バックトラック
> の抑制、否定先読みがある。これにより、非包含オ
> ペレータに似た効果を得ることができる。しかし、
> 7.2 節で詳しく述べたようにこれらは形式言語理論
> からすると適切に扱えず、正規表現の組合せなどに
> 問題が生じる。

> https://staff.aist.go.jp/tanaka-akira/pub/prosym49-akr-paper.pdf
つまり理論畑の人には問題があるが、プログラミング上問題はないんだろ。
そりゃ入れないだろ。
0912デフォルトの名無しさん
垢版 |
2019/07/19(金) 03:16:00.34ID:CNkXpMDT
>>910
自己レスだがだいたい分かった。
その他はリンク切れが多くて詳細までは追えないが、どうやら、勝手に使ったことに対して怒っているらしい。
https://kkos.hatenadiary.org/entries/2007/05/25#1180100250
が、ライセンス違反でなければ勝手に使え、というのがBSDだし、
告知しなかったことに関してはRuby側が悪いわけでもない気がするが。

ただこれなら鬼車にはRubyバグを作り込む必要がないから芽がある気はする。
そして文句を言ったところで鬼雲にフォークしてマージしたのなら実質大して変わらない気もする。
よく分からん所で喧嘩してるなとは思う。
0913デフォルトの名無しさん
垢版 |
2019/07/19(金) 11:33:59.54ID:bgAzEf51
このスレでコミュニティうんぬんは脱線しすぎじゃないかい。スレタイとなんも関係ないやろ。
0915デフォルトの名無しさん
垢版 |
2019/07/20(土) 17:29:27.69ID:AFOF1ubv
JSです
「はい」「はい」
「うん」「うん」
「■●」「■●」
「△◎」「△◎」
など、同じ文字列2回(あるいは2回以上)の繰り返しを探すにはどうすればよいでしょうか?

/「(.+)+」/
とかだと、1回目と2回目が違ってもヒットしちゃいますよね…?
0916915
垢版 |
2019/07/20(土) 17:31:58.05ID:AFOF1ubv
>>915
例を全部2文字にしちゃいましたが、 .+ と書いているとおり別に文字数は関係ありません
0917915
垢版 |
2019/07/20(土) 17:37:46.94ID:AFOF1ubv
>>915
そして度々すみませんが /「(.+)+」/ じゃなくて /「(.+)」+/ でした
とりあえずこれはダメな例ということで
いい例が知りたいです
0919デフォルトの名無しさん
垢版 |
2019/07/20(土) 20:12:32.11ID:AFOF1ubv
>>918
3つ目の

# 重複文字列の抽出にも応用できます
pry(main)> '東京都日野市日野市ほげほげ'.match(/(.+)(\1)/)
=> #<MatchData "日野市日野市" 1:"日野市" 2:"日野市">

ですね、ありがとうございます…!
0920デフォルトの名無しさん
垢版 |
2019/07/21(日) 20:31:55.31ID:Bdf0kkIf
>>912
ttps://kkos.hatenadiary.org/entry/20070906/1189084566
松本氏はrb_enc_mbclen()のインターフェースが不適切であるという指摘に対して、何故、その原因を私に責任転嫁したのでしょうか?

rb_enc_mbclen()のインターフェースが不適切になっている本当の理由は何でしょうか?


まつもと
元の表現は「鬼車から継承した」と書いただけで、別に「鬼車に責任がある」というつもりはありませんでした(実際「責任」はないわけですし)。


現在のインタフェースになっている原因が「鬼車がそうなっていたから」であり、その理由は「まつもとがGB18030のようなエンコーディングへの対応に対する関心が薄かった」ということです。
「だったら、最初からそう書けよ」と言われそうですが、すいません、言葉が足りませんでした。
0921デフォルトの名無しさん
垢版 |
2019/07/22(月) 01:27:11.95ID:dN38X5eV
>>920
おおサンクス。
ただ、それって 2007/05/25 より後だから、別件だね。
無駄に喧嘩してるなあ。

内容はkkos氏の方が正しい。
鬼車は最速を目指したライブラリなのだから、無駄なことは出来る限り省かなければならない。
そもそもスクリプト言語で不完全な文字列って、バイト列を直接与えるとかしないと出来ないはずだし、
その場合にはRuby側でチェックしておけ、というのはその通りで、極めて妥当な要求だ。
Rubyなんてmutable stringなのだから最初に必ずコピーが必要で、普通はその時にやればいいだけ。
その方が今時の型安全にも合うし。

それを「実は僕も問題だと思ってたんだよね」みたいな受け方をするからそりゃ不信感が募る。
これは完全にMatzが糞で、実はC流のグダグダコードを書いていて、
どこで何をするべきか分かってないのだと思う。
そしてRuby界隈ではMatzは変に神格化されてて裸の王様化してる、ってとこだろう。
878の動作結果を見ても、誰も問題だとは指摘出来ないようだし。

これはkkos氏が言っているとおりがそのままで、普通は、というか本当は、
1. Rubyは rb_enc_mbclen(p,end,enc) で記述していたが、
2. 鬼車が rb_enc_mbclen(p,enc) で記述されていることに気づき、
3. 何で end が無いのか確認して、
4. Ruby側にチェックをつける
という流れになる。
1が無いのに、「し、知ってたし」みたいなことを言うから「嘘つくな」になる。
つってもこういうちょっとズルいというか卑怯というか、絶対俺のバグは認めないマンは残念ながら普通にいるから、
いちいち問いただしても始まらない。ただ、多分、kkos氏が切れたのはその後、
> それはそれとして、鬼車を呼ぶ前に「一文字を完成していない不完全なバイト列は含まない」ことをチェックするのはかなりコストが高いのですが、
これだとは思う。鬼車側でチェックしたらコストが安い訳でもないのに、これはない。
これはコイツとは一緒にはやれない、という結論を出すには十分だ。
本来Aでやるべき事をBでやる、みたいなことをすると、コードが一気に劣化していく。
長いこと保守するつもりなら絶対に飲めない。実際、鬼車は今も保守されているし、kkos氏の判断は妥当だ。
0922デフォルトの名無しさん
垢版 |
2019/08/01(木) 15:57:12.21ID:BVNOJ7mG
>>789やってくれる人はいないか〜
2ch全盛期なら誰かしらやってくれた可能性高いけどすっかり寂れたな

onigmoに興味があるならtakata氏の日記を読破してみてはどうかな
作りながら考えてたことが分かって面白かったよ
0923デフォルトの名無しさん
垢版 |
2019/08/24(土) 12:41:17.80ID:fR0bFJ1E
perlで

(?<=(aa|bb))c

ならokだが

(?<=(aa|bbb))c

だとVariable length lookbehind not implementedになるの納得いかないなー
確かに戻り読み部分の長さに複数の可能性があるけど明らかに有限じゃん

秀丸のHmJre.dllだと通るようだ
0924デフォルトの名無しさん
垢版 |
2019/08/24(土) 13:46:10.60ID:6nD2xE5w
(?<=(aa.*|bbb))c
0926デフォルトの名無しさん
垢版 |
2019/09/01(日) 12:33:19.59ID:fodjUzDJ
JS(ES2017)です

「貫樣」みたいな、中国語でしか使われないような怪しい漢字を弾きたい
(日本語で使われる漢字のみ許可したい この場合は「貫」だけ残して「樣」は消したい)
のですが

CJKとか言って一緒くたになっている以上、Unicode範囲指定などで判別することはできないですかね…?
0927926
垢版 |
2019/09/01(日) 12:38:35.03ID:fodjUzDJ
「樣」は一応日本語でも使うみたいですね…
とりあえず常用漢字じゃなければ弾くくらいでもいいのですが
常用漢字表を作って比較するくらいしかない…のかな?
0930デフォルトの名無しさん
垢版 |
2019/09/01(日) 18:46:39.31ID:VXfAHt8z
>>927
樣は様の旧字で現在でも許容字体扱いだから「常用漢字表」にも
出て来る。
https://ja.wikipedia.org/wiki/%E5%B8%B8%E7%94%A8%E6%BC%A2%E5%AD%97%E4%B8%80%E8%A6%A7

>928-929みたいなのはあくまでコンピューター用のコードの
まとまりの話だから常用漢字か否かは区別していない。

上のリンクのウィキの本表をエクセルにコピーして2列目の
通用字体だけを残して改行を消してやり、それと平仮名や
記号を除外規定にして残り全部消すとかなら正規表現だけでも
さっさと終わるんじゃないかな。

JISの範囲内だけがほしいならシフトJISで保存したら他は
疑問符になるだろうからそれをまとめて削除したらおしまいだろうが
繁体字の樣は残る。簡体字の[木羊]は消える。
0931デフォルトの名無しさん
垢版 |
2019/09/01(日) 21:04:09.80ID:fO6VcsLE
Google謹製の正規表現ライブリ「re2」でググったら「バイオハザード2 RE:2」が検索上位に来るのどうにかならない?
0934デフォルトの名無しさん
垢版 |
2019/09/10(火) 22:48:57.92ID:CokwQGf+
直前の文字が1回以上出現することが確実なケースで、仮に0回の出現として考慮しても問題がないという場合に、
+ではなく*で正規表現を記述する理由はありますか?

例えば、慣例として*のほうを使うとか、*とするとマッチしない場合のみ+を使うとかそういう
0937デフォルトの名無しさん
垢版 |
2019/09/11(水) 12:05:55.89ID:zFEVPQj4
>1回以上出現することが確実なケース

>仮に0回の出現として考慮しても問題がない

矛盾してるな
0938デフォルトの名無しさん
垢版 |
2019/09/11(水) 15:12:05.49ID:wb8QVF41
>>934
出現が確実ではあるが、もしなかった場合にも対応したい
そういう要求があり、動作にも差し支えない場合なら * をつかう
ということに尽きるでは?
0940デフォルトの名無しさん
垢版 |
2019/09/12(木) 02:26:26.53ID:xpiKRNxb
やっぱ質問して放置か、教える側も学習すべきだな
まともな質問じゃないと思ったらスルーでいい
0942デフォルトの名無しさん
垢版 |
2019/09/12(木) 06:58:37.97ID:1ik9S0iw
いや普通におかしいだろ
なんか無理矢理の条件考えて論争させようとしてるような気がする
0943デフォルトの名無しさん
垢版 |
2019/09/12(木) 08:21:20.40ID:xpiKRNxb
自分なら人にこういう質問レスを書くかなって考えてみて絶対書かないと
思うものにはレス付けないのがいいかもね
説明不足で意味不明なものとかも
0944デフォルトの名無しさん
垢版 |
2019/09/12(木) 09:22:01.93ID:TOasMGF3
●Regular Expressionの使用環境
Mery

●検索か置換か?
置換

●説明
属性内のアルファベット小文字を削除

●対象データ
id="105I42b 104I41b"
id="99E65e 95B43d 92B87d"
id="97B22d 95D18a 93B22c 93E23b"

●希望する結果
id="105I42 104I41"
id="99E65 95B43 92B87"
id="97B22 95D18 93B22 93E23"

id="((\d+[A-Z]\d+)[a-z] ?){2,}"で検索は出来たのですが置換が思い浮かびません
0945デフォルトの名無しさん
垢版 |
2019/09/12(木) 10:00:21.41ID:bJPykHLq
わかりやすいように、できるだけそのまま書くならこうかな

●検索文字列
(id="|\G )((\d+[A-Z]\d+))[a-z]

●置換文字列
\1\2
0947デフォルトの名無しさん
垢版 |
2019/09/12(木) 10:30:50.86ID:TOasMGF3
>946
出来ました!
ありがとうございます。

田中哲スペシャルっていうやり方なのでしょうか
0948デフォルトの名無しさん
垢版 |
2019/09/12(木) 11:08:37.62ID:bJPykHLq
\Gは照合開始位置と呼ばれる物で、マッチした箇所の後の境界にマッチしてくれるので
さっきのように(特定の文字列or前回置換しところ)の後に置換したい文字列があるときとかに便利で定番

田中哲スペシャルは\gで同じ表現をもう一回使うって奴だから違うかな
0949デフォルトの名無しさん
垢版 |
2019/09/12(木) 11:58:31.87ID:TOasMGF3
>948

勉強になります。

ちなみに最初の値にはアルファベットがついてないケースだと拾えなかったのですが
id="97B22 95D18a 93B22c 93E23b"

対応策ありますでしょうか?
0951デフォルトの名無しさん
垢版 |
2019/09/12(木) 15:04:33.55ID:bJPykHLq
>>949
自分でも書けない訳じゃないみたいだし、魚を与えるより釣り方を教えよの精神でヒント
変更のない置換後でも\Gは引っかかるので、小文字がないidも全部マッチするようにすれば

こういうのを後出しされるとお互い二度手間だから
質問するときはパターンを網羅的に書いといた方が良いよ

あと>>950が指摘してくれたように誤爆が懸念されるので、\Gを\G(?<=.)にした方が良いかもしれない
●対象データが正確で、実際の対象もidのみが載ったリスト形式みたいなものなら要らないけど
0953デフォルトの名無しさん
垢版 |
2019/09/12(木) 18:08:37.95ID:EfYu2rO4
文字列 "プログラマー" を "プロクライマー" に書き換える正規表現を教えて下さい
0955デフォルトの名無しさん
垢版 |
2019/09/12(木) 22:19:07.70ID:cqw0/uFd
正規表現の使い方じゃなく作り方、バックトラックなど理論から解説している書籍やそれに準ずるサイトなど知っていたらご教示ください。
こうやればこうなるよ、こういうときはこうすればいいんだよ的な学習では身に付かなくて…
0957デフォルトの名無しさん
垢版 |
2019/09/12(木) 23:14:33.93ID:Uy9QyXie
ありがとうございます!
rubyの一件って何ですか?(何て検索したらいいですか?)
0958デフォルトの名無しさん
垢版 |
2019/09/12(木) 23:43:24.49ID:Yy9Clfy1
Rubyの作者さんと何かあったようで嫌気が差したのかそれ以後ブログで正規表現のことを
取り上げる頻度がめっきり減っちゃったんですよ
0959デフォルトの名無しさん
垢版 |
2019/09/13(金) 08:32:54.25ID:sQZEDK+j
>>958
ありがとうございます!
なるほど、残念ですね…
0961デフォルトの名無しさん
垢版 |
2019/09/13(金) 11:54:40.09ID:X5DxpBbM
正規表現はどの言語でも共通で使えますか?それともちょっと違ったりしますか?
0963デフォルトの名無しさん
垢版 |
2019/09/13(金) 13:25:46.31ID:8XwQqyT8
Ruby で作った。
一旦、パターンで一致させてから、一致した行だけを変換した。
ただし、同じ行に、id="〜" が複数あると、バグる!

src = <<'EOT'
id="aAxy Xz"

id=""
id="9"
id="9y"
EOT

# id=" で始まって、" 以外の文字が続いて、" で終わる
re = /id\=\"([^\"]+)\"/ # ( ) 内は、$1

dest = src.gsub( re ) do |line|
'id="' + $1.delete( "a-z" ) + '"'
end

print dest

出力
id="A X"

id=""
id="9"
id="9"
0964963
垢版 |
2019/09/13(金) 13:43:10.59ID:8XwQqyT8
>>963
修正

>ただし、同じ行に、id="〜" が複数あると、バグる!
大丈夫だった。正常に動く
0965デフォルトの名無しさん
垢版 |
2019/09/16(月) 02:45:59.31ID:dK4dr8mE
JSで
101 dogs
7 little goats
30 8 year old humans

↑をそれぞれ
["101", "dogs"]
["7", "little goats"]
["30", "8 year old humans"]
と切り分けるにはどんな正規表現を使えばよいでしょうか?

["7", " ", "little goats"]のような形でもかまいません

.match(/^\d+\s|.+$/)
だと
["7 ", "little goats"]
になってしまい、数字のあとの余計な半角スペースをあとで取り除かなければならなくなるのがなんか嫌で…
0966デフォルトの名無しさん
垢版 |
2019/09/16(月) 02:59:29.74ID:/xGIA7r1
正規表現を使えないなら文字列操作でやればいいだけ
正規表現を使いこなせてない人が使うとバグの温床になるからお勧めしない
0968デフォルトの名無しさん
垢版 |
2019/09/16(月) 12:07:55.69ID:oN5KVYJd
Ruby では、

chomp で、末尾の改行を削除する。
split の2 は、分割の最大数

text = <<'TEXT'
101 dogs
30 8 year old humans
TEXT

p ary = text.lines( chomp: true ).map { |line| line.split( " ", 2 ) }

出力
[["101", "dogs"], ["30", "8 year old humans"]]
0969デフォルトの名無しさん
垢版 |
2019/09/16(月) 15:25:40.41ID:YU5GpdCi
JSでは、
["30", "8 year old humans"]
ではなく
["30","8"]
となる
limitは、分割結果の制限であり、見つかった要素の数をそこまでで打ち切る
0970968
垢版 |
2019/09/16(月) 15:36:25.96ID:oN5KVYJd
>969
えー!!
0972デフォルトの名無しさん
垢版 |
2019/09/16(月) 16:04:28.98ID:2suJbq8i
matchじゃなくてsplitで

str.split(/(?<=^\d+) /)



array = str.split(" ");
array[0] + array.slice(1).join(" ")

とかじゃない?
0975デフォルトの名無しさん
垢版 |
2019/09/16(月) 16:28:11.45ID:53ZoYsUm
正規表現逆引きcgiとかないの?
雑に日本語で書き込んだらAIが判断して正規表現を返してくれる
そんなの
0976デフォルトの名無しさん
垢版 |
2019/09/16(月) 17:07:19.10ID:YU5GpdCi
>>974
マッチしない場合でもエラーにならないよう保険かけとく方がよいのでは?
(str.match(/〜/)||[]).slice(1)
0977デフォルトの名無しさん
垢版 |
2019/09/16(月) 17:20:26.44ID:oN5KVYJd
var ary = new Array( 2 )
var str = "30 8 year old humans"

var pos = str.indexOf( " " );
console.log( pos ) // 2

if( pos === -1 ) { // 見つからない
// 何かの処理
} else {
ary[ 0 ] = str.substring( 0, pos )
ary[ 1 ] = str.substring( pos + 1 )
}

console.log( ary ) // [ '30', '8 year old humans' ]
0979デフォルトの名無しさん
垢版 |
2019/09/16(月) 17:40:28.59ID:enU8we0d
>>969
知らなかった
0980デフォルトの名無しさん
垢版 |
2019/09/16(月) 18:09:34.33ID:enU8we0d
const str = '30 8 year old humans'
(([first, ...rest]) => [first, rest.join(' ')])(str.split(' '))
//=> ["30", "8 year old humans"]

あ、正規表現がねぇw
0982デフォルトの名無しさん
垢版 |
2019/09/16(月) 22:28:40.71ID:enU8we0d
次スレ立てたんだけど、
Regular Expression(正規表現) Part15
https://mevius.5ch.net/test/read.cgi/tech/1568640311/

テンプレ貼ってたら>>3 がNGワードとやらで貼れません。
というわけであとよろしく。
0983デフォルトの名無しさん
垢版 |
2019/09/17(火) 10:37:10.53ID:aFTX7+W5
>>982
>>3
のテンプレにある

【 初心者 】 正規表現 【 入門 】 ←閉鎖
http://funcchan.blog16.fc2.com/

5ch では、fc2 は、宣伝禁止かも!
これは、半角で書き込めないので、全角に変換した

このURL を削除すれば?

MANGO 板で、NG ワードを調べられる
0984977
垢版 |
2019/09/17(火) 12:02:24.99ID:aFTX7+W5
>>977
を修正した

const str = `101 dogs
30 8 year old humans`

const lines = str.split( "\n" ); // 配列

const results = lines.map( line => {
var ary = new Array( 2 )
const pos = line.indexOf( " " );

if( pos === -1 ) { // 見つからない
// 何かの処理
} else {
ary[ 0 ] = line.substring( 0, pos )
ary[ 1 ] = line.substring( pos + 1 )
}
return ary
} );

console.log( results ); // [ [ '101', 'dogs' ], [ '30', '8 year old humans' ] ]
0986983
垢版 |
2019/09/17(火) 17:07:52.35ID:aFTX7+W5
Amazon も、半角で書けないだろ

一番恐ろしいのは、はてなブログ!
書き込み禁止画面が出ずに、いきなり吸い込まれて、アクセス禁止にされる!

同様に、twitter の長いURL も、吸い込まれるものがあるらしい!

5ch で、しつこく宣伝する香具師をはめるために、いきなりのアク禁!

MANGO 板に書き込んで、何がNG ワードが、地道に判定していくしかない
0990デフォルトの名無しさん
垢版 |
2019/10/02(水) 17:34:34.60ID:dOlpIXop
U . M . E
0991デフォルトの名無しさん
垢版 |
2019/10/12(土) 20:41:17.72ID:VAjNOt6S
以下を正規表現で行うにはどうしたらよいでしょうか。
-----元データ------------------
<aaa bbb
ccc
ddd>
<eee>
ffff ggg
<hhh
iiii>
-----------------------------
-----欲しいデータ----------------
aaa bbb ccc ddd
eee
ffff ggg
hhh iiii
------------------------------
0993デフォルトの名無しさん
垢版 |
2019/10/12(土) 22:51:54.37ID:7TGqmTiW
>>991
Ruby
$ cat input.txt | ruby -e 'puts ARGF.read.gsub(/<(.*?)>/m) { |m| $1.gsub("\n", "") }'

Node
$ cat input.txt | node -e 'process.stdout.write(fs.readFileSync(0).toString().replace(/<([\s\S]*?)>/mg, ($0,$1)=>$1.replace(/\n/g, "")))'

sed
$ echo $(cat input.txt) | sed -E 's/<([^>]*)>/\n\1\n/g' | sed -e '/^ *$/d' | sed -e 's/^ *//'

sedのは一旦改行削除して、<..>の前後に改行追加して、空行削除して、行頭の空白を削除してる
0994デフォルトの名無しさん
垢版 |
2019/10/13(日) 01:09:33.88ID:Gu1oNPJo
Ruby で、

text = <<"EOT"
<aaa bbb
ccc
ddd>
<eee>
ffff ggg
<hhh
iiii>
EOT

# m option は、multi-line。$1 は、キャプチャー部分。
# [^>]+ は、> 以外の文字が、1文字以上続く
puts text.gsub( /<([^>]+)>/m ) { |matched| $1.gsub( "\n", " " ) }

>>993
>$1.gsub("\n", "")
"" は、" "(半角空白)の間違いだろ
0995デフォルトの名無しさん
垢版 |
2019/10/13(日) 01:37:59.89ID:5y3mzviq
>>994
コピペしたら元データに行末スペースが入ってたからそうしたんだけどこれは5chの仕様なのかな?
行末スペースがないなら空文字じゃなく半角スペースに置換だね
0996994
垢版 |
2019/10/13(日) 03:33:31.81ID:Gu1oNPJo
5ch からコピーすると、行末に半角空白が入るから、
漏れは、Ruby で削除してる

# クリップボード内の複数行文字列の、各行の先頭・末尾から、
# 連続する空白類を除去して、クリップボードに入れる

str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換

ary = str.each_line.map( &:strip ) # 連続する空白類を除去する

IO.popen( 'clip', 'w:cp932' ) do | clip | # CP932 へ戻す
clip.print( ary.join "\n" )
end
0997デフォルトの名無しさん
垢版 |
2019/10/13(日) 07:48:23.30ID:0NSyRtEU
>>992-994
皆さんありがとうございました。
後方参照をさらに置換すれば良かったんですね。そんな方法があったとは!!
助かりました。
0998デフォルトの名無しさん
垢版 |
2019/10/13(日) 22:01:19.92ID:5y3mzviq
>>996
エディタのコマンドで対応できることだから
わざわざスクリプト書くのはちょっとオーバーキルかな
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 942日 20時間 38分 13秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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