2011-03-18 41 views
1

我正在替换为xml,并且只有在&字符以分号结尾时,我需要用&替换&字符。C++/Boost字符串替换:如何将'&'替换为'&',仅当以&;结尾时;

当然,我可以用replace_if,replace_all或boost中的正则表达式支持来做到这一点,但我今天有些愚蠢......似乎找不到我需要的东西。

对此提出建议?

+1

'&hello world;'?你需要更多的约束。 – 2011-03-18 16:06:01

+0

在这种情况下,空格将允许匹配,必须是连续的。这是为xml记住哪些不允许和不使用&。我只是不想将“>”替换为“&”;“ – Jaime 2011-03-18 16:08:31

+0

听起来更容易替换-em-all,然后编写一个正则表达式来替换掉一些。 – 2011-03-18 16:19:08

回答

0

它不应该那么辛苦。使用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("&amp;"); 
     } else { 
      results.append('&'); 
     } 
     ++ current; // Skip '&', processed above 
     next = std::find(current, end, '&'); 
    } 
    results.append(current, next); 
    return results; 
} 
0

您可以尝试使用下面的正则表达式负前瞻:

(&)(?!\S*;) 

,只有当它不是后面紧跟着一个;非空白字符(S)一&匹配。

Perl script using above regex

我不知道,如果升压正则表达式允许负先行。

+0

以下或以......结尾?我的正则表达式是生锈的。 – Jaime 2011-03-18 16:16:15

+0

@Jaime:答复已更新。 – codaddict 2011-03-18 16:17:34

1

我相信sed表达s/&([^ ]*);/&amp;\1;/g会做你正在寻找的替代品。我不熟悉boost的字符串替换,但文档说它支持sed样式常规表达式。

编辑:在sed中测试它后,表达式似乎需要更多的转义。 s/\&\([^ ]*\);/\&amp;\1;/g适用于我的测试用例。

编辑2:略提高的表达,和一个故障:

s#&\([^[:space:]]*\);#\&amp;\1;#g

输入模式:

&与文字字符开始&

\([^[:space:]]*\)匹配并捕获任何数量的非空白字符

;以文字结尾;

输出模式:

\&文字字符&(需要在输出图案进行转义因为&通常表示存在整个匹配的字符串)

amp;字面

\1打印背面的捕获的非空白字符串

;字面;

0
  1. 更换&与&放大器;
  2. 替换& amp; amp;与& amp;
  3. 利润

(空格插入防止计算器本身替换它们!)

0

您可以使用排除使用先行?

/\&(?![A-Za-z]+\;)/ 

这个匹配&字符,其后面没有正常字加上分号。

但是,并非所有的系统都支持预读。如果你不这样做,那么你必须首先替换所有的&,然后将错误的转换回来。如果没有消极的环视,正则表达式在不是匹配的东西。