代码之家  ›  专栏  ›  技术社区  ›  Grandizer

正则表达式-如何查找单词和引用短语

  •  1
  • Grandizer  · 技术社区  · 16 年前

    我想说以下几点:

    Guiness Harp "Holy Moses"
    

    因此,在C或VB中,得到一组匹配的:

    Guiness
    Harp
    Holy Moses
    

    基本上,它在空格上拆分,除非空格周围有引号,否则引号之间的单词被视为单个短语。

    谢谢, 凯文

    4 回复  |  直到 16 年前
        1
  •  5
  •   Tim Pietzcker    16 年前

    如果在引用的字符串中没有任何引号(转义或双引号),则可以搜索

     "[^"]*"|\S+
    

    但是,报价将是匹配的一部分。如果需要,可以扩展regex来处理带引号的字符串中的引号。

    另一种(在这种情况下更可取)可能是使用csv解析器。

    例如(python):

    import csv
    reader = csv.reader(open('test.txt'), delimiter=' ', quotechar='"')
    for row in reader:
        print(row)
    
        2
  •  3
  •   Alan Moore Chris Ballance    16 年前

    另一种方法是:

    string s0 = @"Guiness Harp ""Holy Moses""";
    Regex r = new Regex(@"""(?<FIELD>[^""]*)""|(?<FIELD>\S+)");
    foreach (Match m in r.Matches(s0))
    {
      Console.WriteLine(m.Groups["FIELD"].Value);
    }
    

    这利用了这样一个事实,即.NET regex允许您在同一个regex中重用组名。很少有regex风格允许这样做,其中只有perl 6和.NET一样灵活。

        3
  •  0
  •   Ben S    16 年前

    正则表达式不能计数,这使得分隔符解析困难。

    为此,我将使用解析器而不是正则表达式。

        4
  •  0
  •   Jerod Houghtelling    16 年前

    如果这是一个简单的解析,那么您可能能够修剪起始和结束引号。

    string text = "Guiness Harp \"Holy Moses\"";
    string pattern = @"""[^""]*""|\S+";
    
    MatchCollection matches = Regex.Matches( text, pattern );
    foreach( Match match in matches )
    {
        string value = match.Value.Trim( '"' );
        Console.Out.WriteLine( value );
    }
    

    然而,这个实现并不是很灵活。我只会在内部工具中使用类似的东西。或者你不介意扔掉你的代码。