3

我在拆分这条线时遇到问题。我想在“@VAR;”之间获取每个字符串 和“@ENDVAR;”。所以最后,应该有一个输出:

Variable=Speed;Value=Fast;
Variable=Fabricator;Value=Freescale;Op==;

稍后我将使用“;”分隔每个子字符串 作为分隔符,但我想不会那么难。这是一条线的样子:

@VAR;Variable=Speed;Value=Fast;Op==;@ENDVAR;@VAR;Variable=Fabricator;Value=Freescale;Op==;@ENDVAR;

我尝试了一些拆分选项,但大多数时候我只是得到一个空字符串。我也尝试了一个正则表达式。但要么正则表达式错误,要么不适合我的字符串。可能是错误的,在学校我们学习的正则表达式与 C# 中使用的不同,所以我在实现时很困惑。

Regex.Match(t, @"/@VAR([a-z=a-z]*)/@ENDVAR")

编辑:

一个小问题:我正在迭代许多行,例如问题中的行。我在线上使用 NoIdeas 代码使其成型。下一步是将其打印为文本文件。要打印一个数组,我必须循环它。但是在每次迭代中,当我得到一个新行时,我会用当前拆分的字符串覆盖数组。我将其余代码放在问题中,如果有人可以帮助我,那就太好了。

string[] w ;
foreach (EA.Element theObjects in myPackageObject.Elements)
{
   theObjects.Type = "Object";
   foreach (EA.Element theElements in PackageHW.Elements)
   {
       if (theObjects.ClassfierID == theElements.ElementID)
       {
          t = theObjects.RunState;
          w = t.Replace("@ENDVAR;", "@VAR;").Replace("@VAR;", ";").Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);

          foreach (string s in w)
          {
             tw2.WriteLine(s);
          }
       }
   }
}

带有 foreach 循环的部分肯定是错误的。我需要一些东西来打印每个拆分的 t。提前致谢。

4

7 回答 7

4

你可以在没有正则表达式的情况下使用

str.Replace("@ENDVAR;", "@VAR;")
  .Split(new string[] { "@VAR;" }, StringSplitOptions.RemoveEmptyEntries);

如果你想节省时间,你可以这样做:

str.Replace("@ENDVAR;", "@VAR;")
  .Replace("@VAR;", ";")
  .Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
于 2013-09-12T14:43:08.077 回答
3

您可以在此处使用前瞻断言。

@VAR;(.*?)(?=@ENDVAR)

如果您的字符串从不包含空格,@VAR;并且@ENDVAR;您可以使用下面的行,这将与您的行的空实例不匹配。

@VAR;([^\s]+)(?=@ENDVAR)

看这个演示

于 2013-09-12T14:57:50.237 回答
2

使用原始字符串操作回答。

IEnumerable<string> StuffFoundInside(string biggerString)
{
    var closeDelimeterIndex = 0;
    do
    {
        int openDelimeterIndex = biggerString.IndexOf("@VAR;", startingIndex);
        if (openDelimeterIndex != -1)
        {
            closeDelimeterIndex = biggerString.IndexOf("@ENDVAR;", openDelimeterIndex);
            if (closeDelimiterIndex != -1)
            {
                yield return biggerString.Substring(openDelimeterIndex, closeDelimeterIndex - openDelimiterIndex);
            }
        }    
    } while (closeDelimeterIndex != -1);
}

创建一个列表并将每个项目添加到列表中然后返回列表可能会更快,具体取决于使用此代码的代码的工作方式。这允许它提前终止,但有协程开销。

于 2013-09-12T15:04:26.600 回答
1

(如果你不喜欢正则表达式)

代码:

var s = "@VAR;Variable=Speed;Value=Fast;Op==;@ENDVAR;@VAR;Variable=Fabricator;Value=Freescale;Op==;@ENDVAR;";
var tokens = s.Split(new String [] {"@ENDVAR;@VAR;"}, StringSplitOptions.None);

foreach (var t in tokens)
{
  var st = t.Replace("@VAR;", "").Replace("@ENDVAR;", "");
  Console.WriteLine(st);
}

输出:

Variable=Speed;Value=Fast;Op==;
Variable=Fabricator;Value=Freescale;Op==;
于 2013-09-12T15:04:08.967 回答
1

Regex.Split效果很好,但会产生必须删除的空条目,如下所示:

string[] result = Regex.Split(input, @"@\w+;")
    .Where(s => s != "")
    .ToArray();
于 2013-09-12T15:04:38.490 回答
1

我尝试了一些拆分选项,但大多数时候我只是得到一个空字符串。

在这种情况下,要求似乎比您说的要简单。简单地拆分和使用 linq 将在一个语句中完成您的整个操作:

        string test = "@VAR;Variable=Speed;Value=Fast;Op==;@ENDVAR;@VAR;Variable=Fabricator;Value=Freescale;Op==;@ENDVAR;";

        List<List<string>> strings = (from s in test.Split(new string[]{"@VAR;",";@ENDVAR;"},StringSplitOptions.RemoveEmptyEntries)
                                let s1 = s.Split(new char[]{';'},StringSplitOptions.RemoveEmptyEntries).ToList<string>()
                                select (s1)).ToList<List<string>>();

输出是:

?strings[0]
Count = 3
    [0]: "Variable=Speed"
    [1]: "Value=Fast"
    [2]: "Op=="
?strings[1]
Count = 3
    [0]: "Variable=Fabricator"
    [1]: "Value=Freescale"
    [2]: "Op=="

要将数据写入文件,如下所示:

        foreach (List<string> s in strings)
        {
            System.IO.File.AppendAllLines("textfile1.txt", s);
        }
于 2013-09-12T14:58:38.027 回答
1

使用这个正则表达式:

(?i)@VAR;(.+?)@ENDVAR;

每场比赛的第 1 组将是您的线路内容。

于 2013-09-12T14:47:51.543 回答