RegexOptions.Multiline似乎忽略\ n

时间:2016-11-17 17:24:10

标签: c# regex

我尝试使用正则表达式搜索字符串。这是Text Visualizer中字符串的样子:

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

如何匹配一行中的第一个字符?

1 个答案:

答案 0 :(得分:3)

正则表达式模式中的后视图检查当前位置左侧的字符,因此在您的模式中^(?<=[(])要求(位于^之前({1}}线)。在行开始之前,没有任何内容(在字符串的开头),或者有换行符。因此,它永远不会匹配任何字符串。

实际上,您不需要任何外观来获取所需的子串。将以下正则表达式与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();