下記(1)を(2)に変換する正規表現を教えてください。
※下記ではA~Eとなっていますが、F、G...といくら増えても使える汎用的なものをお願いします。
(1)A/B/C/D/E
(2)【A】「B」「C」「D」【E】
繰り返し表現の中で変数にキャプチャしたいってことですよね、多分…。
下記コードでは置換処理は一回ですが 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拡張や鬼車拡張にはあるのかもしれませんが、一般的な正規表現エンジンとしてはないと思います。
正規表現(せいきひょうげん、regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つである。
とwikipediaにあります。変換は正規表現の範疇ではないですが、たとえばperlだと
$src="A/B/C/D/E"; $src =~ s|/|」「|g; $src =~ s/^([^」]*)」/【$1】/; $src =~ s/「([^「]*)$/【$1】/; print $src;
てな感じでいかがでしょう?
繰り返し表現の中で変数にキャプチャしたいってことですよね、多分…。
下記コードでは置換処理は一回ですが 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拡張や鬼車拡張にはあるのかもしれませんが、一般的な正規表現エンジンとしてはないと思います。
正規表現だけの範囲だと無理っぽい、というのは先の回答と同じです。
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);
# もう少し、きれいにできそうな感じはするんだけど...
ご回答ありがとうございます。
ただ、1回の置換で変換する表現を求めています。