您是说仅当引用的字符串不包含换行符时才匹配?如果是这样,您不必做任何特别的事情,因为默认情况下点与换行符不匹配。除了开引号后的+(这对我来说没有意义)之外,您的正则表达式应该可以正常工作。但我同意 Jay 的建议,即您使用逐字字符串文字来编写正则表达式:
Regex sRegex = new Regex(@"(?<string>"".*""|'.*')");
你做需要注意的是贪婪。例如,如果在同一行上有两个字符串声明,像这样:
var s1 = "foo", s2 = "bar";
...正则表达式将找到一个匹配项"foo", s2 = "bar",您希望它分别匹配"foo" 和"bar"。为避免这种情况,您可以使用非贪婪量词:
Regex sRegex = new Regex(@"(?<string>"".*?""|'.*?')");
如果您确实想要匹配带有换行符的字符串,您可以使用Singleline 选项,它会修改点的行为,使其能够匹配换行符。
Regex sRegex = new Regex(@"(?<string>"".*?""|'.*?')",
RegexOptions.Singleline);
...或者您可以使用 inline 修饰符:
Regex sRegex = new Regex(@"(?s)(?<string>"".*?""|'.*?')");
请注意,当您在单行模式下使用点时,使用非贪婪量词尤为重要,因为潜在匹配不再局限于单行。但这里有另一种更有效且更可预测的替代方案:
Regex sRegex = new Regex(@"(?<string>""[^""]*""|'[^']*')");
没有必要用这个正则表达式指定单行模式,因为你没有使用点元字符。否定字符类[^"] 匹配除引号以外的任何字符——包括换行符。
最后,我想谈谈Multiline 选项,因为它似乎有很多困惑。人们倾向于认为,只要目标文本由多行组成(即,只要它包含换行符),就必须使用它。这是一个自然的假设,但事实并非如此。
所有多行模式所做的只是改变开始和结束锚点^ 和$ 的行为。通常它们只匹配整个字符串的开头和结尾,但如果您打开多行模式,它们也会匹配字符串中逻辑行的开头和结尾。例如,给定一个这样声明的字符串:
"fee fie\nfoe fum"
如果您在默认模式下搜索正则表达式 ^\w+,您将得到一个匹配项:fee。但是如果你切换到多行模式,你会得到两个:fee 和foe。同样,\w+$ 在默认模式下仅匹配 fum,但在多行模式下匹配 fie 和 fum。无论您处于何种模式:单行、多行或默认模式,您始终可以匹配文字 \n。
人们还倾向于认为单行和多行是相互排斥的,但事实并非如此。我什至看到有人说单行是默认模式。也不是真的。 Singleline 改变点的行为(.),Multiline 改变锚点的行为(^ 和 $);就是这样。