所以,我有一个像
这样的字符串\begin{enumerate}
\item My first item
\item My second item
\end{enumerate}
需要使用正则表达式获取\begin{enumerate}
和\end{enumerate}
之间的部分。我试图使用模式\\begin{enumerate}(.*?)\\end{enumerate}
,并且在线检查器中它可以工作,但在我运行代码时却没有。
任何想要帮助我的人都会很感激。
答案 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中测试:
答案 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));