Regular Expression(正規表現) Part14at TECH
Regular Expression(正規表現) Part14 - 暇つぶし2ch980:デフォルトの名無しさん
19/09/12 11:08:37.62 bJPykHLq.net
\Gは照合開始位置と呼ばれる物で、マッチした箇所の後の境界にマッチしてくれるので
さっきのように(特定の文字列or前回置換しところ)の後に置換したい文字列があるときとかに便利で定番
田中哲スペシャルは\gで同じ表現をもう一回使うって奴だから違うかな

981:デフォルトの名無しさん
19/09/12 11:58:31.87 TOasMGF3.net
>950
勉強になります。
ちなみに最初の値にはアルファベットがついてないケースだと拾えなかったので


982:すが id="97B22 95D18a 93B22c 93E23b" 対応策ありますでしょうか?



983:デフォルトの名無しさん
19/09/12 12:04:38.94 xpiKRNxb.net
自分ならこの時点でスルー
\Gは文頭にもマッチするから誤爆対策を忘れずに

984:デフォルトの名無しさん
19/09/12 15:04:33.55 bJPykHLq.net
>>951
自分でも書けない訳じゃないみたいだし、魚を与えるより釣り方を教えよの精神でヒント
変更のない置換後でも\Gは引っかかるので、小文字がないidも全部マッチするようにすれば
こういうのを後出しされるとお互い二度手間だから
質問するときはパターンを網羅的に書いといた方が良いよ
あと>>952が指摘してくれたように誤爆が懸念されるので、\Gを\G(?<=.)にした方が良いかもしれない
●対象データが正確で、実際の対象もidのみが載ったリスト形式みたいなものなら要らないけど

985:デフォルトの名無しさん
19/09/12 18:04:49.29 TOasMGF3.net
>953
ヒントありがとうございます。
残りは自分でがんばってみます。

986:デフォルトの名無しさん
19/09/12 18:08:37.95 EfYu2rO4.net
文字列 "プログラマー" を "プロクライマー" に書き換える正規表現を教えて下さい

987:デフォルトの名無しさん
19/09/12 21:50:17.55 Jdu1U3XN.net
そこにソースがあるから登るんだ。

988:デフォルトの名無しさん
19/09/12 22:19:07.70 cqw0/uFd.net
正規表現の使い方じゃなく作り方、バックトラックなど理論から解説している書籍やそれに準ずるサイトなど知っていたらご教示ください。
こうやればこうなるよ、こういうときはこうすればいいんだよ的な学習では身に付かなくて…

989:デフォルトの名無しさん
19/09/12 22:56:30.12 Yy9Clfy1.net
自分が参考にしたのはここだったかな
URLリンク(fussy.web.fc2.com)
実装の仕方がある程度分かれば鬼車の作者さんのブログ(rubyの一件以前の記事)も参考になると思う

990:デフォルトの名無しさん
19/09/12 23:14:33.93 Uy9QyXie.net
ありがとうございます!
rubyの一件って何ですか?(何て検索したらいいですか?)

991:デフォルトの名無しさん
19/09/12 23:43:24.49 Yy9Clfy1.net
Rubyの作者さんと何かあったようで嫌気が差したのかそれ以後ブログで正規表現のことを
取り上げる頻度がめっきり減っちゃったんですよ

992:デフォルトの名無しさん
19/09/13 08:32:54.25 sQZEDK+j.net
>>960
ありがとうございます!
なるほど、残念ですね…

993:デフォルトの名無しさん
19/09/13 10:47:34.78 wKEqF87n.net
955
URLリンク(codezine.jp)
URLリンク(tociyuki.hatenablog.jp)
URLリンク(hellocode.jugem.jp)

994:デフォルトの名無しさん
19/09/13 11:54:40.09 X5DxpBbM.net
正規表現はどの言語でも共通で使えますか?それともちょっと違ったりしますか?

