剥离wxString的字符

时间:2015-03-26 06:31:07

标签: c++ wxwidgets trim strip wxstring

我正在开发一个用C ++编写的应用程序,它主要使用wxWidgets作为其对象。现在,假设我有以下wxString变量:

wxString path = "C:\\Program Files\\Some\\Path\\To\\A\\Directory\\";

有没有办法删除尾部斜杠?虽然wxString提供了Trim()方法,但它仅适用于空格字符。我可以想到将字符串转换为另一种字符串类型并在那里执行剥离并切换回wxString类型(我必须使用wxString类型)但如果有一种不太复杂的处理方式,我宁愿这一点。

4 个答案:

答案 0 :(得分:4)

其他人已经提到了如何使用wxString方法实现这一点,但是我强烈建议使用适当的类,即wxFileName或者std::filesystem::path来处理路径而不是原始字符串。例如。为了在你的案例中获得路径的规范表示,我将使用wxFileName::DirName(path).GetFullPath()

答案 1 :(得分:2)

path.erase(path.end() - 1);

path.RemoveLast();

答案 2 :(得分:2)

如果我没有正确的路径解析替代方法,我会使用这个:

wxString& remove_trailing_backslashes(wxString& path)
{
   auto inb = path.find_last_not_of(L'\\');
   if(inb != wxString::npos)
      path.erase(inb + 1); //inb + 1 <= size(), valid for erase()
   else //empty string or only backslashes
      path.clear();
   return path; //to allow chaining
}

注意:

  • 除非你做了一些不寻常的事情,wxString在内部存储wchar_t,所以使用宽字符串和字符文字(前缀为L)来避免不必要的转换是有意义的。
  • 即使在您使用UTF-8编码的字符串的特殊情况下,上面的代码仍然有效,因为\是ASCII,因此它不能出现在另一个代码点的编码中({{在这种情况下,1}}前缀不再适用于此。)
  • 即使您被迫使用L,我建议您尝试尽可能使用其wxString类似的界面,而不是wx特定的功能。如果您将std::basic_string替换为wxString,则上述代码可以正常工作。
  • 支持VZ。在他的回答中说,请注意所有这些简单的基于字符串的解决方案都会将std::wstring剥离到C:\,将C:剥离为空字符串,这可能不是您想要的。为了避免这样的问题,我会选择Boost.Filesystem库,据我所知,这是最接近建议的标准库文件系统功能(这不是标准的正式部分,但非常接近)

为了完整性,这是使用Boost.Filesystem的样子:

\

它不如上面的ad-hoc解决方案那么高效,主要是因为字符串没有就地修改,但对特殊路径格式引起的问题更具弹性。

答案 3 :(得分:1)

我的用例实际上也考虑了没有尾随斜杠的场景。

我想出了两个解决方案。第一个使用正则表达式:

wxRegEx StripRegex("(.+?)\\\\*$", wxRE_ADVANCED);
if (StripRegex.Matches(path))
{
  path = StripRegex.GetMatch(path,1);
}

第二个,正如@catalin建议的那样,使用RemoveLast

while (path.EndsWith("\\"))
{
  path.RemoveLast();
}

修改:使用@ VZ的建议,我想出了以下内容:

// for some reason, the 'Program Files' part get's taken out in the resulting string
// so I have to first replace the double slashes
path.Replace("\\\\","\\");
path = wxFileName::DirName(path).GetPath();