Regular Expression(正規表現) Part14 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2017/03/15(水) 02:04:35.47ID:e01p03UP
Regular Expressionスレです。

質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。

前スレ
Regular Expression(正規表現) Part13
http://echo.2ch.net/test/read.cgi/tech/1415149975/


次スレは>>980宜しく
天ぷら等2以降
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} をコピペしなくて済む
とんこ式の とんこ とは発案者の名前とのこと
2018/10/28(日) 14:53:16.06ID:ZnGbnC1U
これらの記述法には1つ弱点があり

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

より前に

\k<name>

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

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

このため定義する順序が限定されてしまう、これは解消されるべき問題である
2018/10/28(日) 15:07:39.92ID:ZnGbnC1U
↑これの例はおかしいな、このレスは取り消し
2018/10/28(日) 15:36:10.31ID:ZnGbnC1U
昨日、詳説 正規表現の本を枕の下に置いて寝た
寝ている間に正規表現のパワーがもらえると思ったからだ

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

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

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

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

実行結果を見た私は奇跡を見ていた
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 にマッチするが後者は...
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} でもマッチ
2018/10/29(月) 01:00:01.03ID:BYis7ms7
perl がマッチするのはもしかしたら内部的にunicodeになってるとかかな
自分はプログラマじゃないんでさっぱり
2018/10/29(月) 01:09:53.75ID:BYis7ms7
どうやら当たりらしい、unicodeに変換してからマッチしてた

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

if ( "あ" =~ /\x{82A0}/ ) # false
2018/10/29(月) 19:52:31.20ID:BYis7ms7
・再帰の穴を狙う2

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

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

ガードが鉄壁ですごい、ほんと良く出来てるな〜
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 にするとどちらもマッチする
2018/10/31(水) 17:14:05.35ID:ZWlmxwfj
やっぱりこれ欲しいなぁ

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

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

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

これの代わりに複数回の置換を行うと \G を使うときに困る
同じものを複数回検索するので速度低下に繋がる
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) | ) で代用出来るから必要度は低い
2018/11/01(木) 00:56:07.61ID:+M+OiFJp
動画を正規表現に変換
https://www.youtube.com/watch?v=em8UvwCTWwk

検索: ^(.*)タマ(.*)タマ(.*)$
置換: $1$2$3
2018/11/01(木) 01:35:03.88ID:zrOHiVOt
ニュタマーハタマーフ
2018/11/01(木) 17:25:34.93ID:+M+OiFJp
(*^-^*)
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神はここ見てるのかな
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
2018/11/01(木) 23:04:15.23ID:dBKH7CcG
>>691
perlの場合、Encode::decode()でperl内部処理用文字コード(utf8の亜種っぽい何か)に
正しく復号しないと正規表現クラスを正しく使えない。
2018/11/02(金) 01:26:49.16ID:XP4jtOby
>>702
解説ありがとうございます
ということは今まで自分はperl内部の独自の文字コードにエンコードされた文字列に
対して正規表現を使っていたわけですね、恥ずかしながら初めて知りました
704デフォルトの名無しさん
垢版 |
2018/11/05(月) 20:41:07.84ID:SJelCvn/
>>683
畳み込み文字ってなんですか?
2018/11/05(月) 23:47:01.14ID:xCFT0arz
(?:
  ( V ) > (0 -1)
 |
  ( . ) >  (1  0)
)
  俺も分からん
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))
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))
2018/11/06(火) 19:36:59.61ID:4TN3vyid
>>707 の実験でバグの原因が分かった

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

ということだね、原因が分かれば回避が簡単なのでこのまま放置でも良さそう
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"; }
2018/11/09(金) 18:52:26.91ID:BZlL2mTg
if ( "K" =~ /\A\x{212A}\z/i ) true
if ( "K" =~ /\A\x{212A}\z/il ) false
2018/11/09(金) 21:22:21.15ID:BZlL2mTg
if ( "\x{212A}" =~ /[[:print:]]/ )  true
if ( "\x{212A}" =~ /[[:print:]]/a ) false
2018/11/10(土) 00:04:00.21ID:EY2CMtcP
\d{0,32766}
# ok

\d{0,32767}
# error "Quantifier in {,} bigger than 32766 in regex;"
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
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"; }
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
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> .
## バックトラックの対応、成功
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"; }
718デフォルトの名無しさん
垢版 |
2018/11/14(水) 10:41:07.07ID:Hh1ptiAj
717
2018/11/14(水) 14:37:49.07ID:duOGmOFb
ワロタw
2018/11/14(水) 18:45:40.17ID:I91AeKub
このクイズだか検証だかよくわからんの書き連ねてるのは何なの?
一人で無意味に書き連ねてるの?誰かとやりとりしてるの?
2018/11/14(水) 23:41:31.78ID:cpUdYoRF
正規表現の勉強をしながら気付いたことをメモってるだけです
基本的には一人でやってます

