0

我想从字符串中提取“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 编写一个步骤。

谢谢。

4

3 回答 3

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)
于 2013-09-30T11:21:52.210 回答
0

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

我不确定为什么会发生这种效果。似乎混合包含字符集和独占字符集是行不通的。如果有人对此有更多了解,我会很感兴趣。

真的是你想要([^"]+)的,IE

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

对于您的一个步骤和

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

对于另一个。

于 2013-09-30T13:04:12.883 回答
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")]        
于 2013-09-30T13:08:15.710 回答