Подтвердить что ты не робот

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

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

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

Input:

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

Вывод:

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

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

4b9b3361

Ответ 1

Если вы имеете в виду, что для выражения должно быть символ новой строки, тогда \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]");

Ответ 2

Здесь существует регулярное выражение. Для этого требуется опция RegexOptions.Singleline, которая делает соответствие . символами новой строки.

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

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

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

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

newString = Regex.Replace(oldString, 
    @"<(\w+) name=""([^""]*)"">(.*?)</\1>", 
    "[$1 name=\"$2\"]$3[/$1]", 
    RegexOptions.Singleline);