995:デフォルトの名無しさん
19/09/13 12:02:22.73 KuW4wLhZ.net
ちょっと違ったりします

996:デフォルトの名無しさん
19/09/13 13:25:46.31 8XwQqyT8.net
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"

997:963
19/09/13 13:43:10.59 8XwQqyT8.net
>>965
修正
>ただし、同じ行に、id="~" が複数あると、バグる!
大丈夫だった。正常に動く

998:デフォルトの名無しさん
19/09/16 02:45:59.31 dK4dr8mE.net
JSで


999: 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"] になってしまい、数字のあとの余計な半角スペースをあとで取り除かなければならなくなるのがなんか嫌で…



1000:デフォルトの名無しさん
19/09/16 02:59:29.74 /xGIA7r1.net
正規表現を使えないなら文字列操作でやればいいだけ
正規表現を使いこなせてない人が使うとバグの温床になるからお勧めしない

1001:デフォルトの名無しさん
19/09/16 07:18:26.85 m2l8x1P1.net
>>967
.split(' ', 2)

1002:デフォルトの名無しさん
19/09/16 12:07:55.69 oN5KVYJd.net
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"]]

1003:デフォルトの名無しさん
19/09/16 15:25:40.41 YU5GpdCi.net
JSでは、
["30", "8 year old humans"]
ではなく
["30","8"]
となる
limitは、分割結果の制限であり、見つかった要素の数をそこまでで打ち切る

1004:968
19/09/16 15:36:25.96 oN5KVYJd.net
>971
えー!!

1005:デフォルトの名無しさん
19/09/16 15:52:31.08 YU5GpdCi.net
>>972
URLリンク(developer.mozilla.org)

1006:デフォルトの名無しさん
19/09/16 16:04:28.98 2suJbq8i.net
matchじゃなくてsplitで
str.split(/(?<=^\d+) /)

array = str.split(" ");
array[0] + array.slice(1).join(" ")
とかじゃない?

1007:デフォルトの名無しさん
19/09/16 16:06:13.84 2suJbq8i.net
間違えた
下の最後こうか
[array[0], array.slice(1).join(" ")]

1008:デフォルトの名無しさん
19/09/16 16:24:50.88 VWND3fAL.net
素直に
"30 8 years old".match(/^(\d+) (.*)$/).slice(1)
じゃいかんの?

1009:デフォルトの名無しさん
19/09/16 16:28:11.45 53ZoYsUm.net
正規表現逆引きcgiとかないの?
雑に日本語で書き込んだらAIが判断して正規表現を返してくれる
そんなの

1010:デフォルトの名無しさん
19/09/16 17:07:19.10 YU5GpdCi.net
>>976
マッチしない場合でもエラーにならないよう保険かけとく方がよいのでは?
(str.match(/~/)||[]).slice(1)

1011:デフォルトの名無しさん
19/09/16 17:20:26.44 oN5KVYJd.net
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' ]

1012:デフォルトの名無しさん
19/09/16 17:34:55.93 hRvCpxCQ.net
>>978
そう言うのは質問者に適宜やってもらえば良い
絶対マッチするという前提かもしれないし

1013:デフォルトの名無しさん
19/09/16 17:40:28.59 enU8we0d.net
>>971
知らなかった

1014:デフォルトの名無しさん
19/09/16 18:09:34.33 enU8we0d.net
const str = '30 8 year old humans'
(([first, ...rest]) => [first, rest.join(' ')])(str.split(' '))
//=> ["30", "8 year old humans"]
あ、正規表現がねぇw

1015:デフォルトの名無しさん
19/09/16 20:46:14.05 RGmahsTZ.net
.split(/ (.*)/,2)

1016:デフォルトの名無しさん
19/09/16 22:28:40.71 enU8we0d.net
次スレ立てたんだけど、
Regular Expression(正規表現) Part15
スレリンク(tech板)
テンプレ貼ってたら>>3 がNGワードとやらで貼れません。
というわけであとよろしく。

