第一个非加倍报价模式

时间:2017-03-22 17:12:45

标签: .net regex

我想创建一个模式来匹配字符串中的第一个非加倍引号。应该忽略所有不是单引号的东西。

我已经尝试了很多年,似乎没有任何地方。这可能很简单。

目前为止的最佳尝试:(?<=[^"])(?<found>")[^"]|(?<=[^"])(?<found>")$|(?<=["]+)(?<found>")$

示例:

  1. “ -​​ 匹配
  2. “” - 不匹配
  3. “”“ - 匹配(最后一个引用)
  4. “ssdfsdfsfs” - 匹配(第一个引用)
  5. as“sadadas” - 匹配(第一个引用)
  6. as“”sadadas“ - 匹配(最后引用)
  7. as“”sa“”dadas“dfgdfg - match(last quote)

2 个答案:

答案 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