仲間が欲しい...
2018/11/14(水) 23:44:34.67ID:CNd6PM4x
ここはお前のチラシの裏なのか

ある程度まとまってんならともかくメモ書きなら他所でやれよ
2018/11/15(木) 00:11:59.19ID:Ow4iH1sO
需要ないかな?無いならやめます
2018/11/15(木) 22:32:34.48ID:IM0UsOCP
無いよ
2018/11/16(金) 17:20:00.59ID:eADG8kUk
bregonig.dll の (?a)\w の処理速度が遅い

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

改善の余地ありそうだね
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になる
2018/11/17(土) 12:49:09.25ID:Oiq/x6oK
いつまで続くの?
2018/11/21(水) 19:34:31.80ID:CU3gUCH4
●Regular Expressionの使用環境
C#

●検索か置換か?
置換

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

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

●希望する結果
空空空ああああ あ あ あ あ あ
2018/11/21(水) 23:39:43.26ID:UsYfXb0d
>>728
Regex.Replace(str, @"(?<=^\s*)\s", "空");
2018/11/21(水) 23:41:52.91ID:UsYfXb0d
あ全角スペースか
\sを全角スペースに変えて
2018/11/22(木) 01:15:55.43ID:YNRtrxPu
可変長の戻り読みは便利だけどコールバックで処理するのが普通じゃないかな
https://ideone.com/4l8abQ
732729
垢版 |
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倍以上速かった
正規表現使わないでもいい時はなるべく使わないほうがええね
2018/11/22(木) 11:43:47.30ID:sD3Vu3lJ
>>729-732
どうもありがとうございました
2018/11/26(月) 03:08:54.11ID:bvNwlvbS
Regex.Replace(str, @"\G ", "空");

でもいけるよ
735デフォルトの名無しさん
垢版 |
2018/11/26(月) 06:49:56.12ID:OBhrl1nm
>>734
・・・っ、すごい。サクラエディタとかでも使える。
\Gのありがたみ知らなかった。私は、まだまだ精進が足りないようだ。
2018/11/27(火) 00:09:50.92ID:5gbDlA47
\Gを知らないのに正規表現を使いこなせるということはproxomitronのユーザーさんかな
2018/11/28(水) 15:10:22.46ID:N4CCGDXj
\Gの使い方を覚えたら>>714が面白く感じるかもね
知ってれば今更感しかないが
2018/11/29(木) 02:42:35.12ID:Fz25AUlj
>>505-506
すごい

こういう書き込みが初心者の質問とその回答で埋もれてしまうのはもったいない
質問スレとは別に正規表現の本スレらしいスレがあるといいな
2018/11/29(木) 02:52:05.30ID:rs9fzmaE
頑張ったなぁとは思うけど https://regex101.com/ じゃあかんかったか?とも思う
というかリンク貼れんの? https://goo.gl/M2Fn68.info
2018/11/29(木) 08:19:27.68ID:nDdllTwV
自分で立てればいいのになんで他人頼みなの?
2018/12/02(日) 03:28:37.05ID:s0yCsMa3
>>738
じゃあ俺が立てるわ、テンプレの準備にちょっとかかるが
2018/12/08(土) 16:06:50.58ID:7G2k61ed
twitter.com/munesuk
enya_go/status/1071188833515954176
先輩w
2018/12/08(土) 20:04:57.14ID:RNQqcEtu
アンド検索をしたいのですが、どう書けばいいでしょうか

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

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

分かりやすい解説サイトでもあれば教えてください
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)」
なんてのを吐き出した
安直だけどまあこれも間違ってはいない
2018/12/08(土) 20:35:48.50ID:Dx33rAX6
あ、先読み対象の語は「^」だけで
「行頭から始まるという条件さえ満たせば何でもよい」と指定してる
2018/12/08(土) 22:19:09.33ID:7G2k61ed
環境が分からない
何を検索したいのか分からない

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

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

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

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

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

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

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

回答して残念な気持ちになったよ
2018/12/09(日) 19:57:20.13ID:sTKdTIE5
位置の理解は言うほど易しくはないとおもわれ
正規表現検索とはテキストエディタでカーソルを1つずつ進めながら
合致する文字を1文字ずつ探っていくようなものだというイメージが必要だけど
そこをちゃんと説明してるものはあまり見かけない
2018/12/09(日) 20:00:27.58ID:bzQOhihu
知恵遅れに場所を移動したらしい
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10200210065
まずは自習しろよw
2018/12/09(日) 21:49:11.61ID:bsA2M6bZ
回答した人は親切丁寧に回答出来ていたよ、お疲れ様
上にも書いたように頭のいい人にしか理解出来ない回答になっていた
俗にいう分かってる人にしか分からない説明ってやつ

