0


0

単語間のアンダースコアを置き換えます(reg.exp)

次の問題を解決するために正規表現が必要です(同様の問題へのリンクも歓迎します。関連するチュートリアルなど)。

"__some_words_a_b___" => "__some words a b___"
"____" => "____"
"some___words" => "some   words"

そのため、単語間のアンダースコアをスペースに置き換え、先頭と末尾のアンダースコアを維持する必要があります。 私はこれを見つけました:

^[ \t]+|[ \t]+$

そして、それはほとんどそのようなものだと思います。 jQuery、Java(stdlibs)、そしておそらくXSLTで使用します。

*追加:*文章は必ずしもアンダースコアで始まったり、アンダースコアで終わったりするわけではありません。 また、文にアンダースコアがまったく含まれていない可能性もあります。 複数の下線は複数のスペースにレンダリングする必要があります

敬具ラッセ・エスペホルト

4 Answer


3


これはJavascriptで機能するはずです。

var newString = oldString.replace(/([^_].*?)_(?=[^_|^\s])/g,"$1 ");

編集:すでに文字列に空白がある場合は、次のような追加が必要になる場合があります。

var newString = oldString.replace(/([^_|\s].*?)_(?=[^_|^s])/g,"$1 ");

私が忘れていた他のエッジケースはありますか? :)ああ、もう一つのエッジケース。 空白(改行、行末など)が続く場合は、末尾の下線を保持します。

編集:単語間のアンダースコアの数が1より大きい場合の代替ソリューション

var arrayString = oldString.replace(/^(_+)(.*?)(_+)$/g,"$1;$2;$3");
var a = arrayString.split(";");
var newString = a[0]+a[1].replace(/_/g," ")+a[2];


1


これは、正規表現と文字列置換の両方を使用する方が簡単だと思います。 Pythonでの答えは次のとおりです。jQuery、Java、またはXSLTについて十分な知識がないためです。

import re

def mangle_string(string):
    """
    Replace underscores between letters with spaces, leave leading and
    trailing underscores alone.
    """
    # Match a string that starts with zero or more underscores, followed by a
    # non-underscore, followed by zero or more of any characters, followed by
    # another non-underscore, followed by zero or more underscores, then the
    # end of the string.  If the string doesn't match that pattern, then return
    # it unmodified.
    m = re.search(r'^(_*)([^_]+.*[^_]+)(_*)$', string)
    if not m:
        return string
    # Return the concatentation of first group (the leading underscores), then
    # the middle group (everything else) with any internal underscores
    # replaced with spaces, then the last group (the trailing underscores).
    return m.group(1) + m.group(2).replace('_', ' ') + m.group(3)


0


たぶんこれはあなたが望むものです(Javascript):

var newString = oldString.replace(/(\w)_(\w)/g, "$1 $2");

単語間にアンダースコアが多数ある場合、次のようにします。

var newString = oldString.replace(/(\w)_+(\w)/g, "$1 $2");

アンダースコアと同じ数のスペースを保持する場合:

var newString = oldString.replace(/(\w)(_+)(\w)/g, function(_, l1, u, l2) {
  return l1 + (u.length == 1 ? ' ' : (new Array(u.length - 1).join(' '))) + l2;
});


0


これにはRegExを使用しません。 先頭と末尾のアンダースコアをカウントし、先頭の部分文字列(ある場合)を `middle.replace( '_'、 '')`と末尾の部分文字列(ある場合)で結合します。 先頭のアンダースコアが最後まで実行された場合、ただちに元の文字列を返します。