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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

2回答

763閲覧

perlによるネストした正規表現

tog

総合スコア26

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2019/05/21 00:56

レコード各行に対してダブルクォーテーション(")で囲まれた文字列についてはパイプ(|)をカンマ(,)に置換するという処理をおこないたいと考えています。
ダブルクォーテーション(")で囲まれた文字列に含まれるパイプ(|)の数は固定でない為、グループ化を利用してもうまくいかないと考えており、正規表現をネストさせるしかないのかと思っているのですがそのような事は可能でしょうか?

sample
AAA|"BB|CC"|DDD|"EE|FF|GG"|HHH
↓(perlによる処理後)
AAA|"BB,CC"|DDD|"EE,FF,GG"|HHH

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

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

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

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

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

guest

回答2

0

ネストさせずに処理する方法を考えてみました。

perl

1#!/usr/bin/perl -w 2use strict; 3 4my $a='AAA|"BB|CC"|DDD|"EE|FF|GG"|HHH'; 5 6my @x = split(/(".*?")/, $a); 7my @y = map {/^"/ and s/\|/,/g; $_} @x; 8print join("", @y), "\n"; 9

投稿2019/05/21 03:56

KojiDoi

総合スコア13727

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

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

tog

2019/05/21 06:10

ありがとうございます。 リスト化してからmapを作用させて最後にjoinするんですね。 とてもわかりやすいですし、応用が効きそうです。
guest

0

ベストアンサー

複雑な正規表現やperlには暗いので自分なりに調べた範囲でのコメントです。

正規表現をネストさせるしかない

そんな気がします。少なくとも分かり易く書くにはその方針がよいと思います。

正規表現のリファレンスを調べてみるとs///eという置換パターンにより「マッチさせた部分に対して任意の加工ができる」ようでしたのでそれでトライしてみました。

記述の良し悪しはさておき、とりあえずこんなふうに書けるようです。

t.perl

perl

1$x = 'a|"b|c|d"|e|"f|g"'; 2print 'in : ' . $x . "\n"; 3# 訂正: 下記は冗長すぎました。ダブルクォートもグループ中に含めた方が単純に書けますね 4# $x =~ s/"([^"]*)"/'"' . $1 =~ s!\|!,!gr . '"'/ge; 5# さらに訂正: 最短一致を用いた方がよいと思いました。 6# $x =~ s/("[^"]*")/$1 =~ s!\|!,!gr/ge; 7$x =~ s/(".*?")/$1 =~ s!\|!,!gr/ge; 8print 'out: ' . $x . "\n";

sh

1$ perl t.perl 2in : a|"b|c|d"|e|"f|g" 3out: a|"b,c,d"|e|"f,g"

投稿2019/05/21 02:38

編集2019/05/21 03:37
KSwordOfHaste

総合スコア18404

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

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

tog

2019/05/21 03:05

ありがとうございます。 想像していたよりもシンプルに書けるのですね。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問