2015-04-22 75 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));