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

本文关键字:字符串 替换 一部分 包含多 相似部 | 更新日期: 2023-09-27 18:09:00

我可能没有按照我想要的方式陈述这个问题。请考虑以下情况。

场景:
我正在c# winform应用程序中实现搜索/替换功能。此功能将具有替换"以"或"以"某个值开始或结束的子字符串的选项。例如:

  • 包含"123ABCD"的字符串。用"XYZ"代替"123"产生:"XYZABCD"
  • 包含"ABCD123"的字符串。用"XYZ"代替"123"将产生:"ABCDXYZ"

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

  • "以"开头产生"XYZABCDXYZ",而不是"XYZABCD"
  • "以" produce "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;
    }
}

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

根据搜索模式实现替换方法

替换行

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;

这听起来像是一个很好的正则表达式

它被。net支持,并且也有一个替代语法

我只是想尝试一种不使用regex的替代方法。
(Regex可能是正确的方法,但找到一个替代方案是很有趣的)

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);
}

首先,让我们假设如下:

  • 要处理的字符串是123ABCD123
  • 以is checked开头
  • 的目的是用"XYZ"代替"123"

只是通过阅读你的代码。我们点击了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,即123与XYZ的所有出现。当然,这不是理想的行为。而不是Replace,您必须使用一个函数来根据输入替换字符串的第一个或最后一个出现。