X



Regular Expression(正規表現) Part15
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2019/09/16(月) 22:25:11.87ID:enU8we0d
Regular Expressionスレです。

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

前スレ
Regular Expression(正規表現) Part14
https://mevius.5ch.net/test/read.cgi/tech/1489511075/


次スレは>>980宜しく
天ぷら等>>2以降
0452デフォルトの名無しさん
垢版 |
2020/11/06(金) 11:29:16.13ID:xeNq05z2
oniguruma6.9.6 Windows10のVS2019で64bit版だとtestc.exeが無言で終了する、32bitだと正常。
Winodws7でVS2015U3だと64bitでも32bitでも正常に動作する。

これ、以前からWindows64bitが鬼門だなあ
0453デフォルトの名無しさん
垢版 |
2020/11/10(火) 19:15:09.53ID:aUuUQimA
●PowerShell

●置換

●テキストファイル内の「WrtCookie=」で始まる行の値を「WrtCookie=」に置換する

●「WrtCookie=」で始まる行

現在のコマンド

$input = '^(WrtCookie=).+$'

$replacement = '$1'

$file_contents = $(Get-Content $filepath) -replace $input, $replacement

結果

テキストファイル内の全行が出鱈目な文字列に置換されます
たとえば「$1[$1W$1I$1N$1D$1O$1W$1]$1」など

よろしくお願いします
0457デフォルトの名無しさん
垢版 |
2020/11/11(水) 02:35:05.41ID:wa6LgG/F
>>453
俺のところじゃ、そのままでも正常だけどなあ(win7だからか? PS ver.5.1)
その3行だけじゃあ表示も出力もされないので
$file_contents
を最後に追加した
その入力ってJane系のiniファイル(SJIS)だよね?
ファイルに出力もして確認してみた
(デフォではUnicode16になっちゃうのでout-fileでencoding指定)
0459デフォルトの名無しさん
垢版 |
2020/11/11(水) 19:56:31.19ID:tbqNNnPd
>>456-458
おっしゃる通りに変数inputの名前を別の変数名にしたら出来ました
inputは予約語みたいなものだったのね
ありがとう
0460デフォルトの名無しさん
垢版 |
2020/11/11(水) 22:49:04.53ID:yU9bVv8n
VSCode を使っていれば、白色になる・注意されるから、おかしいとすぐに分かる

まあ、echo などのエイリアスも、白くなるけど
0461デフォルトの名無しさん
垢版 |
2020/12/12(土) 00:58:58.79ID:c3naq2mv
質問
abc

a,b,c
に一発で変換する正規表現を教えてください!
0463デフォルトの名無しさん
垢版 |
2020/12/12(土) 09:13:39.74ID:weC8GZqi
461じゃないけど、知らなかった。

 行頭じゃない&行末じゃない

だけ言えば字間全てに入れてくれるんだ。
0465デフォルトの名無しさん
垢版 |
2020/12/12(土) 10:10:46.24ID:c3naq2mv
>>462
ありがとうございます!
0466デフォルトの名無しさん
垢版 |
2020/12/15(火) 08:04:57.95ID:RAwP5vtJ
●Regular Expressionの使用環境
Perl5
●検索か置換か?
検索
●説明
文字列中のX,YY,ZZZのどれかが最初にあるまでのX,YY,ZZZを含む抽出
●対象データ
ABXCDXEFYYGH
ABYCZZZDXEFYYGH
ABCDXXGHZZ
●希望する結果
ABX
ABYCZZZ
ABCDX

お願いします
0471デフォルトの名無しさん
垢版 |
2021/01/11(月) 15:03:41.29ID:A5mldiyH
行末以外の改行を任意の一文字(今回はアットマーク)に置換したいのですが可能でしょうか?
改行コードは、crもlfもcrlfも混じってるものとしてお願いしたいです。
0472デフォルトの名無しさん
垢版 |
2021/01/11(月) 15:10:21.63ID:WVZOdukT
>>471
行末の改行と行末でない改行を区別する方法がわからぬ
CSVみたいな感じ?
0473デフォルトの名無しさん
垢版 |
2021/01/11(月) 15:31:25.19ID:zqhSwaSS
初学者なのでうまく伝わるか心配ですが、 固定長で末尾に改行が入っているレコードファイルを扱っています
その中で、末尾だけでなくレコード中にも改行コードが含まれるようなデータがあり、それを置換したいといった具合です。

