2016-11-17 55 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();