我正在替換爲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