UNIX上での話なので、Perlやsedで置換できればと思います。
よろしくお願いいたします。
0477デフォルトの名無しさん
垢版 |
2021/01/11(月) 16:20:44.13ID:A2M5zvGV
固定長ごとに出てくる改行以外の改行ってことじゃね
改行含めて80文字固定長なら80文字目や160文字目以外の37文字目や53文字目に出てくる改行
0478デフォルトの名無しさん
垢版 |
2021/01/11(月) 17:26:33.52ID:8i1ZTkbL
あーすまんそういうことか
それだと固定長単位に読み取って置換と出力のループかな

while read -N10 line || [ "$line" ]; do
echo "$line" | tr -d '¥r¥n'
echo
done < input.txt
0479デフォルトの名無しさん
垢版 |
2021/01/11(月) 17:59:11.32ID:Op1S7Ai1
やりたいことは、 >>477 さんの仰る通りです。
少ない情報の中、皆さん色々とありがとうございます。

明日以降試してみます、本当にありがとうございます。
0480デフォルトの名無しさん
垢版 |
2021/01/11(月) 18:31:58.04ID:RwOnRvzI
改行コードは、cr・lf・crlf の3種類あるのか?

固定長の末尾の改行の後には、何が入っている?
ヌル文字か?

例えば、100バイトの固定長で、内容が80バイトなら、
残りの20バイトには、何が入っている?

それとも、内容の80バイトの部分だけが、渡ってくるのか?
0483デフォルトの名無しさん
垢版 |
2021/01/11(月) 21:38:18.11ID:6WXFekQD
>>471
CRLFは@2個に置換でいいんだよね?
CRLFを@1個に置換したら固定長ファイルとして
ファイル構造がおかしくなるわけだし
0484デフォルトの名無しさん
垢版 |
2021/01/12(火) 17:48:10.93ID:fqpU06Zc
>>481 carriage
0486デフォルトの名無しさん
垢版 |
2021/01/14(木) 20:19:20.00ID:eDcISF88
うざw
0487デフォルトの名無しさん
垢版 |
2021/01/15(金) 04:04:23.16ID:VxNLJyBo
先日質問させていただいた471です。
色々と試した結果、
perl -pe ‘s/¥r/@/g $INFILE | perl -pe ‘s/¥n/@/g > $TMPFILE

cat $TMPFILE | perl -e ‘while(read(STDIN, $tmp , 100)){print $tmp, “¥n”}’ > $OUTFILE

と言った具合に、改行を消してから固定長に区切って再度改行付与という形でうまくいきました!

皆さんに教えてもらった方法とは少し異なりますが、ここで質問しなければ検索ワードすら導き出せませんでした。
皆様には感謝してもしきれません。
ありがとうございました。
0488デフォルトの名無しさん
垢版 |
2021/02/02(火) 23:52:09.94ID:LuWw9dWt
[]で囲まれた単語は/\[.+\]+/gで見つかるけど
文中に複数[]で囲まれた範囲があるとうまくいかない
'['以降で一番近い']'にマッチさせたいんだがどうやるか教えて
0491デフォルトの名無しさん
垢版 |
2021/02/03(水) 18:02:08.71ID:CJ1qfEuB
英数字7桁[0-9a-zA-Z]の文字列から(改行を経て)先程とは異なる英数字7桁の文字列まで最短一致させる正規表現を書きたいのですがわかりません…

