使用正则表达式进行模式查找和替换

时间:2011-07-21 00:07:54

标签: c# .net regex

我在逗号分隔文件中有以下格式的字符串:

someText, "Text with, delimiter", moreText, "Text Again"

我需要做的是创建一个查看字符串的方法,并用引号($)替换带引号的文本中的任何逗号。

在方法之后,字符串将是:

someText, "Text with$ delimiter", moreText, "Text Again"

我对RegEx不太满意,但想知道如何使用正则表达式搜索模式(在引号之间找到逗号),然后用美元符号替换该逗号。

5 个答案:

答案 0 :(得分:3)

就个人而言,我在这里避免使用正则表达式 - 假设没有嵌套的引号,这很容易写成for循环,我认为它会更有效:

var inQuotes = false;
var sb = new StringBuilder(someText.Length);

for (var i = 0; i < someText.Length; ++i)
{
    if (someText[i] == '"')
    {
        inQuotes = !inQuotes;
    }

    if (inQuotes && someText[i] == ',')
    {
        sb.Append('$');
    }
    else
    {
        sb.Append(someText[i]);
    }
}

答案 1 :(得分:1)

此类问题是Regex失败的地方,请改为:

    var sb = new StringBuilder(str);

    var insideQuotes = false;

    for (var i = 0; i < sb.Length; i++)
    {
        switch (sb[i])
        {
            case '"':
                insideQuotes = !insideQuotes;
                break;
            case ',':
                if (insideQuotes)
                    sb.Replace(',', '$', i, 1);
                break;
        }               
    }

    str = sb.ToString();

您还可以使用CSV parser来解析字符串,并使用替换列再次写入。

答案 2 :(得分:1)

以下是使用Regex.Replace

的方法
        string output = Regex.Replace(
            input,
            "\".*?\"",
            m => m.ToString().Replace(',', '$'));

当然,如果你想忽略转义的双引号,它会变得更复杂。特别是当逃脱角色本身可以逃脱时。

假设转义字符为\,那么当尝试匹配双引号时,您将只想匹配前面带有偶数个转义字符(包括零)的引号。以下模式将为您做到这一点:

string pattern = @"(?<=((^|[^\\])(\\\\){0,}))"".*?(?<=([^\\](\\\\){0,}))""";

在这一点上,您可能更愿意放弃正则表达式;)

<强>更新

在回复您的评论时,可以轻松地为不同的引号,分隔符和占位符配置操作。

        string quote = "\"";
        string delimiter = ",";
        string placeholder = "$";

        string output = Regex.Replace(
            input,
            quote + ".*?" + quote,
            m => m.ToString().Replace(delimiter, placeholder));

答案 3 :(得分:0)

如果你想在正规格路线上找到你想要的东西:

var result = Regex.Replace( text, "(\"[^,]*),([^,]*\")", "$1$$$2" );

在这种情况下正则表达式的问题在于它不会捕获“this,has,two逗号”。

http://refiddle.com/1ab

工作

答案 4 :(得分:-2)

你可以尝试一下:“[\ w] ,[\ w] ”(包括双引号)? 并且要小心更换,因为直接替换将删除双引号中的整个字符串。