【发布时间】:2014-12-17 14:33:31
【问题描述】:
我有几个包含数字和字母的输入字符串。有时缺少空间。每次字符串从数字变为字母或从字母变为数字时,我想添加一个额外的空格。
示例输入:
"30EinsteinStreet"
"548 Roe Drive5500 TestCity"
"44B SaarlouisDrive1234Testtown"
他们应该变成:
"30 EinsteinStreet"
"548 Roe Drive 5500 TestCity"
"44 B SaarlouisDrive 1234 Testtown"
我现有的功能不起作用,我认为这很复杂。谁能提供一个简单的解决方案?最好使用现代 C++11 类,但不使用 Boost。另外我使用的是 GCC,所以所有的正则表达式都对我不起作用。
谢谢
这是我现有的方法:
inline string separateAlphanumChunks(const std::string& s)
{
string ret = "";
const int sl = s.length();
//int inserts = 0;
if (sl<=4)
return s;
for (int i=0 ; i< sl ; i++)
{
// cerr << "separateAlphanumChunks: '" << ret << "'" <<endl;
// check if index would go out of range
if (i+4 > sl)
{
ret += s.substr (i,sl-i);
//TODO add the remain to ret
break;
}
// seperate chars
const char c0 = s[i+0];
const char c1 = s[i+1];
// check if 0 and 1 are the same class
const bool c0c = isCharAnInt (c0);
const bool c1c = isCharAnInt (c1);
bool class0 = false;
if (c0c == c1c)
{
class0 = c0c;
}
else
{
ret += c0;
// cerr << "cont1: '" << c0 << "'" <<endl;
continue;
}
// seperate chars
const char c2 = s[i+2];
const char c3 = s[i+3];
// check if 2 and 3 are the same class
const bool c2c = isCharAnInt (c2);
const bool c3c = isCharAnInt (c3);
bool class2 = false;
if (c2c == c3c)
{
class2 = c2c;
}
else
{
ret += c0;
// cerr << "cont2: '" << c0 << "'" <<endl;
continue;
}
// check if the 2 classes are different
if (class0 != class2)
{
// split!
ret += c0+(c1+string(" ")+c2)+c3;
//inserts++;
i+=3;
}
else
{
ret += c0;
// cerr << "cont3: '" << c0 << "'" <<endl;
continue;
}
}
// remove double spaces
//replaceStringInPlace(ret, " "," ");
//cerr << "separateAlphanumChunks: '" << ret << "'" <<endl;
return ret;
}
inline bool isCharAnInt (char c)
{
//TODO might be able to use isdigit() here
int i = c - '0';
return ((i>=0) && (i<=9));
}
【问题讨论】:
-
std::regex和/或std::regex_iterator -
@stijn 我忘了说,我没有研究任何正则表达式函数,因为我使用的是 GCC。
在 GCC 中仅部分实现且存在缺陷。 google.com.au/search?q=std::regex+gcc ...我会解决这个问题。 -
@KenyakornKetsombut:那么,Boost.Regex 怎么样?
-
@KenyakornKetsombut:不,不是。 GCC 4.9 是几个月前发布的。
标签: c++ string algorithm c++11 gcc