我可能没有将这个问题说成是我想要的。请考虑以下情况。
情境:
我正在我的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;
}
}
答案 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)
首先,让我们假设:
只需阅读您的代码即可。我们点击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
,您必须使用根据当然输入仅替换字符串的第一个或最后一个匹配项的函数。