如何从包含多个相似部分的字符串中仅替换子字符串的一部分?

时间:2013-04-12 07:08:53

标签: c# string winforms datagridview

我可能没有将这个问题说成是我想要的。请考虑以下情况。

情境:
我正在我的C#Win Form应用程序中实现搜索/替换功能。此功能可以选择替换“以...开头”或“以...结尾”某个值的子字符串。例如:

  • 字符串包含"123ABCD"。将"123"替换为"XYZ"应生成:"XYZABCD"
  • 字符串包含"ABCD123"。将"123"替换为"XYZ"应生成:"ABCDXYZ"

这两项功能都运行良好。我的问题是当字符串包含"123ABCD123"时。使用"XYZ"时,两个操作都返回错误的值。

  • “以”开头“生成"XYZABCDXYZ",而不是"XYZABCD"
  • “以”结尾“生成"XYZABCDXYZ"而不是"ABCDXYZ"

任何人都可以告诉我如何实现这一目标吗?

谢谢!

代码段:

if (this.rbMatchFieldsStartedWith.Checked)
{
    if (caseSencetive)
    {
        matched = currentCellValue.StartsWith(findWhat);
    }
    else
    {
        matched = currentCellValue.ToLower().StartsWith(findWhat.ToLower());
    }
}
else if (this.rbMatchFieldsEndsWith.Checked)
{
    if (caseSencetive)
    {
        matched = currentCellValue.EndsWith(findWhat);
    }
    else
    {
        matched = currentCellValue.ToLower().EndsWith(findWhat.ToLower());
    }
}

if (matched)
{
    if (replace)
    {
        if (this.rbMatchWholeField.Checked)
        {
            currentCell.Value = replaceWith;
        }
        else
        {
            currentCellValue = currentCellValue.Replace(findWhat, replaceWith);
            currentCell.Value = currentCellValue;
        }
        this.QCGridView.RefreshEdit();
    }
    else
    {
        currentCell.Style.BackColor = Color.Aqua;
    }
}

4 个答案:

答案 0 :(得分:1)

对于regular expressions来说,这听起来不错。

它受.NET支持,并且还有替换语法。

答案 1 :(得分:1)

根据搜索模式实施替换方法。

替换

currentCellValue = currentCellValue.Replace(findWhat, replaceWith);

if (this.rbMatchFieldsStartedWith.Checked)
{
    // target string starts with findWhat, so remove findWhat and prepend replaceWith
    currentCellValue = replaceWith + currentCellValue.SubString(findWhat.Length);
}
else
{
    // target string end with findWhat, so remove findWhat and append replaceWith.
    currentCellValue = currentCellValue.SubString(0, currentCellValue.Length - findWhat.Length) + replaceWith;
}

currentCell.Value = newValue;

答案 2 :(得分:0)

我只是想在不使用正则表达式的情况下尝试替换方法 (正则表达式可能是正确的方法,但找到替代方案很有趣)

void Main()
{
    string test = "123ABCD123";  // String to change
    string rep = "XYZ";          // String to replace
    string find = "123";         // Replacement string
    bool searchStart = true;     // Flag for checkbox startswith 
    bool searchEnd = true;       // Flag for checkbox endswith
    bool caseInsensitive = true; // Flag for case type replacement

    string result = test;         
    int pos = -1;
    int lastPos = -1;

    if(caseInsensitive == true)
    {
        pos = test.IndexOf(find, StringComparison.InvariantCultureIgnoreCase);
        lastPos = test.LastIndexOf(find, StringComparison.InvariantCultureIgnoreCase);
    }
    else
    {
        pos = test.IndexOf(find, StringComparison.Ordinal);
        lastPos = test.LastIndexOf(find, StringComparison.Ordinal);
    }

    result = test;
    if(pos == 0 && searchStart == true)
    {
        result = rep + test.Substring(find.Length);
    }
    if(lastPos != 0 && lastPos != pos && lastPos + find.Length == test.Length && searchEnd == true)
    {
        result = result.Substring(0, lastPos) + rep;
    }
    Console.WriteLine(result);
}

答案 3 :(得分:0)

首先,让我们假设:

  • 要处理的字符串是123ABCD123
  • 以检查开始。
  • 目标是将“123”替换为“XYZ”

只需阅读您的代码即可。我们点击if (this.rbMatchFieldsStartedWith.Checked),其评估结果为true。所以我们介入那个区块。我们点击了matched = currentCellValue.StartsWith(findWhat);matched = true。我们继续if (matched)条件,该条件也评估为true。之后if (replace)评估为true。最后,我们使用if (this.rbMatchWholeField.Checked)作出最后决定,评估结果为false,以便我们继续else阻止:

currentCellValue = currentCellValue.Replace(findWhat, replaceWith);
currentCell.Value = currentCellValue;

此块中的第一行用findWhat替换replaceWith的所有出现,即用XYZ出现123的所有出现。当然,这不是理想的行为。而不是Replace,您必须使用根据当然输入仅替换字符串的第一个或最后一个匹配项的函数。