俺はこういうバカに教えるのは得意だから俺が回答を付ければ理解されたと
思うけど注意をスルーされたのでスルーした
2018/12/10(月) 14:42:13.07ID:RU/iAdEK
知恵袋で質問を4000件以上やりとりしてる人だったのか
それなのに質問の仕方がまったくダメって
2018/12/10(月) 17:07:38.24ID:RU/iAdEK
質問のペースがおかしい、1日に質問6つしてる
ググるより先に質問してんのか?
2018/12/10(月) 17:25:29.04ID:RU/iAdEK
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10200202400

おまえらはこんなの相手に一生懸命教えてたのか
自分を安売りしすぎ、もってけ泥棒状態
2018/12/10(月) 17:25:37.52ID:RTUhzLAF
そして回答はアダルトカテゴリのみという…
2018/12/10(月) 17:29:58.71ID:RU/iAdEK
やっぱ質問スレと本スレは分けるべきだな
この流れになると賢い人が来なくなってしまう
765729
垢版 |
2018/12/10(月) 18:14:05.41ID:PtRqcV9k
なんで馬鹿が一匹きただけでそういう話になるんだよ
過剰対応の典型やろ
2018/12/10(月) 21:59:56.06ID:RU/iAdEK
入門サイトすら読んでないような人の質問とその回答にうんざりして
来なくなった人は大勢いると思うんだがそういう人達が集まれるスレが
あったらひょっとしたらすごいスレになるんじゃないかという期待がある
実際はただ過疎るだけなんだろうけどね
2018/12/11(火) 02:31:31.29ID:oKdEGQIj
隔離スレなんて作るだけ無駄だろ
機能してるところなんて見たこと無い
2018/12/11(火) 02:44:05.34ID:4gYtUlOJ
PCサロン板なら迷惑にならなそうなので立ててみた

【PCサロン】正則表現 part1
http://mao.5ch.net/test/read.cgi/pc2nanmin/1544462745/l50

基本過疎進行ですが正規表現を使いこなせる人同士で語りたい方はこちらで
2018/12/13(木) 17:01:35.11ID:IMhQiOyS
回答が付いた。でも微妙におかしい。つっこんであげるべきか?
2018/12/14(金) 20:59:53.53ID:DlmPms4F
^
(?:
(?!あああ|かかか).
)*+
(?>
(あああ)
|
かかか
)
(?:
(?!あああ|かかか).
)*+
(?(1)かかか|あああ)
.*+$
2018/12/14(金) 21:11:35.41ID:DlmPms4F
^
(?~あああ|かかか)
(?>
(あああ)
|
かかか
)
(?~あああ|かかか)
(?(1)かかか|あああ)
.*$
2019/01/10(木) 03:02:56.41ID:mY602DpM
FirefoxやChromeのブックマークにこれ登録して
https://i.imgur.com/68VCDRV.jpg

ブラウザのアドレスバーに
re foo|bar|baz
と入れると

https://regexper.com/#foo%7Cbar%7Cbaz
に飛べるようになる
簡易チェッカーとして便利
2019/01/10(木) 14:50:11.25ID:Q3mhk3sM
>>772
いいねw まったく思い付きもしなかったアイデアwww
2019/01/10(木) 15:21:01.00ID:Q3mhk3sM
>>772
chrome on mac だけどブックマークではダメで、設定→検索エンジン→検索エンジンの管理→追加 から登録しないといけなかったわ。
2019/01/13(日) 18:46:07.60ID:vFHHKg45
URL(http|https)の正規表現って難しいのかね
https://mathiasbynens.be/demo/url-regex
38charsのが好きだわ
776デフォルトの名無しさん
垢版 |
2019/01/26(土) 10:17:12.64ID:rNPVIr5d
否定先読み
と言うのがなかなか理解出来ないのですが、
サンプルを動かすと確かに動作するのですが、
今一つ仕組みが分かりません。
どんなふうに理解すれば良いのでしょうか?
777729
垢版 |
2019/01/26(土) 10:42:36.00ID:K4a4emwR
文字じゃなくて位置(文字と文字の間)に一致すると考えればいい
たとえば

abcdef

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

abc[ここ]def

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

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

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

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

先読みは、マッチ位置の直後の条件を指定するが、
戻り読みは、マッチ位置の直前の条件を指定する
781デフォルトの名無しさん
垢版 |
2019/01/27(日) 10:46:10.47ID:Th+zYLMn
>>777
ありがとうございました。
良く分かりました。
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]+(?!\/)
2019/01/28(月) 10:57:25.94ID:DdBbxYrt
\/efgh\/1[^/]*$
ではダメかな
2019/01/28(月) 12:18:39.25ID:c4Y7c3OH
>>783でいいと思う
あとスラッシュにエスケープは不要だから/efgh/1[^/]*$
否定先読みが使いたいなら /efgh/[0-9]+(?!.*/)
(?!.*/)はそれ以降/が含まれない位置という意味
(?!/)だと直後に/がない位置という意味だから数字が2文字以上続いたらマッチしてしまう
2019/01/28(月) 12:21:15.63ID:c4Y7c3OH
ごめん1って決まってるならこれでいいな
/efgh/1(?!.*/)
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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