Нужно регулярное выражение (с использованием C #), чтобы сжать все пробелы в отдельные пробелы - PullRequest
2 голосов
/ 22 декабря 2009

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

Допустим, у нас есть строка: "Hello, \ t \ t \ n \ t \ n world", (где \ t и \ n представляют вкладки и символы новой строки соответственно), тогда мне нужно, чтобы она стала "Hello, мир».

Я настолько сбит с толку регулярным выражением, что я просто спросил.

Вопросы:

  • У меня нет контроля над документом, поскольку это может быть любой документ в Интернете.

  • Я использую C #, так что, если кто-нибудь знает, как это сделать конкретно в C #, это было бы еще более круто.

  • Мне на самом деле не нужно использовать регулярное выражение (прежде чем кто-то спросит), но я подумал, что это, вероятно, оптимальный способ, так как регулярное выражение предназначено для такого рода вещей, и мой собственный суп strpos / str_replace / substr будет вероятно, не так хорошо. Для этого важна производительность, поэтому то, что я в основном ищу, это эффективный способ сделать это для любого произвольного текстового файла в Интернете (помните, я не могу предсказать размер!).

Заранее спасибо! - Хельги

Ответы [ 5 ]

11 голосов
/ 22 декабря 2009
newString = Regex.Replace(oldString, @"\s+", " ");

"\ s" является классом регулярных выражений для любого пробельного символа, а + означает "один или несколько". Он заменяет каждый случай простым пробелом.

4 голосов
/ 22 декабря 2009

Этот ответ вам может пригодиться:

Как заменить несколько пробелов одним пробелом в C #?

Адаптировать ответ, чтобы также заменить вкладки и переводы строк, относительно просто:

RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"\s+", options);     
tempo = regex.Replace(tempo, @" ");
1 голос
/ 22 декабря 2009

Как человек, сочувствующий позиции Джейми Завински в Regex, я предложу альтернативу тому, что он стоит.

Не хочу быть религиозным по этому поводу, но я бы сказал, что это быстрее, чем Regex, хотя будешь ли ты когда-нибудь обрабатывать строки достаточно долго, чтобы увидеть разницу, это другой вопрос.

    public static string CompressWhiteSpace(string value)
    {
        if (value == null) return null;

        bool inWhiteSpace = false;
        StringBuilder builder = new StringBuilder(value.Length);

        foreach (char c in value)
        {
            if (Char.IsWhiteSpace(c))
            {
                inWhiteSpace = true;
            }
            else
            {
                if (inWhiteSpace) builder.Append(' ');
                inWhiteSpace = false;
                builder.Append(c);
            }
        }
        return builder.ToString();
    }
0 голосов
/ 22 декабря 2009

На самом деле, я думаю, что метод расширения, вероятно, будет более эффективным, поскольку у вас нет конечного автомата для регулярных выражений. По сути, он становится очень специализированным сопоставителем шаблонов.

public static string Collapse( this string source )
{
    if (string.IsNullOrEmpty( source ))
    {
        return source;
    }

    StringBuilder builder = new StringBuilder();
    bool inWhiteSpace = false;
    bool sawFirst = false;
    foreach (var c in source)
    {
        if (char.IsWhiteSpace(c))
        {
            inWhiteSpace = true;
        }
        else
        {
            // only output a whitespace if followed by non-whitespace
            // except at the beginning of the string
            if (inWhiteSpace && sawFirst)
            {
                builder.Append(" ");
            }
            inWhiteSpace = false;
            sawFirst = true;
            builder.Append(c);
        }
    }
    return builder.ToString();
}
0 голосов
/ 22 декабря 2009
I would suggest you replace your chomp with
 $line =~ s/\s+$//;

which will strip off all trailing white spaces - tabs, spaces, new lines and returns as well.

Взято из: http://www.wellho.net/forum/Perl-Programming/New-line-characters-beware.html

Я знаю, что это Perl, но он должен быть достаточно полезным для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...