正規表現について。


下記(1)を(2)に変換する正規表現を教えてください。
※下記ではA~Eとなっていますが、F、G...といくら増えても使える汎用的なものをお願いします。

(1)A/B/C/D/E
(2)【A】「B」「C」「D」【E】

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/06/27 07:15:59
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:think49 No.2

回答回数7ベストアンサー獲得回数2

ポイント70pt

繰り返し表現の中で変数にキャプチャしたいってことですよね、多分…。

下記コードでは置換処理は一回ですが split 処理が走るので完全に希望通りではないかもしれません。

// JavaScript のサンプル
'A/B/C/D/E'.replace(/^([^\x2F]+)\x2F((?:[^\x2F]*\x2F)*)([^\x2F]*)/, function (subString, p1, p2, p3) {
  return '\u3010' + p1 + '\u3011\u300C' + p2.slice(0, -1).split(/\x2F/).join('\u300D\u300C') + '\u300D\u3010' + p3 + '\u3011';
});

問題は下記のように書いたときに「B, C, D」を別個にキャプチャできる正規表現エンジンが必要なことです。

/(?:([^\x2F])\x2F)*/

少なくとも ECMAScript5 にはありません。

Perl拡張や鬼車拡張にはあるのかもしれませんが、一般的な正規表現エンジンとしてはないと思います。

その他の回答2件)

id:TransFreeBSD No.1

回答回数668ベストアンサー獲得回数268

正規表現(せいきひょうげん、regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つである。

とwikipediaにあります。変換は正規表現の範疇ではないですが、たとえばperlだと

http://codepad.org/jXba27cw

$src="A/B/C/D/E";
$src =~ s|/|」「|g;
$src =~ s/^([^」]*)/$1/;
$src =~ s/([^「]*)$/$1/;
print $src;

てな感じでいかがでしょう?

id:tetlis

ご回答ありがとうございます。

ただ、1回の置換で変換する表現を求めています。

2011/06/26 18:04:04
id:think49 No.2

回答回数7ベストアンサー獲得回数2ここでベストアンサー

ポイント70pt

繰り返し表現の中で変数にキャプチャしたいってことですよね、多分…。

下記コードでは置換処理は一回ですが split 処理が走るので完全に希望通りではないかもしれません。

// JavaScript のサンプル
'A/B/C/D/E'.replace(/^([^\x2F]+)\x2F((?:[^\x2F]*\x2F)*)([^\x2F]*)/, function (subString, p1, p2, p3) {
  return '\u3010' + p1 + '\u3011\u300C' + p2.slice(0, -1).split(/\x2F/).join('\u300D\u300C') + '\u300D\u3010' + p3 + '\u3011';
});

問題は下記のように書いたときに「B, C, D」を別個にキャプチャできる正規表現エンジンが必要なことです。

/(?:([^\x2F])\x2F)*/

少なくとも ECMAScript5 にはありません。

Perl拡張や鬼車拡張にはあるのかもしれませんが、一般的な正規表現エンジンとしてはないと思います。

id:a-kuma3 No.3

回答回数4973ベストアンサー獲得回数2154

ポイント30pt

正規表現だけの範囲だと無理っぽい、というのは先の回答と同じです。

java だと、こんな感じになるかなあ、と。

        String re = "([^/]+)(/?)";
        String s = "下記/(1)/を/(2)/に/変換する/正規表現を/教えて/ください";

        java.util.regex.Matcher m = java.util.regex.Pattern.compile(re).matcher(s);

        StringBuffer sb = new StringBuffer();

        boolean first = true;
        while (m.find()) {
            if (first) {
                m.appendReplacement(sb, "【" + m.group(1) + "】");
                first = false;
            } else {
                if ("/".equals(m.group(2))) {
                    m.appendReplacement(sb, "「" + m.group(1) + "」");
                } else {
                    m.appendReplacement(sb, "【" + m.group(1) + "】");
                }
            }
        }
        m.appendTail(sb);

        System.out.println(sb);

# もう少し、きれいにできそうな感じはするんだけど...

コメントはまだありません

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

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

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

回答リクエストを送信したユーザーはいません