正则表达式:从引号中提取所有单词

6
通过使用正则表达式,我如何从这样的字符串中提取所有用双引号括起来的文本以及引号外的所有单词?
01AB "SET 001" IN SET "BACK" 09SS 76 "01 IN" SET

第一个正则表达式应该提取所有双引号内的文本,例如:

SET 001
BACK
01 IN

第二个表达式应该提取字符串中的所有其他单词。
01AB
IN
SET
09SS
76
SET

第一个案例可以正常工作 ("(.*?)")。如何从引号中提取所有单词?


请查看此链接:https://dev59.com/a2ox5IYBdhLWcg3wjE5i,它几乎与您的问题相同。 - andy
5个回答

5
尝试使用这个表达式:
(?:^|")([^"]*)(?:$|")

它匹配的组将排除引号,因为它们被包含在非捕获括号(?: 和 )中。当然,您需要转义双引号以在C#代码中使用。
如果目标字符串以引号包含值开头或结尾,则该表达式也将匹配空组(用于初始和末尾引号)。

4

尝试使用这个正则表达式:

\"[^\"]*\"

对于双引号内的文本,请使用Regex.Matches,对于其他所有单词,请使用Regex.Split

var strInput = "01AB \"SET 001\" IN SET \"BACK\" 09SS 76 \"01 IN\" SET";
var otherWords = Regex.Split(strInput, "\"[^\"]*\"");

2
也许你可以尝试将引号内的单词替换为空字符串,例如:
Regex r = new Regex("\".*?\"", RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.Singleline);
        string p = "01AB \"SET 001\" IN SET \"BACK\" 09SS 76 \"01 IN\" SET";

        Console.Write(r.Replace(p, "").Replace("  "," "));

1

如果建议您需要所有引用和非引用句子块,那么使用正则表达式的Split函数将更简单地分离源字符串。

static Regex QuotedTextRegex = new Regex(@"("".*?"")", RegexOptions.IgnoreCase | RegexOptions.Compiled);

var result = QuotedTextRegex
                .Split(sourceString)
                .Select(v => new
                    {
                        value = v,
                        isQuoted = v.Length > 0 && v[0] == '\"'
                    });

1

您需要在第一个表达式中否定模式。

(?!模式)

请查看此链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接