我有这个正则表达式:(?:\[|\G(?!^))('[^']+?')\s*,?\s*(?=[^\]]*?\])
,它仅匹配方括号(如数组)中引号之间的内容:['Foo','Bar'] =>返回'Foo' 'Bar'
。
问题在于,在这种情况下,单引号是一个特殊字符,因为正则表达式将其用作定界符,但有时我需要将值内的单引号作为转义字符传递:{{1 }}。
我正在尝试通过使不捕获的['F'oo', 'B'ar']
组适应正则表达式来做类似'F \'oo'的事情,但是它不起作用,我尝试了许多不同的方法。
此非捕获组正则表达式来自此answer,在此他成功使用反斜杠转义了特殊字符。
我将C#与.NET Core一起使用。
全文如下:(?:(?=(\\?))\1.)
如何解决?
答案 0 :(得分:3)
有一个similar question already用于获取引号的转义字符。我更喜欢this answer。
将捕获部分('[^']+?')
更改为('[^\\']*(?:\\.[^\\']*)*')
。您可以进一步删除懒惰的量词,这在已经使用否定类的情况下不会有多大区别。
可能有必要另外进行escaping of the backslash。
答案 1 :(得分:2)
答案 2 :(得分:0)
我的猜测是,
(?<=\[|,)\s*'(.*?)'\s*(?=\]|,)
或类似的表达式可能行得通。
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"(?<=\[|,)\s*'(.*?)'\s*(?=\]|,)";
string input = @"['Foo', 'Bar']
['F'oo', 'B'ar']
['F'oo', 'B'ar','Foo', 'Bar']";
RegexOptions options = RegexOptions.Multiline;
foreach (Match m in Regex.Matches(input, pattern, options))
{
Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
}
}
}
jex.im可视化正则表达式: