Многострочное регулярное выражение в С#
Как сопоставить и заменить текст с помощью регулярных выражений в многострочном режиме?
Я знаю параметр RegexOptions.Multiline, но каков наилучший способ указать совпадение со всеми новыми строковыми символами на С#?
Input:
<tag name="abc">this
is
a
text</tag>
Вывод:
[tag name="abc"]this
is
a
test
[/tag]
Аах, я нашел настоящую проблему. '& Амп;' а также ';' в Regex сопоставляют текст в одной строке, в то время как в Regex необходимо выполнить экранирование в тех случаях, когда есть новые строки.
Ответы
Ответ 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);