регулярное выражение, чтобы удалить все после определенного символа (комментарий) - PullRequest
1 голос
/ 30 октября 2011

У меня есть регулярное выражение, которое я использую, чтобы удалить все после определенного символа, точки с запятой.

        var regex = new Regex(@";(.*)", RegexOptions.Singleline);
        tb.Text = regex.Replace(tb.Text, "");

Кажется, работает нормально, но иногда удаляет весь текст текстового поля. Например, весь этот код удален:

;fgkdfgdfgd
;dfgdfkghdfgdf
;sdgfsdfsdfsdf
;dfgdfgdfg

#dont remove this          ;fgdfgdfg

"#dont remove this" должен остаться неизменным, потому что это не после точки с запятой, но это не так? Что-то не так с моим регулярным выражением?

Идея состоит в том, чтобы удалить или обрезать все комментарии из файла.

Ответы [ 5 ]

5 голосов
/ 30 октября 2011

try (ОБНОВЛЕНИЕ после комментария):

tb.Lines = (
    from l in tb.Lines 
    let x = l.IndexOf (';') 
    select (x >= 0 ? l.SubString (0, x) : l)
).ToArray();

Это должно работать быстрее, чем Regex ...

2 голосов
/ 30 октября 2011

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

2 голосов
/ 30 октября 2011

Это потому, что вы используете RegexOptions.Singleline и, следовательно, . соответствует новым строкам.

1 голос
/ 30 октября 2011

Проблема очень проста - вы неправильно поняли RegexOptions.SingleLine.

SingleLine говорит шаблону, что . может соответствовать разрывам строк. Подробнее о RegexOptions здесь .

Ваш текущий результат - одно совпадение (от первого ; до конца всей строки).

Выследует просто удалить RegexOptions.SingleLine, и ваш шаблон будет соответствовать каждому комментарию до конца строки.

0 голосов
/ 30 октября 2011

Вы можете легко сделать это, используя это:

tb.Text = tb.Text.Substring(0, tb.Text.IndexOf(';'));

Это должно работать быстрее, чем при использовании Regex ...

Если ваше текстовое поле многострочное, вы можете использовать:

s = TextBox1.Text;
string ret = "";
s.Split('\n').ToList().ForEach(p=>ret += p.Substring(0, p.IndexOf(';')) + "\n");
TextBox1.Text = ret;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...