字符串替换为多种组合

时间:2014-08-05 14:40:21

标签: c++ .net regex string replace

我有一个带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|$)(?!-)

2 个答案:

答案 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

Live Demo | Working Demo

答案 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;。这可以接受吗?