\ begin {enumerate}和\ end {enumerate}

时间:2015-04-22 14:14:17

标签: c# regex

所以,我有一个像

这样的字符串
\begin{enumerate}
\item My first item 
\item My second item
\end{enumerate}

需要使用正则表达式获取\begin{enumerate}\end{enumerate}之间的部分。我试图使用模式\\begin{enumerate}(.*?)\\end{enumerate},并且在线检查器中它可以工作,但在我运行代码时却没有。

任何想要帮助我的人都会很感激。

5 个答案:

答案 0 :(得分:2)

您可以使用[\s\S]*代替.*或使用modifier s,因为.不包含\n

var re = new Regex(@"\\begin{enumerate}([\s\S]*?)\\end{enumerate}");

答案 1 :(得分:2)

您可以使用此正则表达式:

(?s)\\begin{enumerate}(.*?)\\end{enumerate}

C#:

var rgx = new Regex(@"(?s)\\begin{enumerate}(.*?)\\end{enumerate}");
模式开头的

(?s)强制点匹配换行符号,并且要匹配反斜杠,您需要在逐字字符串文字中加倍,或者在普通常规字符串文字中将其加倍。 / p>

也许,您也希望强制执行不区分大小写的匹配。然后,将(?s)替换为(?si)

在Expresso中测试:

enter image description here

答案 2 :(得分:0)

我想你在这里有一个逃避问题,使用逐字字符串。此外,大括号应该逃脱。最后,您是否使用了RegexOptions.Singleline,以便允许.元字符匹配换行符?

var re = new Regex(@"\\begin\{enumerate\}(.*?)\\end\{enumerate\}", RegexOptions.Singleline);

请注意@之前的"

答案 3 :(得分:0)

看起来你可能只想在这些标签之间使用文字,所以如果是这样的情况你可以使用正面的lookbehind和lookahead,那会得到你:

\ n \ item我的第一个项目\ n \ item我的第二个项目\ end

所以试试吧。我已经为你添加了一些转义字符,所以它会起作用。

?(小于?= \ {开始枚举})*(?= \ {端枚举})

我可能会使用@符号而不是第二个答案的转义字符。我认为它看起来更容易阅读。

答案 4 :(得分:0)

你总是可以用普通的老Linq做到这一点。 E.g:

var s = "\\begin{enumerate}\n" +
        "\\item My first item\n" +
        "\\item My second item\n" +
        "\\end{enumerate}";

var allRows = s.Split('\n').ToList();

var items = allRows
        .Skip(1)
        .Take(allRows.Count - 2)
        .Select(i => i.Replace(@"\item ", String.Empty));