正規表現の置換について質問です。

例えば、
「-480円-2.2%」
のような文字列があったとします。
前半はカンマ区切りにもなり得る数値と円
後半は小数点以下があり得るパーセンテージです。
それを、
"-480","-2.2"
という2つの文字列をダブルクオーテーションで囲ったカンマ区切りのデータに置き換えるために次のような正規表現を考えました。
パターン「(-*)(\d{1,3})(((,)\d{3})*)(円)(-*)(\d+)(.)(\d*)%」
置換文字列「"\1\2\4\","\7\8\9\10"」
上記の置換文字列は、後方参照の考え方で、パターンないのカッコの中の番号を引用しているのですが、
くせ者が、最後の\10というもので、これは10番目のパターンとして解釈して欲しいのですが、
「\1」と「0」という組み合わせと解釈されてしまい、以下のように置換されてしまいます。
"-480","-2.-0"
10番目以降のパターンを表現するには10という数字は使えないのでしょうか?
10番目以降のパターンを表現する方法がお分かりの方がいましたらご教示下さい。

また、単純に目的を達成する正規表現とその置換文字列のセットでも構いません。
その場合は、注釈を入れて説明して頂けると助かります。

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2019/03/20 00:25:55
  • 終了:2019/03/20 22:10:57

ベストアンサー

id:Z1000S No.1

空腹おやじ回答回数37ベストアンサー獲得回数252019/03/20 13:37:24

ポイント900pt

パターン
(-?\d{1,3}(,\d{3})*)円(-?\d+(.\d+)?)%
置換
"\1","\2"
ではどうでしょうか?

だだし、上記は秀丸の場合なので、お使いの環境によっては
\2ではなく、\3とか別の値になるかもしれません。

id:tyusuke88

ありがとうございます。こちらの環境では、
"\1","\3"
でうまく置換できました。
この場合、\1は最初の大まかなカッコ(-?\d{1,3}(,\d{3})*)を表わし、\3は(-?\d+(.\d+)?)を表わすという事でしょうか?
入れ子になったカッコの、(,\d{3})や、(.\d+)はどのように表現されるのでしょうか?
ちなみに、Notepad++を使用しています。
カッコの中のサブカッコがどのように表現されているかご教示頂けましたら、ベストアンサーとして終了させて頂きます。

2019/03/20 18:41:55
id:Z1000S

使う環境によって変わってくる場合があるので、使用している環境のヘルプを調べるのが確実かと思います。
また、実行環境があるようですので、ご自分で置換の部分を
\1
\2
\3
\4
と変えてみてどうなるのか試すことも出来るかと思います。

汎用的なものであれば
no title
正規表現チェッカー PHP: preg_match() / JavaScript: match()
とか、いろいろと便利なサイトがあるので試してみてはいかがでしょうか?

2019/03/20 21:34:17

その他の回答(1件)

id:Z1000S No.1

空腹おやじ回答回数37ベストアンサー獲得回数252019/03/20 13:37:24ここでベストアンサー

ポイント900pt

パターン
(-?\d{1,3}(,\d{3})*)円(-?\d+(.\d+)?)%
置換
"\1","\2"
ではどうでしょうか?

だだし、上記は秀丸の場合なので、お使いの環境によっては
\2ではなく、\3とか別の値になるかもしれません。

id:tyusuke88

ありがとうございます。こちらの環境では、
"\1","\3"
でうまく置換できました。
この場合、\1は最初の大まかなカッコ(-?\d{1,3}(,\d{3})*)を表わし、\3は(-?\d+(.\d+)?)を表わすという事でしょうか?
入れ子になったカッコの、(,\d{3})や、(.\d+)はどのように表現されるのでしょうか?
ちなみに、Notepad++を使用しています。
カッコの中のサブカッコがどのように表現されているかご教示頂けましたら、ベストアンサーとして終了させて頂きます。

2019/03/20 18:41:55
id:Z1000S

使う環境によって変わってくる場合があるので、使用している環境のヘルプを調べるのが確実かと思います。
また、実行環境があるようですので、ご自分で置換の部分を
\1
\2
\3
\4
と変えてみてどうなるのか試すことも出来るかと思います。

汎用的なものであれば
no title
正規表現チェッカー PHP: preg_match() / JavaScript: match()
とか、いろいろと便利なサイトがあるので試してみてはいかがでしょうか?

2019/03/20 21:34:17
id:a-kuma3 No.2

a-kuma3回答回数4770ベストアンサー獲得回数20492019/03/20 15:17:24

ポイント100pt

10番目以降のパターンを表現するには10という数字は使えないのでしょうか?

これは、環境というか、言語やライブラリに依存します。
一口に「正規表現」と言っても、微妙に違っています。

置換する文字の方にバックスラッシュを使っているということは、sed ですか?
いや、グループの指定にバックスラッシュが入らないから Perl ですしょうか。

Perl だったら、置換文字の方を "\10" ではなく "$10" と書くと、10番目のグループに当たる文字列に置換されます。
javascript も $ の後は 100 まで行けるのですが、古いIEだと微妙です。

id:tyusuke88

こちらでは、Notepad++を使用しています。

2019/03/20 18:42:38
  • id:outofjis
    ([\,-9]+)円([\,-9]+)%ではいかんか?
    スラッシュも引っかかっちまうけど。
  • id:Z1000S
    .の前の\が抜けていますね。
    (-?\d{1,3}(,\d{3})*)円(-?\d+(\.\d+)?)%
    としないと意図しない結果になる場合がありえますので、訂正させて頂きたいと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません