人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

正規表現について。

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

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

●質問者: tetlis
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:「C」 正規表現
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● TransFreeBSD
●0ポイント

正規表現(せいきひょうげん、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;

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

◎質問者からの返答

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

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


2 ● think49
●70ポイント ベストアンサー

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

下記コードでは置換処理は一回ですが 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拡張や鬼車拡張にはあるのかもしれませんが、一般的な正規表現エンジンとしてはないと思います。


3 ● a-kuma3
●30ポイント

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

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);

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