带有四个撇号的模式字符串

时间:2013-09-30 11:12:52

标签: c# regex specflow

我想从字符串

中提取“Child 1”和“Parent 1”(不带撇号)
there is a child object with name "Child 1" under parent "Parent 1" in the tree

模式字符串

there is a child object with name "([\w\s^"]+)" under parent "([\w\s^"]+)" in the tree

似乎不正确,因为它也匹配我不想要的整个字符串。

我已使用http://www.myregextester.com/index.php对其进行了测试。

我需要这个在C#中为SpecFlow编写一个步骤。

感谢。

3 个答案:

答案 0 :(得分:0)

对我来说,不使用正则表达式感觉更干净。如果你稍微放松一下你的要求并只尝试一个正则表达式..它将匹配一个结束引号和一个开头的文本。

也许你会手动做到更好的结果?

    string[] extractBetweenQuotes(string str)
    {
        var list = new List<string>();
        int firstQuote = 0;
        firstQuote = str.IndexOf("\"");

        while (firstQuote > -1)
        {
            int secondQuote = str.IndexOf("\"", firstQuote + 1);
            if (secondQuote > -1)
            {
                list.Add(str.Substring(firstQuote + 1, secondQuote - (firstQuote + 1)));
                firstQuote = str.IndexOf("\"", secondQuote + 1);
                continue;
            }

            firstQuote = str.IndexOf("\"", firstQuote + 1);
        }

        return list.ToArray();
    }

用法:

string str = "there is a child object with name \"Child 1\" under parent \"Parent 1\" in the tree";

string[] parts = extractBetweenQuotes(str); // Child 1 and Parent 1 (no quotes)

答案 1 :(得分:0)

您的正则表达式模式:([\w\s^"]+)将匹配带引号的字符串。

我不确定为什么会出现这种情况。似乎混合包容性字符集和排他性字符集并不起作用。如果有人对这一点有更多的了解,我会感兴趣。

你真的想要([^"]+),I.E。

there is a child object with name "([^"]+)" under parent "([^"]+)" in the tree

您的某个步骤和

there is a child object with name "([^"]+)" in the tree

为另一个。

答案 2 :(得分:0)

所以你目前的模式正在发挥作用;

( #Start group
  [ #start choice of 
    \w # word character
    \s #whitespace 
    ^" #not a speechmark
  ] # end choice 
  + # at least one of the choices
) # end group

因为默认情况下Regex很贪婪,所以它可以将字符或空格匹配到行尾。

我建议你只使用

[^"]+ #keep going until you hit a speechmark

在specflow中,这看起来像

[Given("there is a child object with name \"[^\"]+\" under parent \"[^\"]+\" in the tree")]