我正在替换为xml,并且只有在&
字符以分号结尾时,我需要用&
替换&
字符。C++/Boost字符串替换:如何将'&'替换为'&',仅当以&;结尾时;
当然,我可以用replace_if,replace_all或boost中的正则表达式支持来做到这一点,但我今天有些愚蠢......似乎找不到我需要的东西。
对此提出建议?
我正在替换为xml,并且只有在&
字符以分号结尾时,我需要用&
替换&
字符。C++/Boost字符串替换:如何将'&'替换为'&',仅当以&;结尾时;
当然,我可以用replace_if,replace_all或boost中的正则表达式支持来做到这一点,但我今天有些愚蠢......似乎找不到我需要的东西。
对此提出建议?
它不应该那么辛苦。使用std :: find前进到下一个&,然后使用find_if,find_first_of或boost :: regex向前扫描 找到';',或者会让你停止搜索的东西。东西 这样(未经)应该工作:
struct EndMatch
{
bool operator()(char ch) const
{
return isspace(static_cast<unsigned char>(ch)) || ch == ';' ;
}
};
std::string
replaceAmp(std::string const& original)
{
typedef std::string::const_iterator TextIter;
std::string results;
TextIter current = original.begin();
TextIter end = original.end();
TextIter next = std::find(current, end, '&');
while (next != end) {
results.append(current, next);
current = next;
next = std::find_if(current, end, EndMatch());
if (next == end || *next != ';') {
results.append("&");
} else {
results.append('&');
}
++ current; // Skip '&', processed above
next = std::find(current, end, '&');
}
results.append(current, next);
return results;
}
您可以尝试使用下面的正则表达式负前瞻:
(&)(?!\S*;)
,只有当它不是后面紧跟着一个;
非空白字符(S)一&
匹配。
我不知道,如果升压正则表达式允许负先行。
我相信sed表达s/&([^ ]*);/&\1;/g
会做你正在寻找的替代品。我不熟悉boost的字符串替换,但文档说它支持sed样式常规表达式。
编辑:在sed中测试它后,表达式似乎需要更多的转义。 s/\&\([^ ]*\);/\&\1;/g
适用于我的测试用例。
编辑2:略提高的表达,和一个故障:
s#&\([^[:space:]]*\);#\&\1;#g
输入模式:
&
与文字字符开始&
\([^[:space:]]*\)
匹配并捕获任何数量的非空白字符
;
以文字结尾;
输出模式:
\&
文字字符&(需要在输出图案进行转义因为&通常表示存在整个匹配的字符串)
amp;
字面
\1
打印背面的捕获的非空白字符串
;
字面;
(空格插入防止计算器本身替换它们!)
您可以使用排除使用先行?
/\&(?![A-Za-z]+\;)/
这个匹配&字符,其后面没有正常字加上分号。
但是,并非所有的系统都支持预读。如果你不这样做,那么你必须首先替换所有的&,然后将错误的转换回来。如果没有消极的环视,正则表达式在不是匹配的东西。
'&hello world;'?你需要更多的约束。 – 2011-03-18 16:06:01
在这种情况下,空格将允许匹配,必须是连续的。这是为xml记住哪些不允许和不使用&。我只是不想将“>”替换为“&”;“ – Jaime 2011-03-18 16:08:31
听起来更容易替换-em-all,然后编写一个正则表达式来替换掉一些。 – 2011-03-18 16:19:08