Заменить подчеркивание между словами (reg.exp) - PullRequest
0 голосов
/ 08 марта 2010

Мне нужно регулярное выражение для решения следующей проблемы (также приветствуются ссылки на похожие проблемы, соответствующие учебные пособия и т.

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

Таким образом, я хочу, чтобы подчеркивания между словами были заменены пробелом и продолжали ставить начальные и конечные подчеркивания. Я нашел это:

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

и я думаю, это будет нечто подобное. Я буду использовать его в jQuery, Java (stdlibs) и, возможно, XSLT.

Дополнительно: Предложения не обязательно начинаются с подчеркивания или заканчиваются подчеркиванием. Также возможно, что предложение не содержит подчеркивания вообще. Несколько символов подчеркивания должны отображаться в нескольких пробелах

С наилучшими пожеланиями Лассе Эспехолт

Ответы [ 4 ]

3 голосов
/ 08 марта 2010

Это должно работать в Javascript:

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

Редактировать: если в строке уже есть пробелы, возможно, потребуется что-то вроде этого:

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

Какие-нибудь другие крайние случаи я забыл? :) О да, еще один крайний случай. Оставьте подчеркивание конца, если за ним следует пробел (например, перевод строки, конец строки и т. Д.).

edit: альтернативное решение, если число подчеркиваний между словами> 1

var arrayString = oldString.replace(/^(_+)(.*?)(_+)$/g,"$1;$2;$3");
var a = arrayString.split(";");
var newString = a[0]+a[1].replace(/_/g," ")+a[2];
1 голос
/ 08 марта 2010

Я думаю, что было бы проще использовать как регулярное выражение, так и подстановку строк.Вот ответ в 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 голосов
/ 08 марта 2010

Я бы не использовал RegEx для этого. Я бы посчитал начальное и конечное подчеркивание, а затем соединил ведущую подстроку (если есть) с middle.replace('_',' ') и конечную подстроку (если есть). Если начальные подчеркивания заканчиваются до конца, сразу же возвращайте исходную строку.

0 голосов
/ 08 марта 2010

Может быть, это то, что вы хотите (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;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...