如何用正则表达式提取[family]:后双引号内的字符串?
解决正则提取family列表内容的问题
嘿,作为正则新手遇到这种问题很正常,我来帮你梳理下问题所在,再给出可行的解决方案~
先说说你原来正则的问题
你写的@"[family]:\*"有两个关键错误:
[family]是字符类,它会匹配f、a、m、i、l、y中的任意单个字符,而不是匹配[family]这个完整的字面量。要匹配方括号包裹的family,需要给方括号转义,写成\[family\]。\*是转义后的星号字符,它只会匹配*本身,而不是你想要的“任意内容”。这里你需要匹配双引号之间的文本,得用合适的捕获组来实现。
正确的正则表达式
针对你的测试字符串,推荐使用这个正则:
@"\[family\]:\s*""\s*(.*?)\s*"""
我来拆解下每个部分的作用:
\[family\]:精准匹配字面量[family],转义方括号避免被解析为字符类。:\s*:匹配冒号,后面的\s*会匹配0个或多个空白字符(包括空格、制表符等),兼容字符串里的空格。"":在C#的字符串中,两个双引号表示匹配一个字面量双引号。\s*:匹配双引号内开头的空白(比如你字符串里" trees "前面的空格)。(.*?):非贪婪模式的捕获组,会尽可能少地匹配字符,刚好捕获到引号内的目标内容(trees、colors),避免把两个引号间的所有内容都匹配成一个。\s*:匹配内容后面的空白(比如" trees "后面的空格)。"":匹配结尾的双引号。
C#代码示例
用这个正则提取内容的完整代码如下:
using System; using System.Text.RegularExpressions; class Program { static void Main() { string test = "var test = \"and ( [family]: \" trees \" or [family]: \" colors \" )\""; MatchCollection matches = Regex.Matches(test, @"\[family\]:\s*""\s*(.*?)\s*"""); foreach (Match match in matches) { // Groups[1]就是我们捕获到的目标内容 Console.WriteLine(match.Groups[1].Value); } } }
运行这段代码就会输出:
trees colors
额外提示
如果你的字符串里双引号可能有转义(比如\"),那正则需要调整,但从你给出的测试字符串来看,当前的正则完全够用啦~
内容的提问来源于stack exchange,提问作者Jeya Suriya Muthumari
相关产品推荐
相关产品推荐

