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以降

399デフォルトの名無しさん2018/01/11(木) 10:30:10.40ID:Xo4biI2J
^[△]*hostname:[△]*([0-9.]*[A-Za-z\-][0-9A-Za-z.\-]*)$
^[△]*hostname:[△]*([0-9.]*[^\s0-9.]\S*)$

hostname:△mevius.5ch.net
hostname:△86886.jp
hostname:△日本語.jp
hostname:△はじめよう.みんな

400デフォルトの名無しさん2018/01/11(木) 12:30:44.58ID:/99JjIqr
>>398
要件は満たしたつもりだが, その行がマッチしちゃならん理由は?
それともキャプチャの意味が分かってないのか?

401デフォルトの名無しさん2018/01/11(木) 13:56:21.29ID:/99JjIqr
>>398
あと申し訳ないけど, 正規表現を全く理解してないよね?
何でその書き換えで除外出来たと思ったのか教えてくれる?

402デフォルトの名無しさん2018/01/11(木) 17:51:18.77ID:WzsJRajU
あぁ, hostnameは固定文字列なのか
なら

^\s*hostname:[^\S\x0A\x0D]*((?:[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?\.)*[A-Za-z](?:[A-Za-z0-9\-]{0,61}[A-Za-z0-9])?)$

だけど

403デフォルトの名無しさん2018/01/16(火) 12:15:21.97ID:RA24ssqp
正規表現の書き方教えてください。

CentOS 7のサーバーにURLを要求した際、下記のような余計な文字が付きます。付くことがあります。
/ディレクトリ/ファイル名.拡張子%01
/ディレクトリ/desktop.inib%01
/ディレクトリ/desktop.inie%01

またファイル名の後に、
%EE%81%9F%E2%81%80%EE%81%97%C9%84とか
%E6%89%B8%E7%A8%B7%E4%99%BA%E5%A5%97%E3%8D%95%E4%BD%8C%E6%A1%B2%01とか
ファイル名の語尾に不特定の文字が勝手に付く場合もあります。
ディレクトリを要求したときも
ディレクトリの語尾に%E4%84%B7など(これも不特定)が付いてしまうことがあります。

これを除外するには、
正規表現でどのように書けば良いのでしょうか?

よろしくお願いします。

404デフォルトの名無しさん2018/01/16(火) 13:31:33.72ID:y9BMfGeo
https://social.technet.microsoft.com/Forums/ja-JP/5debbbcd-1def-42f8-a495-f655ebd58c4b/windows10-1709-webdav-?forum=win10itprogeneralJP

コレか?
URLエンコード文字だけなら簡単だがASCIIが入るとなると容易ではない(どこまでがファイル名か判別出来ない)

クライアント側のアップデートを待つ方が賢明な気がする

405デフォルトの名無しさん2018/01/16(火) 13:45:59.33ID:y9BMfGeo
あと忘れてたけどWebDAVならクライアントにWinSCP使うとか

4064032018/01/16(火) 14:48:31.79ID:RA24ssqp
ありがとうございます。
自分の場合「空」にはなってませんが似てますね。
便利なクライアントアプリケーション探してみます。

407デフォルトの名無しさん2018/01/16(火) 17:00:43.44ID:1yOH1J8J
pattern = /^(.*)(?!%)/

p pattern.match('abc%123')

Ruby で否定先読みを使ったら、「abc」だけ取れない。
すべての文字列にマッチしてしまう

なんでやねんw

408デフォルトの名無しさん2018/01/16(火) 17:14:43.11ID:G8V+pnDB
なんでやもなにも、.* だから全体にマッチするよ。1文字ごとにチェックするか、文字クラスを使いなさい。

409デフォルトの名無しさん2018/01/16(火) 18:31:44.93ID:1yOH1J8J
Ruby では、先頭から、% を探して、それ以降を削除する

str = '/dir/desktop.inib%01%EE%81'
pos = str.index('%')

if pos
str = str.slice(0...pos)
end

puts str

結果
/dir/desktop.inib

4104092018/01/16(火) 19:25:09.57ID:1yOH1J8J
正規表現でも、できた。
Ruby では、先頭から、% 以外の文字を探す

pattern = /^[^%]+/
str = '/dir/desktop.inib%01%EE%81'

puts pattern.match str

結果
/dir/desktop.inib

411デフォルトの名無しさん2018/01/16(火) 20:18:43.79ID:y9BMfGeo
要件には書いてないけど, .iniまでが正しいファイル名だと思うよ
その後ろのbとかeもゴミ

412デフォルトの名無しさん2018/01/16(火) 22:39:12.31ID:9E60uHWe
どういう法則性でb,eが付いたのかがわからないと、
b,eの他にも付くのがあるのか、また付かないこともあるのかもわからん
例えば、hoge.exee%01とかになるのか?

4134032018/01/17(水) 15:18:31.78ID:BVJUZk9+
皆さんありがとうございます。

>>412
それ以外にも幾つか変な文字の時もあり、
問題なく何も付かない時もあります。
決まったパターンは無いと思った方が良いですね。

すべてが1byte文字の時は

4144132018/01/17(水) 17:17:53.77ID:BVJUZk9+
最後に変な文章を残してしまいました。
すべてが1byte文字を要求するときは、
そんな変なゴミは付きにくいと書こうと思ったのですが、
まだ確証が無いので無視して結構です。

415デフォルトの名無しさん2018/02/07(水) 23:42:01.50ID:3vNjEx0B
●Regular Expressionの使用環境
桜エディタ(テキストエディタ)

●検索か置換か?
置き換え

●説明
文字数、文字種はいろいろです。ただしすべて半角(1バイト文字)です。
結果として、<>内の文字だけにできればどんな方法でも構いません

必要な情報かわかりませんが、<>の外には、<>があることはありません。
asqa>w3e<a>s98<as897kja> ←こんな感じの行はありません。
行末は必ず、>で終わり、必要な文字は必ず<>でくくられたものの中にあります。
いらない文字<必要な文字>ここに改行が入る という書式は絶対です。

●対象データ
R&^&*(!TYUIKM<slihfd>
BA%(*&%ASAS<asdlikh>
TF^(VB(*&N<a09sfyighkljn>

●希望する結果
slihfd
asdlikh
a09sfyighkljn


よろしくお願いいたします。

416デフォルトの名無しさん2018/02/08(木) 00:23:12.83ID:kN+YdVUy
^[^<>]*<([^<>]+)>$
$1

417デフォルトの名無しさん2018/02/08(木) 23:06:15.86ID:VxK8nSc/
[^<>^] サンクス

418デフォルトの名無しさん2018/02/08(木) 23:24:13.78ID:Zisu4Ynz
>>416
ありがとうございます。うまく抽出できました。

419デフォルトの名無しさん2018/02/08(木) 23:37:41.58ID:kN+YdVUy
このぐらいの正規表現なら基本だし, 覚えると正規表現の載ってるエディタでの編集が楽になるよ
とりあえずPerl互換を勉強してみるといい

420デフォルトの名無しさん2018/02/14(水) 13:35:37.03ID:2LP2x+pK
C#なんですが

[ああ]おおおおお
[いいい]こここここ
[うう][ええ]そそそそそ
ととととと[たた]



おおおおお
こここここ
そそそそそ
ととととと[たた]

にしたいんですが、どうしたらいいでしょうか。
※先頭じゃない文中の[はは]は残したい

421デフォルトの名無しさん2018/02/16(金) 13:56:45.89ID:uX7uVTrc
\[[^\]]*?\](?!$)
ところによっては\[[^\]]*?\](?!(?:\n|$))

422デフォルトの名無しさん2018/02/16(金) 14:10:38.80ID:ga78Zu+3
マルチラインモード

^(?:\[([^\[\]])\1*\])+

マッチ部分を除去

4234202018/02/16(金) 14:11:39.72ID:CWd36B/o
1行目でバッチリ
感動しました!!!

424デフォルトの名無しさん2018/02/16(金) 14:15:41.25ID:CPKH/1dQ
それ文末以外消えるけどええのん

4254212018/02/16(金) 15:30:22.93ID:mPXTHkFg
>>424
文中は消えていいんじゃない?

>>420
> [うう][ええ]そそそそそ
> そそそそそ

ってあるし
あ、

> ※先頭じゃない文中の[はは]は残したい

この[はは]はマッチしたらダメなのか
これ例の中においてくんないかなー
というか定義がよくわからんちん

^\[.*\](?!$)
ところによっては(?<=(?:^|\n))\[.*\](?!(?:\n|$))

マッチ
[ああ]おおおおお
[いいい]こここここ
[うう][ええ]そそそそそ
[たた]ななはは[まま]やや
→[たた]ななはは[まま]
[たた]ななははまま[やや]
→[たた]

アンマッチ
ととととと[たた]
ちち[はは]ぱぱまま

4264212018/02/16(金) 15:30:54.45ID:mPXTHkFg
>>425
[たた]ななはは[まま]やや
の[まま]を含めずマッチしたい([たた])ならかなり複雑になりそうでちょっといますぐは思いつかないや

それってつまり
 行頭[
 行頭から括弧が繋がり、且つ、行末]を含めない範囲
なら
[たた][なな][はは][まま][やや]
のマッチが
→[たた][なな][はは][まま]
でいいのか、それとも行そのものがアンマッチなのかよーわからんし

427デフォルトの名無しさん2018/02/16(金) 15:55:42.80ID:CPKH/1dQ
>>425
カッコ内も同じ文字が重なるように読めるしなー
まぁこういう仕様をちゃんと書けるならそもそも正規表現で困らんのだろうけど

428デフォルトの名無しさん2018/02/16(金) 15:57:06.09ID:CWd36B/o
orz...
試したら確かに

>>422 だと先頭が残りますネ

429デフォルトの名無しさん2018/02/16(金) 16:00:32.77ID:CWd36B/o
すみません

[ああ]おおおおお    → おおおおお
[あああ]おおおおお   → おおおおお
[ああ][いい]おおおおお → おおおおお
あああああ[いい]     → あああああ[いい]
あああ[いい]うう      → あああ[いい]うう

です。
先頭付近の [] は消したいけど、それ以外は残したい、って風です。

4304212018/02/16(金) 16:24:42.64ID:rLsYeXBU
>>429
[たた]ななはは[まま]やや
は?
[たた][なな][はは][まま][やや]
はどーなんの?

[あいう[かきく]たちつ]
[あいう[かきく]]たちつ
とか括弧内包の場合どーなんのとかも

あと行末も係わるんだから、例の同じ行に余計な文字列入れないで(たぶんこの件では大過ないと思うけど)

4314212018/02/16(金) 16:25:23.31ID:rLsYeXBU
>>430
内包無視するとしたら
(?<=^)(?:\[[^\[]*?\])+(?!$)
ところによって(?<=(?:^|\n))(?:\[[^\[]*?\])+(?!(?:\n|$))
かね

>>429を満たし、
[たた]ななはは[まま]やや
→[たた]
[たた][なな][はは][まま][やや]
→[たた][なな][はは][まま]
となるし

たぶん
 行頭[ および 行頭[に対応する]までマッチ
 行頭[ および 行頭[に対応する]から括弧が繋がり、且つ、行末] および 行末]に対応する[までを含めない範囲
あたりなんだろうなー
ぱっと思いつくのはちょめちょめしたダウンロードファイルのリネームをしたいようなかんじかね

432デフォルトの名無しさん2018/02/16(金) 16:26:09.97ID:dBpGhFbZ
仕様に不備があると作る方は大変だな

433デフォルトの名無しさん2018/02/16(金) 17:00:58.65ID:Q4bZpk0j
正規表現の使いどころってどんなところですかね?
普通レベルのプログラマから見ると可読性低くて保守性も悪い気がする
タグの要素を最初にバッと配列に入れやすいとか?

434デフォルトの名無しさん2018/02/16(金) 17:11:19.84ID:GgVv8IsN
>>433
可読性低くて保守性も悪いっていうのは本当にその通り
プログラミングで使うならまずは(正規表現が非常に直感的でない限りは)正規表現以外の選択肢を考えるべきで, それが可読性や保守性を上げないとなった上で正規表現が選択されるのがよい
勿論保守性や可読性を気にしないワンライナーとかであれば気にする必要はないが

あとはエディタやgrepなんかだと他に有力な選択肢がないから正規表現になる

435デフォルトの名無しさん2018/02/16(金) 17:18:48.02ID:h4N2NTdR
単純に、
(?m)^\[.*\](.*)
じゃだめなん?

436デフォルトの名無しさん2018/02/16(金) 17:23:34.33ID:GgVv8IsN
>>435
全然ダメ
入力が

[abc]def[ghi]

なら全文がマッチする(量化指定子*はgreedyだから末尾手前まで全部食う)

437デフォルトの名無しさん2018/02/16(金) 17:34:31.04ID:dBpGhFbZ
>>433
実行環境によってだけどコンパイルされて速くなったりするので
さくっと一行で書けるならメリットはあるよ
プログラム書いた方が良い場合もある
ケースバイケース

438デフォルトの名無しさん2018/02/16(金) 18:30:54.06ID:Q4bZpk0j
>>434
>>437
レスサンクスコ
今Pythonで作られているパッケージを保守してるんだけど、お約束のように最初に正規表現で抜いて後で編集してる
最初のパフォーマンスを考慮してるのかもだけど、読みにくくて一般人にはいいことないよ

439デフォルトの名無しさん2018/02/16(金) 19:13:24.69ID:M8XJLm2H
>>433
ワンライナーで可読性保守性とか気にしない
ストリームエディタで検索、ログの抽出が最たる用途じゃないか

440デフォルトの名無しさん2018/02/16(金) 20:46:56.42ID:d9VDf+sb
>>420
$# 「行頭部分にある 1 個以上の \[[^\]*\] を削除」と初見で思ったのだが、違うのか?
$# それとも C# でどうやるかわからないという話? 申し訳ないが C# は知らない。
$
$cat a_in
[ああ]おおおおお
[いいい]こここここ
[うう][ええ]そそそそそ
ととととと[たた]
[ええ]あああ[いい]うう
$perl -pe 's/^(\[[^\]]*\])+//' < a_in
おおおおお
こここここ
そそそそそ
ととととと[たた]
あああ[いい]うう
$perl -0777 -pe 's/^(\[[^\]]*\])+//gm' < a_in
おおおおお
こここここ
そそそそそ
ととととと[たた]
あああ[いい]うう
$

441デフォルトの名無しさん2018/02/16(金) 21:24:08.90ID:nYHQACKk
>>436
Non-greedy(最短)なマッチ使えばいいだけじゃね?
使えない環境なの?

442デフォルトの名無しさん2018/02/17(土) 05:30:35.08ID:xZfN9pA3
何を望んでいるのかを明確にする方が先かと……

443デフォルトの名無しさん2018/02/17(土) 11:13:15.50ID:sN1lrGX4
>>441
none-greedyじゃ先頭しかマッチしない

[abc][def]ghi

の[abc]しか除去出来ない
反復適用すればいいというならその通りではあるが

444デフォルトの名無しさん2018/02/17(土) 11:27:08.57ID:IU1gsQgu
[ab][cd][ef]ああ

これは、繰り返しが入っている。
N回削除する必要がある

[ab][cd][ef]ああ
[cd][ef]ああ
[ef]ああ
ああ

[〜] でグループ化すべき

445デフォルトの名無しさん2018/02/17(土) 12:22:01.47ID:IU1gsQgu
/^\[[^\]]*\]/ =~ "[ab][cd]ああ"
$& #=> [ab]

Ruby で書いた。
行頭が\[ で、\[ 以外の文字が、0以上続いて、\] がある

446デフォルトの名無しさん2018/02/17(土) 12:32:03.69ID:IU1gsQgu
/^\[[^\]]*\]/ =~ "[ab][cd]ああ"
$& #=> [ab]
$' #=> [cd]ああ

/^\[[^\]]*\]/ =~ $'
$& #=> [cd]
$' #=> ああ

/^\[[^\]]*\]/ =~ $'
#=> nil

Ruby で書いた。
行頭が\[ で、\[ 以外の文字が、0以上続いて、\] がある

$& はマッチした部分で、$' はマッチした部分の後ろを表すから、
マッチを繰り返していけば、出来るけど

447デフォルトの名無しさん2018/02/17(土) 12:42:57.33ID:IU1gsQgu
/^(\[[^\]]*\])+/ =~ "[ab][cd]ああ[ef]"
$& #=> [ab][cd]

やったー。Ruby で出来た

\[ があり、\[ 以外の文字が、0以上続いて、\] がある。
これをグループ化して、1回以上繰り返す

ただし、グループ外に、先頭からを指定する

448デフォルトの名無しさん2018/02/18(日) 07:04:41.40ID:4dAbe4pu
正規表現で使用される記号があるとワケわからなくなってくるから
適当な記号、例えばQなどに置き換えて試行錯誤して最後に元の記号に戻したりする

449デフォルトの名無しさん2018/02/18(日) 11:53:19.92ID:QWcmX5lk
余計なバックトラックを防ぐために
$s = qr/(?>\s*)/
ってやってパターンに埋め込むことならある。

新着レスの表示
レスを投稿する