除符号外的所有字符和新行的正则表达式

时间:2014-12-02 07:20:33

标签: c# regex parsing

我的任务是在C#中编写一个将字符串转换为html代码的解析器。现在,我正在使用正则表达式解析字符串,所以,我的代码看起来像:

Regex regex = new Regex(@"\n?\[s=(.*)?\](?:\n?(.*)?\n?)?\[\/s\]\n?");
MatchCollection matches = regex.Matches(CurrentPage.FAQ);

foreach (Match match in matches)
{
    <div class="slider">
        <div class="n">@match.Groups[1].Value</div>
        <div class="tt">@Html.Raw(match.Groups[2].Value.Replace("\r", "<br />").Replace(" ", "&nbsp;"))</div>
    </div>
}   

问题是正则表达式\n?\[s=(.*)?\](?:\n?(.*)?\n?)?\[\/s\]\n?仅在字符串看起来有效时才有效。

[s=hello]This is demo text![/s]

如果在文本中出现了新行,则无法验证。例如

[s=hello]
     This is demo list
          1. Hello world!
          2. List item
[/s]

我尝试将我的表达式修改为\n?\[s=(.*)?\](?:\n?((.|\n)*)?\n?)?\[\/s\]\n?但该字符串可以包含一个或多个[s]项,因此它将其验证为一个

[s=hello](BEGINING TO VALIDATE FROM HERE)This is demo text![/s]
[s=hello]
     This is demo list
          1. Hello world!
          2. List item
(TO HERE)[/s]

这就是为什么它将它作为项目验证。

1 个答案:

答案 0 :(得分:1)

使用如下所示的否定前瞻,不要忘记启用DOTALL (?s)修饰符在正则表达式中制作点以匹配偶数换行符。

@"(?s)\[s=([^\[\]]*)\]((?:(?!\[\/s]).)*)\[\/s]"

DEMO