Многострочное регулярное выражение в C #

c# regex

30437 просмотра

2 ответа

8770 Репутация автора

Как сопоставить и заменить текст с помощью регулярных выражений в многострочном режиме?

Я знаю параметр RegexOptions.Multiline , но каков наилучший способ указать совпадение со всеми символами новой строки в C #?

Входные данные:

<tag name="abc">this
is
a
text</tag>

Выход:

[tag name="abc"]this
is
a
test
[/tag]

Ааа, я нашел актуальную проблему. '&' а также ';' в регулярном выражении совпадают текст в одной строке, в то время как то же самое необходимо экранировать в регулярном выражении, чтобы работать в тех случаях, когда есть и новые строки.

Автор: Priyank Bolia Источник Размещён: 22.11.2009 09:08

Ответы (2)


58 плюса

111514 Репутация автора

Решение

Если вы имеете в виду там есть быть символом новой строки для выражения совпадает, то \nсделает это за вас.

В противном случае, я думаю, вы могли неправильно понять флаги Multiline / Singleline . Если вы хотите, чтобы ваше выражение совпадало с несколькими строками, вы действительно хотите использовать RegexOptions.Singleline. Это означает, что он обрабатывает всю входную строку как одну строку, игнорируя при этом новые строки. Это то, что вы после ...?

пример

Regex rx = new Regex("<tag name=\"(.*?)\">(.*?)</tag>", RegexOptions.Singleline);
String output = rx.Replace("Text <tag name=\"abc\">test\nwith\nnewline</tag> more text...", "[tag name=\"$1\"]$2[/tag]");
Автор: David Hedlund Размещён: 22.11.2009 09:18

13 плюса

200339 Репутация автора

Вот регулярное выражение, чтобы соответствовать. Требуется RegexOptions.Singlelineопция, которая делает .соответствие новыми строками.

<(\w+) name="([^"]*)">(.*?)</\1>

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

[$1 name="$2"]$3[/$1]

В C # это выглядит так:

newString = Regex.Replace(oldString, 
    @"<(\w+) name=""([^""]*)"">(.*?)</\1>", 
    "[$1 name=\"$2\"]$3[/$1]", 
    RegexOptions.Singleline);
Автор: Andomar Размещён: 22.11.2009 09:24
Вопросы из категории :
32x32