Regex.Replace генерирует пробел в окне вывода LinqPad из ниоткуда - PullRequest
0 голосов
/ 02 января 2019

Я пишу скрипт, который поможет мне конвертировать набор текстовых файлов в уценку. Одна из вещей, которые выполняет этот скрипт, - это применение курсива и форматирования заголовков к заголовкам рисунков, которые представляют собой строки, начинающиеся с пробелов и слова «Рисунок». Это мой код:

text = Regex.Replace(text, "^ +(Figure.*)$", "##### _$1_", RegexOptions.Multiline);

Если я использую это для преобразования этого текста:

A Foobar is cool stuff, as we can see in Figure 1.1:

  Figure 1.1  This is a Foobar

More text here.

... тогда я получаю это:

A Foobar is cool stuff, as we can see in Figure 1.1:

##### _Figure 1.1  This is a Foobar _

More text here.

... это то, что я хочу, за исключением одной маленькой детали: пробел добавлен прямо перед последним символом подчеркивания в окне вывода LinqPad. Я не знаю, откуда это взялось, поскольку его нет в исходном тексте (есть последовательность CRLF сразу после «Foobar»). Что не так с моим регулярным выражением или с тем, как я его использую?

РЕДАКТИРОВАТЬ: Полная исполняемая программа, демонстрирующая проблему:

using System;
using System.Text.RegularExpressions;

class Test
{
    static void Main()
    {
        string text =
@"A Foobar is cool stuff, as we can see in Figure 1.1:

  Figure 1.1  This is a Foobar

More text here.";

        text = Regex.Replace(text, "^ +(Figure.*)$", "##### _$1_", RegexOptions.Multiline);
        Console.WriteLine(text);
    }
}

1 Ответ

0 голосов
/ 02 января 2019

Шаблон . в регулярном выражении .NET соответствует символу CR. Он находится в конце текста, занесенного в группу 1, поэтому у вас есть разрыв строки перед последним _ в вашей замене. Согласно вашим отзывам, окно вывода LinqPad заменяет символ CR на «пробел».

Замените . на [^\r\n], который будет соответствовать любому символу, кроме символов CR и LF, и удалите $, так как больше нет необходимости указывать конец строки (опция RegexOptions.Multiline по-прежнему необходима, поэтому так как ^ может соответствовать началу строки):

using System;
using System.Text.RegularExpressions;

public class Test
{
    public static void Main()
    {
        string text = "A Foobar is cool stuff, as we can see in Figure 1.1:\r\n\r\n  Figure 1.1  This is a Foobar\r\n\r\nMore text here.";
        text = Regex.Replace(text, "^ +(Figure[^\r\n]*)", "##### _$1_", RegexOptions.Multiline);
        Console.WriteLine(text);
    }
}

См. Демонстрационную версию C # .

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