2016-04-01 11 views
0

私は、次のソース文字列で正常に動作する正規表現式を得ることに手を必要とする:のstd ::正規表現の検索と置換が

<path d="M 1434.9,982.0 L 1461.3,982.0 L 1461.3,1020.5 L 1434.9,1020.5 z " stroke-width="1" stroke="#008000" fill="none"/> 

なラインで、私が影響を与えることなくstroke-widthstroke値を調整する必要があります残りのコンテンツ

これまではstrokeの値を置き換えてstroke-widthの値を置き換えて2段階に分けていますが、これは私が奇妙な結果を得る場所です。

スニペット

string s("<path d=\"M 1434.9,982.0 L 1461.3,982.0 L 1461.3,1020.5 L 1434.9,1020.5 z \" stroke-width=\"1\" stroke=\"#008000\" fill=\"none\"/>");     
std::regex re("stroke=\".+\" "); 
cout << "0. " << s << endl; 
s = std::regex_replace(s, re, "stroke=\"#00FF00\" "); 
cout << "1. " << s << endl; 
re = "stroke-width=\".+\" .*?"; 
s = std::regex_replace(s, re, "stroke-width=\"3\" "); 
cout << "2. " << s << endl; 

が出力

0.  <path d="M 1434.9,982.0 L 1461.3,982.0 L 1461.3,1020.5 L 1434.9,1020.5 z " stroke-width="1" stroke="#008000" fill="none"/> 
1.  <path d="M 1434.9,982.0 L 1461.3,982.0 L 1461.3,1020.5 L 1434.9,1020.5 z " stroke-width="1" stroke="#00FF00" fill="none"/> 
2.  <path d="M 1434.9,982.0 L 1461.3,982.0 L 1461.3,1020.5 L 1434.9,1020.5 z " stroke-width="3" fill="none"/> 

それは私が2.文字列出力のことを除いて探していますほとんど何、strokeフィールドが消えました!

私は現在std::regexを使用していますが、boost::regexも公開しています。 これに関する任意のポインタを気に入ってください。

答えて

1

.+は可能な限り多くの文字と一致するため、後で引用符が追加された場合は閉じ引用符を使用します。貪欲でないバージョン.+?を代わりに使用してください。

また、最後のパターンの末尾.*?は何も一致せず、削除することができます。

0

私はちょうど別の方法を試して、正規表現をあまり欲張りにしないようにしています。この場合はうまくいきます。

// changing the 1st regex to 
regex re("stroke=\".+?\" "); 

// and the 2nd to 
re = "stroke-width=\".+?\" "; 

この時間は、右の出力が得られます。

0.  <path d="M 1434.9,982.0 L 1461.3,982.0 L 1461.3,1020.5 L 1434.9,1020.5 z " stroke-width="1" stroke="#008000" fill="none"/> 
1.  <path d="M 1434.9,982.0 L 1461.3,982.0 L 1461.3,1020.5 L 1434.9,1020.5 z " stroke-width="1" stroke="#00FF00" fill="none"/> 
2.  <path d="M 1434.9,982.0 L 1461.3,982.0 L 1461.3,1020.5 L 1434.9,1020.5 z " stroke-width="3" stroke="#00FF00" fill="none"/> 
0

あなたは1つの正規表現で両方の値を置き換えることができます。

^(.*stroke-width=)(.*?)(\s.*stroke=["'])(.*?)(["'].*)$ 

例:

std::string text = R"(<path d="M 1434.9,982.0 L 1461.3,982.0 L 1461.3,1020.5 L 1434.9,1020.5 z " stroke-width="1" stroke="#008000" fill="none"/>)"; 
std::string result; 

char buff[100]; 
snprintf(buff, sizeof(buff), "$1\"%s\"$3%s$5", "5","#000000"); 
std::string replacement_text = buff; 

std::regex re(R"(^(.*stroke-width=)(.*?)(\s.*stroke=["'])(.*?)(["'].*)$)", 
      std::regex_constants::icase); 

result = std::regex_replace(text, re, replacement_text); 

cout << result << endl; 

コード放出する:

<path d="M 1434.9,982.0 L 1461.3,982.0 L 1461.3,1020.5 L 1434.9,1020.5 z " stroke-width="5" stroke="#000000" fill="none"/> 
関連する問題