6

通过使用正则表达式,我如何提取双引号中的所有文本,以及此类字符串中引号中的所有单词:

01AB "SET 001" IN SET "BACK" 09SS 76 "01 IN" SET

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

SET 001
BACK
01 IN

第二个表达式应该提取字符串中的所有其他单词

01AB
IN
SET
09SS
76
SET

对于第一种情况,效果很好("(.*?)")。如何从引号中提取所有单词?

4

5 回答 5

5

试试这个表达式:

(?:^|")([^"]*)(?:$|")

与之匹配的组将排除引号,因为它们包含在非捕获括号(?:). 当然,您需要转义双引号以在 C# 代码中使用。

如果目标字符串以带引号的值开始和/或结束,则此表达式也将匹配空组(对于初始引号和尾引号)。

于 2012-09-22T10:59:29.257 回答
4

试试这个正则表达式:

\"[^\"]*\"

用于Regex.Matches双引号中的文本,并Regex.Split用于所有其他单词:

var strInput = "01AB \"SET 001\" IN SET \"BACK\" 09SS 76 \"01 IN\" SET";
var otherWords = Regex.Split(strInput, "\"[^\"]*\"");
于 2012-09-22T11:23:07.437 回答
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("  "," "));
于 2012-09-22T11:04:02.850 回答
1

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

(?!图案)

看看这个链接

于 2012-09-22T11:02:46.983 回答
1

如果建议您需要所有句子块 - 引用而不是那些 - 那么有更简单的方法可以使用正则表达式来分隔源字符串。拆分

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] == '\"'
                    });
于 2014-10-30T11:58:19.693 回答