我想从字符串
中提取“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编写一个步骤。
感谢。
答案 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")]