我想创建一个模式来匹配字符串中的第一个非加倍引号。应该忽略所有不是单引号的东西。
我已经尝试了很多年,似乎没有任何地方。这可能很简单。
目前为止的最佳尝试:(?<=[^"])(?<found>")[^"]|(?<=[^"])(?<found>")$|(?<=["]+)(?<found>")$
示例:
答案 0 :(得分:1)
这是(*SKIP)(*FAIL)
机制的完美示例:
([\'\"]).*?\1(*SKIP)(*FAIL)|[\'\"]
赞美这种优雅:你匹配字符串中两个相同引号之间的所有内容(零次或多次),让正则表达式引擎失败。见a demo on regex101.com.
(注意:没有必要转义字符类中的引号,只需为SO解释器完成。)
.NET
不支持此功能,但您可以解决这个问题:
using System;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
class Program {
static void Main() {
string s1 = @"as""""sa""""dadas""dfgdfg - match (last quote)";
var myRegex = new Regex(@"(['""]).*?\1|(['""])");
var group1Caps = new StringCollection();
Match matchResult = myRegex.Match(s1);
// put Group 1 captures in a list
while (matchResult.Success) {
if (matchResult.Groups[1].Value != "") {
group1Caps.Add(matchResult.Groups[1].Value);
}
matchResult = matchResult.NextMatch();
}
Console.WriteLine("*** Is there a Match? ***");
if(group1Caps.Count>0) Console.WriteLine("Yes");
else Console.WriteLine("No");
}
}
见demo on ideone.com 基本的想法是 捕获 你真正想要的东西到第一组,然后检查它是否包含任何东西。有关该主题的更多信息,请查看精彩的RexEgg site
答案 1 :(得分:0)
在sed中提供一个演示者,将所有第一个不成对引用的行开头剪切,包括在内;显示正确的一个被识别出来:
bash-3.1$ sed -En 's/^[^"]*("[^"]*"[^"]*)*[^"]*"//;T;p'
E.g。最有趣的样本案例7的输出,如“”sa“”dadas“dfgdfg:
dfgdfg