1017:デフォルトの名無しさん
19/09/17 10:37:10.53 aFTX7+W5.net
>>984
>>3
のテンプレにある
【 初心者 】 正規表現 【 入門 】 ←閉鎖
http://funcchan.blog16.fc2.com/
5ch では、fc2 は、宣伝禁止かも!
これは、半角で書き込めないので、全角に変換した
このURL を削除すれば?
MANGO 板で、NG ワードを調べられる

1018:977
19/09/17 12:02:24.99 aFTX7+W5.net
>>979
を修正した
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' ] ]

1019:デフォルトの名無しさん
19/09/17 16:12:25.16 sjKTVv5w.net
amazonもダメみたいだね、本の紹介しようとしたら弾かれた

1020:983
19/09/17 17:07:52.35 aFTX7+W5.net
Amazon も、半角で書けないだろ
一番恐ろしいのは、はてなブログ!
書き込み禁止画面が出ずに、いきなり吸い込まれて、アクセス禁止にされる!
同様に、twitter の長いURL も、吸い込まれるものがあるらしい!
5ch で、しつこく宣伝する香具師をはめるために、いきなりのアク禁!
MANGO 板に書き込んで、何がNG ワードが、地道に判定していくしかない

1021:デフォルトの名無しさん
19/09/17 17:46:48.25 +bGUkqkJ.net
test
URLリンク(www.ama%7Aon.co.jp)

1022:デフォルトの名無しさん
19/09/17 17:53:38.97 Xou3E6HC.net
はてブのURL、5ちゃんに書けないのか。気づいてなかったわ。

1023:デフォルトの名無しさん
19/09/17 17:56:58.73 +bGUkqkJ.net
test
URLリンク(d.h%61tena.ne.jp)

1024:デフォルトの名無しさん
19/10/02 17:34:34.60 dOlpIXop.net
U . M . E

1025:デフォルトの名無しさん
19/10/12 20:41:17.72 VAjNOt6S.net
以下を正規表現で行うにはどうしたらよいでしょうか。
-----元データ------------------
<aaa bbb
ccc
ddd>
<eee>
ffff ggg
<hhh
iiii>
-----------------------------
-----欲しいデータ----------------
aaa bbb ccc ddd
eee
ffff ggg
hhh iiii
------------------------------

1026:
19/10/12 20:46:20 osgjxuFW.net
改行無視のオプション+<>の間を取得して改行を空白に変更でどう?

1027:デフォルトの名無しさん
19/10/12 22:51:54.37 7TGqmTiW.net
>>993
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のは一旦改行削除して、<..>の前後に改行追加して、空行削除して、行頭の空白を削除してる

1028:デフォルトの名無しさん
19/10/13 01:09:33.88 Gu1oNPJo.net
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", " " ) }
>>995
>$1.gsub("\n", "")
"" は、" "(半角空白)の間違いだろ

1029:
19/10/13 01:37:59 5y3mzviq.net
>>996
コピペしたら元データに行末スペースが入ってたからそうしたんだけどこれは5chの仕様なのかな?
行末スペースがないなら空文字じゃなく半角スペースに置換だね

1030:
19/10/13 03:33:31 Gu1oNPJo.net
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

1031:デフォルトの名無しさん
19/10/13 07:48:23.30 0NSyRtEU.net
>>994-996
皆さんありがとうございました。
後方参照をさらに置換すれば良かったんですね。そんな方法があったとは!!
助かりました。

1032:
19/10/13 22:01:19 5y3mzviq.net
>>998
エディタのコマンドで対応できることだから
わざわざスクリプト書くのはちょっとオーバーキルかな

1033:
19/10/13 22:05:59 w1EMiXuT.net
VScodeの正規表現検索、置換はjavascriptだろうか?

1034:
19/10/13 22:42:48 5y3mzviq.net
>>1001
ripgrep

1035:1001
Over 1000 Thread .net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 942日 20時間 38分 13秒

1036:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch