通过使用正则表达式,我如何提取双引号中的所有文本,以及此类字符串中引号中的所有单词:
01AB "SET 001" IN SET "BACK" 09SS 76 "01 IN" SET
第一个正则表达式应该提取双引号内的所有文本,例如
SET 001
BACK
01 IN
第二个表达式应该提取字符串中的所有其他单词
01AB
IN
SET
09SS
76
SET
对于第一种情况,效果很好("(.*?)")
。如何从引号中提取所有单词?
试试这个表达式:
(?:^|")([^"]*)(?:$|")
与之匹配的组将排除引号,因为它们包含在非捕获括号(?:
和)
. 当然,您需要转义双引号以在 C# 代码中使用。
如果目标字符串以带引号的值开始和/或结束,则此表达式也将匹配空组(对于初始引号和尾引号)。
试试这个正则表达式:
\"[^\"]*\"
用于Regex.Matches
双引号中的文本,并Regex.Split
用于所有其他单词:
var strInput = "01AB \"SET 001\" IN SET \"BACK\" 09SS 76 \"01 IN\" SET";
var otherWords = Regex.Split(strInput, "\"[^\"]*\"");
也许您可以尝试用空字符串替换引号内的单词,例如:
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(" "," "));
如果建议您需要所有句子块 - 引用而不是那些 - 那么有更简单的方法可以使用正则表达式来分隔源字符串。拆分:
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] == '\"'
});