一つ目の7桁の英数字は変数fistに入ってます
new Reg(first +"(.*\n)*?"+ここから先がわかりません

どなたかよろしくお願いしますm(_ _)m
0492デフォルトの名無しさん
垢版 |
2021/02/03(水) 18:33:27.05ID:sadlF3mb
最短一致ということは行当たりが[0-9a-zA-Z]{7}ではなく別の文字列も含んでいそうな
つまり「0123abc\ndef4567」だけではなく「あいう0123abc\ndef4567かきく」もあるとか

見本出した方がいいのではないかな
0494デフォルトの名無しさん
垢版 |
2021/02/03(水) 19:08:15.83ID:CJ1qfEuB
>>492
すいません、簡単にするために設定をちょっと変えさせてください。
[0-9A-Z]
大雑把で大丈夫なんですが
あいうえお01ABC23あいうえお01abc23あいうえお01abc23  ←ここの01ABC23から
あいうえお01abc23あいうえお01ABC23あいうえお01abc23
あいうえお01abc23あいうえお01ABC23あいうえお01abc23
あいうえお01abc23あいうえお01DEF23あいうえお01abc23  ←ここの01DEF23まで切り抜きたい
あいうえお01abc23あいうえお01ABC23あいうえお01abc23
あいうえお01abc23あいうえお01HIJ23あいうえお01abc23

first = "01ABC23" が入ってるので、正規表現の最後を01DEF23にしたいのですが
[0-9A-Z]{7}から"01ABC23"だけを除外する方法がわからず困ってます。
0495デフォルトの名無しさん
垢版 |
2021/02/03(水) 19:12:17.69ID:CJ1qfEuB
>>494
訂正 「大文字と数字だけの7桁に設定変更させてください」って文言が抜けてました

>>493
すいません、その後の調整方法がわからないんです...
0496デフォルトの名無しさん
垢版 |
2021/02/03(水) 19:16:51.84ID:CJ1qfEuB
日本語がおかしくなってました

01ABC23〜01DEF23と切り抜きたいのですが、
first = "01ABC23"と入っているので、firstという変数を使いつつ[0-9A-Z]{7}から"01ABC23"だけを除外する方法がわからず困ってます。
0497デフォルトの名無しさん
垢版 |
2021/02/03(水) 19:28:51.74ID:oLpXy7xv
>>496
"(?!" + first + ")[0-9A-Z]{7}"
0498デフォルトの名無しさん
垢版 |
2021/02/03(水) 19:41:14.94ID:CJ1qfEuB
>>497
ありがとうございますm(_ _)m
↓だと最短一致しないのですが、真ん中がおかしいのでしょうか?

let reg = new RegExp(first+"(.*\n)*?"+"(?!"+first+")[0-9A-Z]{7}");


改行を含めた最短一致は([\s\S]*?)か(.*\n)*?でできていたのですが、何故か最短にならず困ってます
0500デフォルトの名無しさん
垢版 |
2021/02/03(水) 20:21:28.10ID:CJ1qfEuB
>>498
自己解決しました
スレ汚しすみませんでした
答えてくださった方々ありがとうございました
0502デフォルトの名無しさん
垢版 |
2021/02/04(木) 15:31:37.02ID:7s9fZWEo
繰り返しの中で使う時、時間のかかる正規表現を避けたいが、結局試すのが一番
if x=="abc" と if x=~/^abc$/ の比較など(簡単すぎる例)

重要なシステム内で複雑な表現を使う場合テストも重要だが、
どうしてもおかしくなったら調べる式になってしまう
0503デフォルトの名無しさん
垢版 |
2021/02/06(土) 14:47:08.00ID:s4jA/y9i
お願いします

●Regular Expressionの使用環境
VBScript

●検索か置換か?
置換

●説明
[hoge]をブラケットごと消したい
[[hoge]]の場合は残したい

●対象データ
abc[hoge]def
ghi[[hoge]]jkl

●希望する結果
abcdef
ghi[[hoge]]jkl
^^^^^^^

否定戻り読み否定先読みで試してみたのですが、ブラケット2回の場合にマッチせずブラケット1回の場合にのみマッチさせる方法が分かりませんでした
よろしくお願いします
0505デフォルトの名無しさん
垢版 |
2021/02/06(土) 16:56:52.18ID:EC31O1b+
>>503
VBSには否定戻り読みは無いので、工夫するしかない
すぐには思いつかないけどもっといい方法もあるかもしれないのでググってみては?
愚直には、一つの方法として以下の場合に分ける
1) [hoge]で始まる場合
2) 文字列があって [ 以外で終わって [hoge] がある場合
3) 文字列があって [ で終わってる場合、[hoge] があって ] が続かないこと

pattern : "^(?:\[hoge]|(.*?\[)\[hoge\](?!\])|(.*?[^\[])\[hoge\])(.*)$"
replace : "$1$2$3"

abcdef → abcdef
[hoge]def → def
[[abc]]def → [[hoge]]def
abc[hoge]def → abcdef
abc[[hoge]]def → abc[[hoge]]def
abc[[hoge]def → abc[def
abc[hoge]]def → abc]def

下2つの場合が無ければもう少し簡易にできる
では[hoge]が2つ以上ある場合はどうするか?
すぐ思いつく方法としては、変換をループさせて、文字列に変化がなければ終わりとか
0509デフォルトの名無しさん
垢版 |
2021/02/06(土) 17:44:51.10ID:s4jA/y9i
>>504->>508
ありがとうございます。
やってみます。
0514デフォルトの名無しさん
垢版 |
2021/02/16(火) 18:09:22.76ID:YYQsROlp
※間はタブです
●Regular Expressionの使用環境
サクラエディタ

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

●説明
(ABC|JKLHI7)を反転させたい

※(ABC|JKLHI7)→空に置き換え
ABC    DEF     123
FGH    JKL     956
GBN    MJK    HI7

↓こうなります

    DEF     123
FGH         956
GBN    MJK

(ABC|JKLHI7)を反転させて
ABC    
    JKL     
        HI7

