2016-11-17 198 views
4

我試圖用正則表達式搜索一個字符串。這裏的字符串看起來像在文本展示臺什麼:RegexOptions.Multiline似乎忽略 n

0 -12.67 Td 
/Helv 14 Tf 
(Source: ABC/XYZA) Tj 
0 -15.624 Td 
(Job Source No.: GRQX ID 27299) Tj 
0 -15.624 Td 

當我通過懸停在上面查看值:

0 -12.67 Td\n/Helv 14 Tf\n(Source: ABC/XYZA) Tj\n0 -15.624 Td\n(Job Source No.: GRQX ID 27299) Tj\n0 -15.624 Td 

我使用Regex.Matches()有以下模式和RegexOptions.Multiline

^(?<=[(]).+(?=[)]) 

這將返回沒有匹配。當我省略了插入符號,像這樣:

(?<=[(]).+(?=[)]) 

然後Regex.Matches()回報兩場比賽:

Source: ABC/XYZA 
Job Source No.: GRQX ID 27299 

我如何可以匹配在一行的第一個字符?

+2

那是因爲你有一個錨,然後看看背後。如果你把錨放在'(?<=^[(])。+(?= [)])'後面,它會起作用。 – juharr

回答

3

正則表達式中的逆序檢查當前位置左側的字符,因此在您的模式中^(?<=[(])需要(位於^(行的開頭)之前。在行的開始之前,沒有任何內容(在字符串的開始處),或者存在換行符字符。因此,它永遠不會匹配任何字符串。

實際上,您不需要任何替代方法就可以獲得所需的子字符串。使用下面的正則表達式與RegexOptions.Multiline選項:

^\(([^()]+)\) 

^將確保比賽出現在一個字符串的開頭,([^()]+)將捕捉到第1個的一個或多個字符超過(),其他然後)會得到匹配。

regex demo,你所需要的結果是在組1

enter image description here

在C#中,使用下面的代碼:

var res = Regex.Matches(str, @"^\(([^()]+)\)", RegexOptions.Multiline) 
    .Cast<Match>() 
    .Select(m => m.Groups[1].Value) 
    .ToList();