我有一个带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)
取而代之的是:
$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|$)(?!-)
答案 0 :(得分:2)
您可以使用以下正则表达式:
String output = Regex.Replace(input, @"(?<=[XY])(?=\D|$)", "0");
<强>解释强>:
(?<= # look behind to see if there is:
[XY] # any character of: 'X', 'Y'
) # end of look-behind
(?= # look ahead to see if there is:
\D # non-digits (all but 0-9)
| # OR
$ # before an optional \n, and the end of the string
) # end of look-ahead
答案 1 :(得分:1)
正则表达式
(X|Y)(?!\d)
匹配&#34; X&#34;的所有实例或&#34; Y&#34;没有跟随数字并捕获第一个捕获组中的哪一个(X或Y)。
你可以像
一样使用它output = System::Text::RegularExpressions::Regex.Replace(input, "(X|Y)(?!\\d)", "$10");
请注意,此表达式替换了&#34; XY&#34;通过&#34; X0Y0&#34;而不是&#34; X0Y&#34;。这可以接受吗?