2011-03-18 128 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]+\;)/ 

這個匹配&字符,其後面沒有正常字加上分號。

但是,並非所有的系統都支持預讀。如果你不這樣做,那麼你必須首先替換所有的&,然後將錯誤的轉換回來。如果沒有消極的環視,正則表達式在不是匹配的東西。