というデータに置き換えたいです。
よろしくお願いいたします。


    
0515デフォルトの名無しさん
垢版 |
2021/02/16(火) 18:10:03.36ID:YYQsROlp
>>514
説明の部分に誤りがありました。
●説明
(ABC|JKLHI7)を反転させたい

でなく
(ABC|JKL|HI7)を反転させたい

でした。
0517デフォルトの名無しさん
垢版 |
2021/02/16(火) 19:29:55.89ID:YYQsROlp
>>516
ありがとうございます。
その発想まったくありませんでした。

ほしいものカッコで包んで|要らないもので置き換え
御見それしました。

ありがとうございます。
0523デフォルトの名無しさん
垢版 |
2021/02/19(金) 20:03:11.77ID:gWMDVcMR
文脈も先読み後読みrematch駆使すれば取れそうに思うけど、本来どこまでやっていいんだっけ 理論とか分からん
0524デフォルトの名無しさん
垢版 |
2021/02/19(金) 20:05:33.21ID:Wnqd+KEH
正規表現で記述可能な文字列の集合を指して正規言語という

が、その意味で使われたのかは定かでない
0525デフォルトの名無しさん
垢版 |
2021/02/19(金) 20:15:12.89ID:gWMDVcMR
取り敢えずその言語がn要素の有限集合ならstr1|str2|...|strn で表現できるのでは
文字列の長さを制限して、有限の文字集合なら
すげーつまらないけど
0526デフォルトの名無しさん
垢版 |
2021/02/19(金) 20:33:20.22ID:gWMDVcMR
無作為な文字列から、特定の言語に属する部分列を検出しろ、って問題にどれだけ簡潔に答えられるかってことだよな
どう計ったものか
0528デフォルトの名無しさん
垢版 |
2021/03/03(水) 06:22:13.41ID:7UFtTk12
●Regular Expressionの使用環境
python 3.x

●検索か置換か?
検索

●説明
ここをアクセスの次に出てくるURL(ttp://xxxx2/)をとってきたい
pattern = re.search("▼ここをアクセス.*(http.*\n)+?",a_text,flags=re.DOTALL)
複数行検索してるが最後のURLをとってきてしまう


●対象データ

URL1です
ttp://xxxx2/



 □       【▼ここをアクセス】
ttp://xxxx2/

URL2です
ttp://xxxx3/

●希望する結果
ttp://xxxx2/
0529デフォルトの名無しさん
垢版 |
2021/03/03(水) 06:44:56.40ID:lklpa5qm
> "▼ここをアクセス.*(http.*\n)+?"
python分からんけど
"▼ここをアクセス.*?(http.*?\n)"
0534デフォルトの名無しさん
垢版 |
2021/03/07(日) 16:17:46.75ID:TNmQ0Vam
理解の過程で可読性に問題があるのではと疑問を抱き、
別の表記法の必要性を考え、
そのあと別の表記を実際に考えるところまでやると、
正規表現考えたケン・トンプソンすげーなってなる
0535デフォルトの名無しさん
垢版 |
2021/03/07(日) 17:26:15.98ID:FZPehcc/
>>532
> もっとマシな別の表記方法が必要じゃないか?
定期的にそう言うのが話題になるけどなかなかいい記法が無いんだよね
abc+
程度の簡単な奴と
^((?!aaa).)*((?=aaa)a((?!aaa).)*){3,5}((?!aaa).)*$
みたいなパット見よく分からん奴を1つの記法で簡単に見易くするのはなかなか難しい
0536デフォルトの名無しさん
垢版 |
2021/03/07(日) 17:53:05.78ID:AM/Ef9W/
やるとしたらアスキー文字以外の文字や記号を加えてもうちょっと役割を分散させると、機能を保持しつつ見やすくはなるが、そうすると今度はラテン文字圏の人が「自分が解らないものは悪」でいかに不要かを全力で説き始めると思う。
0538デフォルトの名無しさん
垢版 |
2021/03/07(日) 18:04:15.76ID:4bEjyVwB
?とか^とか二つの意味を持つのは何とかしてほしかったよな
まあ分かるからいいんだけど
0539デフォルトの名無しさん
垢版 |
2021/03/07(日) 20:25:01.40ID:RWgRWesX
可読性を犠牲にして短く書けるのが正規表現
正規表現と同じことを可読性の高い表現で記述しようとすればなにかと長くなる
ただある一定以上複雑な正規表現は普通のプログラミング言語で書き直したほうが可読性も保守性も高い
0544デフォルトの名無しさん
垢版 |
2021/03/07(日) 21:55:32.23ID:RWgRWesX
>>541
その例にある(?<url>.*?)みたいな名前付きキャプチャも
可読性を上げられる数少ない要素だと思うけど
■ このスレッドは過去ログ倉庫に格納されています

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