C#从带引号的字符串中删除分隔符

时间:2010-11-18 14:06:40

标签: c# regex string text-files

我正在编写一个程序,必须从文本文件中的引用字符串中删除分隔符。

例如:

"Hello, my name is world"

必须:

"Hello my name is world"

这听起来很容易(我认为会这样),但是您需要检测引用何时开始,何时引用结束,然后搜索特定字符串以查找分隔符。怎么样?

我已经尝试了一些正则表达式,但我只是让自己感到困惑!

有什么想法吗?即使只是让球滚动的东西,我也完全被难倒了。

8 个答案:

答案 0 :(得分:4)

string pattern = "\"([^\"]+)\"";
value = Regex.Match(textToSearch, pattern).Value;

string[] removalCharacters = {",",";"}; //or any other characters
foreach (string character in removalCharacters)
{
    value = value.Replace(character, "");
}

答案 1 :(得分:2)

为什么不尝试使用Linq?

var x = @" this is a great whatever ""Hello, my name is world"" and all that";

var result = string.Join(@"""", x.Split('"').
Select((val, index) => index%2 == 1 ? 
val.Replace(",", "") : val).ToArray());

答案 2 :(得分:2)

使用具有前瞻性的正则表达式模式将是:"\"(?=[^\"]+,)[^\"]+\""

\"匹配开头的双引号。预见(?=[^\"]+,)将尝试匹配引用文本中的逗号。接下来我们匹配字符串的其余部分,只要它不是双引号[^\"]+,然后我们匹配结束双引号\"

使用Regex.Replace可以使用紧凑的方法来更改结果并删除不需要的逗号。

string input = "\"Hello, my name, is world\"";
string pattern = "\"(?=[^\"]+,)[^\"]+\"";
string result = Regex.Replace(input, pattern, m => m.Value.Replace(",", ""));
Console.WriteLine(result);

答案 3 :(得分:1)

您想要编写的内容称为“词法分析器”(或者称为“标记器”),它按字符读取输入字符并将其分解为标记。这通常是编译器中解析的工作方式(作为第一步)。词法分析器会将文本分解为一个标记流(字符串文字,标识符,“(”等)。解析器然后获取这些标记,并使用它们生成一个解析树。

在你的情况下,你只需要一个词法分析器。您将有两种类型的令牌“引用字符串”和“其他所有内容”。

然后,您只需编写代码即可将输入分解为令牌。默认情况下,某些东西是“其他所有”令牌。当您看到“,当您看到下一个”结束时,字符串标记开始。如果您正在阅读源代码,则可能需要处理“或”作为特殊情况。

完成后,您可以遍历令牌并执行“字符串”令牌所需的处理。

答案 4 :(得分:0)

所以我猜你有一些很长的文字里面有很多引号?我会做一个像这样的方法:

  1. 运行思考字符串,直到遇到第一个“
  2. 然后将子字符串直到下一个“,并执行str.Replace(”,“,”“)并替换您要替换的任何其他字符。
  3. 然后继续更换,直到你遇到下一个“并继续直到结束。
  4. 修改

    我刚才有了一个更好的主意。那怎么样:

      string mycompletestring = "This is a string\"containing, a quote\"and some more text";
      string[] splitstring = mycompletestring.Split('"');
      for (int i = 1; i < splitstring.Length; i += 2) {
        splitstring[i] = splitstring[i].Replace(",", "");
      }
      StringBuilder builder = new StringBuilder();
      foreach (string s in splitstring) {
        builder.Append(s + '"');
      }
      mycompletestring = builder.ToString().Substring(0, builder.ToString().Length - 1);
    

    我认为应该有一种更好的方法将字符串组合成一个“最后在它们之间,但我不知道更好的字符串,所以请在这里建议一个好方法:”

答案 5 :(得分:0)

我必须在我用来翻译平面文件的应用程序中做类似的事情。这是我采用的方法:(只需从我的应用程序中复制/粘贴)

        protected virtual string[] delimitCVSBuffer(string inputBuffer) {
        List<string> output       = new List<string>();
        bool insideQuotes         = false;
        StringBuilder fieldBuffer = new StringBuilder();
        foreach (char c in inputBuffer) {
            if (c == FieldDelimiter && !insideQuotes) {
                output.Add(fieldBuffer.Remove(0, 1).Remove(fieldBuffer.Length - 1, 1).ToString().Trim());
                fieldBuffer.Clear();
                continue;
            } else if (c == '\"')
                insideQuotes = !insideQuotes;
            fieldBuffer.Append(c);
        }
        output.Add(fieldBuffer.Remove(0, 1).Remove(fieldBuffer.Length - 1, 1).ToString().Trim());
        return output.ToArray();
    }

答案 6 :(得分:0)

好的,这有点古怪,但它确实有效。

首先,根据"字符

,将字符串拆分为多个部分
string msg = "this string should have a comma here,\"but, there should be no comma in this bit\", and there should be a comma back at that and";

var parts = msg.Split('"');

然后你需要在删除每个其他部分中的每个逗号之后将字符串重新加入"字符:

string result = string.Join("\"", RemoveCommaFromEveryOther(parts));

删除功能如下所示:

IEnumerable<string> RemoveCommaFromEveryOther(IEnumerable<string> parts)
{
    using (var partenum = parts.GetEnumerator())
    {
        bool replace = false;
        while (partenum.MoveNext())
        {
            if(replace)
            {
                yield return partenum.Current.Replace(",","");
                replace = false;
            }
            else
            {
                yield return partenum.Current;
                replace = true;
            }
        }
    }
}

确实要求您为System.Collections.Generic添加using指令。

答案 7 :(得分:-1)

有很多方法可以做到这一点: 感谢函数string.Split()string.IndexOfAny()

您可以使用string.Split(new char [] {',',''},StringSplitOption.RemoveEmptyEntries)将短语滑入单词,然后使用StringBuilder类将单词放在一起。< / p>

使用您要删除的每个字符多次调用string.Replace("[char to remove goes here]"',"")也可以。

编辑:

调用string.Split(new char[] {'\"'}, StringSplitOption.RemoveEmptyEntries)以获取引号(“)之间的字符串数组,然后在每个字符串上调用Replace,然后将字符串与StringBuilder放在一起。