質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.36%
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1038閲覧

行頭に字下げがある文章中の空白文字(半角、全角)を削除したい

wkbiz

総合スコア154

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/11/11 09:51

よろしくお願いします。

事例はニュース記事ですが、下記のように2行目以降に字下げがあり、且つその文中に空白が含まれている場合

text

1東京都は11日、新型コロナウイルスの新たな感染者31人、死者1人が確認されたと発表した。 2 現在入院している 重 症 患 者は9人。 3 1週間平均の新 規 感 染者数は 25. 6人。 4 11日時点 で対前週比 1 32.6%。 5 都内の累計の患者数は38万1900人となった。 6 7こうしたい⇒ 8東京都は11日、新型コロナウイルスの新たな感染者31人、死者1人が確認されたと発表した。 9 現在入院している重症患者は9人。 10 1週間平均の新規感染者数は25.6人。 11 11日時点で対前週比132.6%。 12 都内の累計の患者数は38万1900人となった。

行頭の字下げ部分はタブでなく「半角空白」で書かれています。

このような場合、文章中の半角文字を削除したい場合の正規表現の書き方が上手くいかず悩んでいます。

下記の正規表現を当てると字下げ部分の半角空白はターゲットされるものの文章中の空白には反応しません。

^(!?\s+)

イメージ説明

このほかにも (!? +).*( ).$ などでマッチングできるか試してみたのですが
思うようなものができず。
ご助言いただけると幸いです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2021/11/11 10:35

abc def ghi jkl を字下げしてない1行目はそのまま、字下げしている2行目は ghijkl にする? 字下げ分は残す?
wkbiz

2021/11/11 10:44

お問い合わせありがとうございます。 例示に示している通り、字下げの空白は残します。
ikadzuchi

2021/11/13 17:07

本題ではないのでこちらで指摘しておきますが、 「(!?…)」は「(?!…)」の間違いではないかと思います。
guest

回答2

0

ベストアンサー

エディタでは一回では難しいのでは?

sedで:
sed '/^[  ]/s/([^  ])[  ]+/\1/g'

Rubyで:
ruby -ple '$_.gsub!(/([^  ])[  ]+/,"\1") if /^[  ]/'

エディタでやるなら、お使いのエディタで可能かどうかわかりませんが、
^([  ].*?[^  ])[  ]+$1(または仕様により\1)に置換するのを、置換が製鋼する限り何度も実行すれば出来るかと思います。

#追記
もし、そのエディタが「不定長の後読み」が出来るのなら、一発で出来ます。
(?<=^[  ].*?[^  ])[  ]+を空文字列に置換。
PowerShellなら、「不定長の後読み」が出来るので、
$(get-content "infile") -replace "(?<=^[  ].*?[^  ])[  ]+","" > "outfile"

投稿2021/11/11 15:31

編集2021/11/11 15:59
otn

総合スコア85810

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wkbiz

2021/11/12 06:07 編集

otnさん、いつもありがとうございます。 VSCodeで、ご教授のパターン式で出来ました。 サクラエディタは、invalid pattern in lock-behindのエラーとなりできませんでした。 正規表現ライブラリ鬼雲(bregonig.dll)は、不定長の後読みに対応してないみたいです。 「不定長の後読み」は不勉強でした。 用途はプログラムに落とし込みたかったというより、日ごろのドキュメント整理に使うことでした。 なのでテキストエディタでやりたかったのでshellは考えていませんでした。
otn

2021/11/12 06:17

> VSCodeで、ご教授のパターン式で出来ました。 おお、そうですか。MS系ライブラリは出来るということでしょうね。
guest

0

これでどうでしょうか?置換後には$1を指定で。

([^\s]+)[  ]+

投稿2021/11/11 10:47

surface_0

総合スコア497

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wkbiz

2021/11/12 06:03

ご回答ありがとうございます。 字下げ部分はマークされませんでしたが、残念ながら文章の頭から最後の空白文字までがマークされてしまいました。VSCode、サクラエディタ共に。
surface_0

2021/11/12 06:15

マーク範囲自体はそのようになります。 置換文字を`$1`にすることで、結果的に空白文字だけが消える意図です。 ちなみにサクラエディタで実行してうまくいきました。
wkbiz

2021/11/12 06:46

失礼しました。 サクラエディタの置換モーダルの「該当行マーク」で選択されてしまったので誤解してしまいました。 surfaceさんが仰る通り、$1置換後、期待通りの動作を確認できました。
surface_0

2021/11/12 07:09

それならば問題無いので良かったですm(__)m
wkbiz

2021/11/12 07:57

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問