2015-04-22 51 views
2

所以,我有一个像正则表达式开始{}枚举和 {结束}枚举

\begin{enumerate} 
\item My first item 
\item My second item 
\end{enumerate} 

字符串,并需要使用正则表达式得到\begin{enumerate}\end{enumerate}之间的部分。我试图使用\\begin{enumerate}(.*?)\\end{enumerate}这种模式,并且在线检查程序中它可以工作,但不是在运行我的代码时。

任何人在帮助我的心中,我将不胜感激。

回答

2

你可以使用这个表达式:

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

C#:

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

模式开始时的强制一个点匹配换行符号,并匹配反斜杠,您需要在逐字符串字面值中将其加倍,或者将其四倍于普通常规字符串文字。

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

测试中快报:

enter image description here

+0

这就像一个魅力,非常感谢你。我只是无法绕过正则表达式... – Namirna

+0

很高兴提供帮助,但不要放弃正则表达式,请找一些时间并阅读下面的内容:http://www.regular-expressions.info/ 。我认为该网站以全面和清晰的方式解释了很多正则表达式的奥秘。 –

0

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

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

注意@只是"之前。

2

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

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

如果你在两个头脑,为什么你的答案是不被接受的一个:1)'\ B'是'首先还是在word'最后一个字符,2)'\ e'是'逃生'。 –

+0

谢谢..我正在更多地关注'[\ s \ S]':P ..我会在接下来的回答中记住它..:) –

+0

是的,现在它工作。 –

0

看样子想你可能只想使用文本在这些标记之间,如果多数民众赞成的情况下,你可以使用正回顾后发和前瞻,并且将得到你:

\ n \项目我的第一项\ n \项目我的第二个项目\结束

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

(?< = \ {开始枚举})。*?(?= \ {结束枚举})

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

0

你可以随时用普通的旧Linq做到这一点。例如:

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));