Regular Expression(正規表現) Part15
■ このスレッドは過去ログ倉庫に格納されています
Regular Expressionスレです。
質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。
前スレ
Regular Expression(正規表現) Part14
https://mevius.5ch.net/test/read.cgi/tech/1489511075/
次スレは>>980宜しく
天ぷら等>>2以降 一文字だけで改行するのを
NGにするには
どうしたらいい? oniguruma6.9.6 Windows10のVS2019で64bit版だとtestc.exeが無言で終了する、32bitだと正常。
Winodws7でVS2015U3だと64bitでも32bitでも正常に動作する。
これ、以前からWindows64bitが鬼門だなあ ●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」など
よろしくお願いします >>454
書き込む前にたくさんググりましたが、ダメでした >>453
俺のところじゃ、そのままでも正常だけどなあ(win7だからか? PS ver.5.1)
その3行だけじゃあ表示も出力もされないので
$file_contents
を最後に追加した
その入力ってJane系のiniファイル(SJIS)だよね?
ファイルに出力もして確認してみた
(デフォではUnicode16になっちゃうのでout-fileでencoding指定) Windows 10、PSVersion 5.1 では、
input という名前が、ダメ! >>456-458
おっしゃる通りに変数inputの名前を別の変数名にしたら出来ました
inputは予約語みたいなものだったのね
ありがとう VSCode を使っていれば、白色になる・注意されるから、おかしいとすぐに分かる
まあ、echo などのエイリアスも、白くなるけど 質問
abc
を
a,b,c
に一発で変換する正規表現を教えてください! 461じゃないけど、知らなかった。
行頭じゃない&行末じゃない
だけ言えば字間全てに入れてくれるんだ。 ●Regular Expressionの使用環境
Perl5
●検索か置換か?
検索
●説明
文字列中のX,YY,ZZZのどれかが最初にあるまでのX,YY,ZZZを含む抽出
●対象データ
ABXCDXEFYYGH
ABYCZZZDXEFYYGH
ABCDXXGHZZ
●希望する結果
ABX
ABYCZZZ
ABCDX
お願いします >>466
($out) = ($in =~ /(.*?(?:X|YY|ZZZ))/) >>466
試してないけど、
\A.*?(X|YY|ZZZ)(?=(X|YY|ZZZ)) >>467-468
ありがとうございます。
最初のでできました。 ublacklistでPinterestをブロックする正規表現教えて下さい 行末以外の改行を任意の一文字(今回はアットマーク)に置換したいのですが可能でしょうか?
改行コードは、crもlfもcrlfも混じってるものとしてお願いしたいです。 >>471
行末の改行と行末でない改行を区別する方法がわからぬ
CSVみたいな感じ? 初学者なのでうまく伝わるか心配ですが、 固定長で末尾に改行が入っているレコードファイルを扱っています
その中で、末尾だけでなくレコード中にも改行コードが含まれるようなデータがあり、それを置換したいといった具合です。
UNIX上での話なので、Perlやsedで置換できればと思います。
よろしくお願いいたします。 sedはデフォルト行ベースなので改行コードを全部置換すればいい /[\r\n]++(?!$)/@/g
こんな感じじゃね?分からんけど 固定長ごとに出てくる改行以外の改行ってことじゃね
改行含めて80文字固定長なら80文字目や160文字目以外の37文字目や53文字目に出てくる改行 あーすまんそういうことか
それだと固定長単位に読み取って置換と出力のループかな
while read -N10 line || [ "$line" ]; do
echo "$line" | tr -d '¥r¥n'
echo
done < input.txt やりたいことは、 >>477 さんの仰る通りです。
少ない情報の中、皆さん色々とありがとうございます。
明日以降試してみます、本当にありがとうございます。 改行コードは、cr・lf・crlf の3種類あるのか?
固定長の末尾の改行の後には、何が入っている?
ヌル文字か?
例えば、100バイトの固定長で、内容が80バイトなら、
残りの20バイトには、何が入っている?
それとも、内容の80バイトの部分だけが、渡ってくるのか? CR なんとかReturn
LF LineFeed
CRLF なんとかReturnLineFeed echo -en "abcde
a\ncde
a\rcde
a\r\nde
abcdef
a\ncdef
a\nc" |
sed -re ':b;y/\r\n/@@/;/.{5}/!{N;bb};' >>471
CRLFは@2個に置換でいいんだよね?
CRLFを@1個に置換したら固定長ファイルとして
ファイル構造がおかしくなるわけだし 先日質問させていただいた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
と言った具合に、改行を消してから固定長に区切って再度改行付与という形でうまくいきました!
皆さんに教えてもらった方法とは少し異なりますが、ここで質問しなければ検索ワードすら導き出せませんでした。
皆様には感謝してもしきれません。
ありがとうございました。 []で囲まれた単語は/\[.+\]+/gで見つかるけど
文中に複数[]で囲まれた範囲があるとうまくいかない
'['以降で一番近い']'にマッチさせたいんだがどうやるか教えて 英数字7桁[0-9a-zA-Z]の文字列から(改行を経て)先程とは異なる英数字7桁の文字列まで最短一致させる正規表現を書きたいのですがわかりません…
一つ目の7桁の英数字は変数fistに入ってます
new Reg(first +"(.*\n)*?"+ここから先がわかりません
どなたかよろしくお願いしますm(_ _)m 最短一致ということは行当たりが[0-9a-zA-Z]{7}ではなく別の文字列も含んでいそうな
つまり「0123abc\ndef4567」だけではなく「あいう0123abc\ndef4567かきく」もあるとか
見本出した方がいいのではないかな >>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"だけを除外する方法がわからず困ってます。 >>494
訂正 「大文字と数字だけの7桁に設定変更させてください」って文言が抜けてました
>>493
すいません、その後の調整方法がわからないんです... 日本語がおかしくなってました
01ABC23〜01DEF23と切り抜きたいのですが、
first = "01ABC23"と入っているので、firstという変数を使いつつ[0-9A-Z]{7}から"01ABC23"だけを除外する方法がわからず困ってます。 >>496
"(?!" + first + ")[0-9A-Z]{7}" >>497
ありがとうございますm(_ _)m
↓だと最短一致しないのですが、真ん中がおかしいのでしょうか?
let reg = new RegExp(first+"(.*\n)*?"+"(?!"+first+")[0-9A-Z]{7}");
改行を含めた最短一致は([\s\S]*?)か(.*\n)*?でできていたのですが、何故か最短にならず困ってます >>498
真ん中とは+で繋げた"(.*\n)*?"の部分のことです
日本語すら怪しくてすみません >>498
自己解決しました
スレ汚しすみませんでした
答えてくださった方々ありがとうございました [正規表現の[表現力[は]ネストに]勝てない]
※Perlの拡張とかは除く 繰り返しの中で使う時、時間のかかる正規表現を避けたいが、結局試すのが一番
if x=="abc" と if x=~/^abc$/ の比較など(簡単すぎる例)
重要なシステム内で複雑な表現を使う場合テストも重要だが、
どうしてもおかしくなったら調べる式になってしまう お願いします
●Regular Expressionの使用環境
VBScript
●検索か置換か?
置換
●説明
[hoge]をブラケットごと消したい
[[hoge]]の場合は残したい
●対象データ
abc[hoge]def
ghi[[hoge]]jkl
●希望する結果
abcdef
ghi[[hoge]]jkl
^^^^^^^
否定戻り読み否定先読みで試してみたのですが、ブラケット2回の場合にマッチせずブラケット1回の場合にのみマッチさせる方法が分かりませんでした
よろしくお願いします >>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つ以上ある場合はどうするか?
すぐ思いつく方法としては、変換をループさせて、文字列に変化がなければ終わりとか (¥[hoge¥])(?!¥])|[^¥[](¥[hoge¥])
https://regex101.com/r/xhea5T/1 ([^\[])\[hoge\]([^\]])
$1$2
(^|[^\[])\[hoge\]([^\]]|$)
$1$2 >>504->>508
ありがとうございます。
やってみます。 ※間はタブです
●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
というデータに置き換えたいです。
よろしくお願いいたします。
>>514
説明の部分に誤りがありました。
●説明
(ABC|JKLHI7)を反転させたい
でなく
(ABC|JKL|HI7)を反転させたい
でした。 区切りは全角空白なのかい?
まあこんなのでどう?
(ABC|JKL|HI7)|[0-9A-Z]*→$1 >>516
ありがとうございます。
その発想まったくありませんでした。
ほしいものカッコで包んで|要らないもので置き換え
御見それしました。
ありがとうございます。 XABCXのようなものまでABCにしたいなら、末尾を+?に変えた方がいいかも 面白いなあ
逆に正規言語じゃない言語ってどんなのか気になる 文脈も先読み後読みrematch駆使すれば取れそうに思うけど、本来どこまでやっていいんだっけ 理論とか分からん 正規表現で記述可能な文字列の集合を指して正規言語という
が、その意味で使われたのかは定かでない 取り敢えずその言語がn要素の有限集合ならstr1|str2|...|strn で表現できるのでは
文字列の長さを制限して、有限の文字集合なら
すげーつまらないけど 無作為な文字列から、特定の言語に属する部分列を検出しろ、って問題にどれだけ簡潔に答えられるかってことだよな
どう計ったものか AIに正規表現を設計させたらどんなものになるのだろう ●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/ > "▼ここをアクセス.*(http.*\n)+?"
python分からんけど
"▼ここをアクセス.*?(http.*?\n)" >>529
レスサンクスですが、最後のttp://xxxx3/を拾ってきてしまいます 自己解決
"▼ここをアクセス.+?(http.+?)\n"
でいいみたい 正規表現ってパズルとしては面白いけど
https://oraclesqlpuzzle.ninja-web.net/regex/index.html
可読性に問題あるんじゃね?
もっとマシな別の表記方法が必要じゃないか? 理解の過程で可読性に問題があるのではと疑問を抱き、
別の表記法の必要性を考え、
そのあと別の表記を実際に考えるところまでやると、
正規表現考えたケン・トンプソンすげーなってなる >>532
> もっとマシな別の表記方法が必要じゃないか?
定期的にそう言うのが話題になるけどなかなかいい記法が無いんだよね
abc+
程度の簡単な奴と
^((?!aaa).)*((?=aaa)a((?!aaa).)*){3,5}((?!aaa).)*$
みたいなパット見よく分からん奴を1つの記法で簡単に見易くするのはなかなか難しい やるとしたらアスキー文字以外の文字や記号を加えてもうちょっと役割を分散させると、機能を保持しつつ見やすくはなるが、そうすると今度はラテン文字圏の人が「自分が解らないものは悪」でいかに不要かを全力で説き始めると思う。 ASCII外の文字使うと入力コストが高くなるじゃん ?とか^とか二つの意味を持つのは何とかしてほしかったよな
まあ分かるからいいんだけど 可読性を犠牲にして短く書けるのが正規表現
正規表現と同じことを可読性の高い表現で記述しようとすればなにかと長くなる
ただある一定以上複雑な正規表現は普通のプログラミング言語で書き直したほうが可読性も保守性も高い 普通のプログラミング言語で正規表現ライブラリ使ってます >>541
改行してコメント書くのは Perl の正規表現でもできたりする >>541
その例にある(?<url>.*?)みたいな名前付きキャプチャも
可読性を上げられる数少ない要素だと思うけど https://oraclesqlpuzzle.ninja-web.net/regex/regex-2-30.html
これは解読無理やろw 課題→正規表現を思いつくことはできるかも知れんが
正規表現→課題の解読は不可能に近い
課題:行ごとで、
文字列CABと
文字列ABCのみの行を検索する。
^((C(?=AB))|((?<=C)A(?=B))|((?<=CA)B)
|(A(?=BC))|((?<=A)B(?=C))|((?<=AB)C))*$ >>545
^(?:CABC?|ABC(?:AB)?)+$
でよくない? それで同じ結果になるな regex 101 でやると 正規表現には「必ず」コメントが欲しいな
できれば例も
典型例と境界例も お願いします
●Regular Expressionの使用環境
JavaScript
●検索か置換か?
置換
●説明
数字の文字列の間の1個以上の空白や改行を カンマで置換して繋げたい
33034640, 33034640, 21703214
●対象データ
33034640 30203225
21703214 ■ このスレッドは過去ログ倉庫に格納されています