C#-从内容发生变化的字符串中提取子字符串

C#-从内容发生变化的字符串中提取子字符串,c#,C#,如何从字符串中获取3个子字符串,例如maybe minor=第一个子字符串带有attribute=“minor”,然后字符串Id=下一个带有属性Id的子字符串,依此类推,因为表达式名称可能会更改,并且我无法将字符串作为一个整体来获取中Id的值(VALUE)ID(/VALUE)。希望我的问题清楚。您的输入具有规则结构,因此可以将其转换为xml: m1 身份证件 平方米 然后使用类似xpath的//表达式[@ATTRIBUTE='major']/*[1] 虽然simplestring.Repla

如何从字符串中获取3个子字符串,例如maybe minor=第一个
子字符串
带有
attribute=“minor”
,然后字符串
Id=
下一个带有属性
Id
的子字符串,依此类推,因为表达式名称可能会更改,并且我无法将字符串作为一个整体来获取
Id
的值(VALUE)ID(/VALUE)
。希望我的问题清楚。

您的输入具有规则结构,因此可以将其转换为xml:


m1
身份证件
平方米
然后使用类似xpath的
//表达式[@ATTRIBUTE='major']/*[1]

虽然simple
string.Replace
可能有效,但我认为最好只替换不在属性值内的大括号。可以使用正则表达式查找字符串:

(WHERE)
  (CONDITION OPERATOR="AND")  
   (EXPRESSION NAME="abc" ATTRIBUTE="minor")
   (VALUE)m1(/VALUE)
   (/EXPRESSION)

  (EXPRESSION NAME="abc" ATTRIBUTE="ID")
  (VALUE)ID(/VALUE)
  (/EXPRESSION)

  (EXPRESSION NAME="abc" ATTRIBUTE="major")
  (VALUE)m2(/VALUE)
  (/EXPRESSION)

(/CONDITION)     
(/WHERE)
并提取字符串边界:

"([^"\\]|\\.)*"

你可以试试看

不清楚……我的意思是我需要从上面的字符串中提取3个子字符串,这取决于每个“表达式”中的“属性”,并存储在不同的变量中。这是某种Xml,你用()?看起来您可以将此文本转换为xml并使用XPath1/。这是您真正的输入还是出于某种原因编辑的xml?2/。您的预期输出是什么?没有句子,只有值,您关于所需内容的句子确实不清楚。我要子字符串不够精确。对于这3个字符串,您的字符串中有无穷多的子字符串变量您期望的字符串值是多少。谢谢您将尝试它!
var stringsBounds = Regex.Matches(input, "\"([^\"\\\\]|\\\\.)*\"")
    .Cast<Match>()
    .Select(m => new
    {
        begin = m.Index,
        end = m.Index + m.Length - 1
    })
    .ToArray();
Func<Match, bool> isInsideString = m => stringsBounds.Any(b => m.Index > b.begin && m.Index < b.end);
var xmlAsText = Regex.Replace(Regex.Replace(input, "\\(", m => isInsideString(m) ? "(" : "<"),
    "\\)", m => isInsideString(m) ? ")" : ">");
var xml = XDocument.Parse(xmlAsText);

var expressionSelector = "//EXPRESSION[@ATTRIBUTE='{0}']/*[1]";

foreach (var attribute in new [] {"minor", "major", "ID"})
{
    var xpath = string.Format(expressionSelector, attribute);
    var node = xml.XPathSelectElement(xpath);

    Console.WriteLine($"Attribute: {attribute}, element: {node}");
}