代码之家  ›  专栏  ›  技术社区  ›  Lasse Espeholt

在单词之间替换下划线(reg.exp)

  •  0
  • Lasse Espeholt  · 技术社区  · 14 年前

    我需要一个正则表达式来解决以下问题(还需要类似问题的链接,相关教程等):

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

    所以我想用空格替换单词之间的下划线,并保留前导和尾随下划线。我发现这个:

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

    我想大部分都是这样的。我将在jQuery、Java(STDLIB)和XSLT中使用它。

    添加: 句子不一定以下划线开头或以下划线结尾。一个句子也可能根本不包含下划线。多个下划线应呈现为多个空格

    顺祝商祺! 拉斯埃斯佩霍尔特

    4 回复  |  直到 14 年前
        1
  •  3
  •   ghoppe    14 年前

    这应该在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];
    
        2
  •  1
  •   Zach Hirsch    14 年前

    我认为使用regex和字符串替换会更简单。这里有一个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)
    
        3
  •  0
  •   Pointy    14 年前

    也许这就是你想要的(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;
    });
    
        4
  •  0
  •   L. Cornelius Dol    14 年前

    我不会用瑞格来做这个。我将计算前导和尾随下划线,然后将前导子字符串(如果有)与 middle.replace('_',' ') 以及尾随子串(如果有)。如果前导下划线指向末尾,则立即返回原始字符串。