【发布时间】:2014-09-28 06:43:18
【问题描述】:
我有一个带有 XY 坐标的文件,我想用数字“0”替换“空”坐标。
文件:
X123Y456
XY123
X123
Y123
X123Y
XY123
X
Y
这样的模式:
X\n -> X0
Y\n -> Y0
XY -> X0Y
实际上,我认为正则表达式会非常好用,但我不知道该怎么做。所以到目前为止我使用了简单的 String::Replace。对我来说复杂的事情是,不仅会发生情况,而且每行也不会只有一个。
我认为我应该能够做到:
System::Text::RegularExpressions::Regex::Replace(INPUT, PATTERN, REPLACE);
输入对我来说很清楚,由于不同的组,模式并不完全:
(^X$) -> X0
(Y$) -> Y0
(^XY) -> X0Y
(^XY$) -> X0Y0
这会给出类似的东西。
(^X$)|(Y$)|(^XY)
替换将是 afaik 之类的:
$0 -> X0
$1 -> Y0
$2 -> X0Y
到目前为止我所做的只是简单的 String::Replace:
void searchReplace(String^ sFile)
{
if(!System::IO::File::Exists(sFile))
return;
System::IO::StreamReader^ sr = gcnew System::IO::StreamReader(sFile);
System::IO::StreamWriter^ sw = gcnew System::IO::StreamWriter(sFile + ".tmp");
String^ newLine = System::Environment::NewLine;
//System::Text::RegularExpressions::Regex regex = System::Text::RegularExpressions::Regex();
String^ pattern = "(X"+newLine+")";
String^ sLine = "";
while((sLine = sr->ReadLine()) != nullptr)
{
String^ sRes = sLine->Trim()->Replace("Y"+newLine, "Y0");
sRes = sRes->Replace("XY", "X0Y");
sRes = sRes->Replace("X"+newLine, "X0");
sw->WriteLine(sRes);
}
sr->Close();
sw->Close();
// TODO copy / delete
}
由于其他问题尚未尝试此操作,但它基本上应该可以工作。但这对我来说似乎不是那么完美,正则表达式应该更好用。
有什么办法可以用正则表达式来做,还是用字符串替换最佳方式?如果是这样,我应该如何正确使用 Regex::Replace?
任何帮助/提示/建议都会非常好。
编辑解决方案:
感谢您的帮助。这是适合我的最终版本:
void searchReplace(String^ sFile)
{
if(!System::IO::File::Exists(sFile))
return;
System::IO::StreamReader^ sr = gcnew System::IO::StreamReader(sFile);
System::IO::StreamWriter^ sw = gcnew System::IO::StreamWriter(sFile + ".tmp");
String^ sLine = "";
while((sLine = sr->ReadLine()) != nullptr)
{
sw->WriteLine(Regex::Replace(sLine->Trim(), "(?<=[XY])(?=\D|$)(?!-)", "0"));
}
sr->Close();
sw->Close();
// TODO copy / delete
}
输入:
X-123Y-456
XY-123
X123
Y123
X123Y
XY123
X
Y
输出:
X-123Y-456
X0Y-123
X123
Y123
X123Y0
X0Y123
X0
Y0
编辑 2: 为我的描述中没有提到的负坐标添加了模式。
(?<=[XY])(?=\D|$)(?!-)
【问题讨论】:
-
你真的想要
XY -> X0Y而不是XY -> X0Y0吗? -
在“XY\n”的情况下应该将其替换为“X0Y0”,但在“XY123”的情况下不应该。所以这取决于替换的顺序。
-
在这种情况下应该没问题,是的。
标签: c++ .net regex string replace