๋ฌธ์์ด ๋ฌธ์ ์์ ์ ์ฉํ๊ฒ ์ธ ์ ๊ทํํ์์ ๊ณต๋ถํด๋ณด์.
(http://sweeper.egloos.com/2999049 ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํด์ ์ ์์ต๋๋ค.)
· ํค๋ํ์ผ: <regex>
· ๊ด๋ จ ํจ์:
1) regex_match: ์ ๊ท์์ด ์ ์ฒด ๋์ ๋ฌธ์์ด๊ณผ ์ผ์นํ๋์ง ์ฌ๋ถ๋ฅผ ๋ฐํ(bool)
2) regex_search: ๋ฌธ์์ด์ด ์ ๊ท์๊ณผ ๋งค์น๋๋ sub string์ ํฌํจํ๊ณ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ฐํ(bool)
3) regex_replace: ์ ๊ท์ ํํ์์ replace ๋ฌธ์์ด๋ก ๊ต์ฒดํ๋ค. ๊ต์ฒด๋ ์ ์ฒด ๋ฌธ์์ด์ ๋ฐํํ๋ค.(string)
4) swap: ๋ basic_regex ๋๋ match_results ๊ฐ์ฒด๋ฅผ ๊ตํ ํฉ๋๋ค.(string)
· ์์ธ ์ค๋ช
1) std::regex_match ๋ ์ ์ฒด ๋ฌธ์์ด์ด ํน์ ๊ท์น(ํจํด)์ ๊ฐ๊ณ ์๋์ง ๋งค์นญํด๋ณผ ๋
- ์ฐธ๊ณ ๋ ํผ๋ฐ์ค: http://msdn.microsoft.com/en-us/library/bb982821(v=vs.100).aspx
string str("SookKaRak@gmail.com");
regex pattern("(\\w+[\\w\\.]*)@(\\w+[\\w\\.]*)\\.([A-Za-z]+)");
smatch m;
if (regex_match(str, m, pattern)){
for (size_t i = 0; i < m.size(); i++){
cout << i << "๋ฒ์งธ : " << m[i] << endl;
}
}
else{
cout << "NOT MATCH" << endl;
}
regex_match(str, m, pattern): str๋ฌธ์์ด์ด ์ ๊ท์ ํจํด pattern๊ณผ ์์ ํ ๋งค์นํ๋์ง ํ์ธํ๊ณ true or false๋ฅผ ๋ฆฌํดํ๋ค. ์ด ๋, ๊ทธ ๊ฒฐ๊ณผ ์งํฉ์ smatch ์ ์ฌ์ฉํ๋ค. ์ฆ, ()์์ ๋ด์ฉ์ ์ ์ฅํด ๋๋๋ฐ, m[0]์ ์ ์ฒด ๊ฒฐ๊ณผ ์งํฉ์ด ๋ค์ด ์๊ณ , m[1] ~ m[3]๊น์ง ๊ฐ๋ณ ๊ฒฐ๊ณผ๊ฐ ๋ค์ด ์๋ค.
(์ ์ฝ๋์ ํ์ ์ ๊ท์ ์ค๋ช )
โ (\\w+[\\w\\.]*): ์ฒซ๋ฒ์งธ \๋ ์ ๊ท์ ์์์ ๋ปํ๊ณ , ๋๋ฒ์งธ \w+๊ฐ ์ ๊ท์ ํ๋ณ ๊ธฐํธ๋ก ๋ฌธ์๊ฐ 1๊ฐ ์ด์ ์จ๋ค๋ ๋ง์ด๋ค. ๋ค \\w๋ ๋ฌธ์ 1๊ฐ, \\.๋ .๊ธฐํธ๋ฅผ ์๋ฏธํ๋๋ฐ, []*๋ก ํํ๋์ด ์์ผ๋ฏ๋ก w.์ผ๋ก ์์ํ๋ ๋ชจ๋ ๋ฌธ์์ด์ด ์จ๋ค๋ ์๋ฏธ๋ค.
โก (\\w+[\\w\\.]*): ์ฒซ๋ฒ์งธ \๋ ์ ๊ท์ ์์์ ๋ปํ๊ณ , ๋๋ฒ์งธ \๊ฐ ๊ธฐํธ๋ฅผ ๋ปํ๋๋ฐ, ํน์๋ฌธ์ ์์๋ ๋ฐ๋์ \๋ฅผ ์จ์ค์ผ ํน์ ๋ฌธ์์ด๋ก ์ธ์ํ๋ค. ์ฆ, ์ด ์ ๊ท์์ ์๋ฏธ๋ ํน์๋ฌธ์ . or - or / ๊ฐ ์จ๋ค๋ ๋ง์ด๋ค.
โข \\.: ๋ฌธ์. ์ด๋ผ๋ ์๋ฏธ. ํน์๋ฌธ์ ์์๋ \๊ธฐํธ๋ฅผ ๋ถ์ฌ์ค์ผ ํน์๋ฌธ์๋ก ์ธ์ํ๋ค.
โฃ ([A-Za-z]+): A-Z or a-z ๋ฌธ์์ด์ด ์ฌ๊ฑด๋ฐ, 1๊ฐ ์ด์ ์ฌ๊ฑฐ๋ ์๋ฏธ.
์ฆ, \w|W ์ [A-Za-z]๋ ๊ฐ์๋ง์ด๋ค. ๊ธฐํธ๋ฅผ ์ฌ์ฉํ๋, ์ง์ ์ ์ด์คฌ๋์ ์ฐจ์ด์ผ ๋ฟ!
2) std::regex_search ๋ ๋ฌธ์์ด๋ด์์ ํน์ ๋ฌธ์์ด์ ๊ฒ์ํ ๋
void SearchTest(){
string str("My email address is SooKkaRak@gmail.com");
regex pattern("(\\w+[\\w\\.]*)@(\\w+[\\w\\.]*)\\.([A-Za-z]+)");
smatch m;
if (regex_search(str, m, pattern)){
for (size_t i = 0; i < m.size(); i++){
cout << i << "๋ฒ์งธ : " << m[i] << endl;
}
else{
cout << "NOT MATCH" << endl;
}
}
}
์ฌ๋ฌ๊ฐ๊ฐ ํฌํจ๋์ด ์์ ๊ฒฝ์ฐ์๋ while๋ฌธ์ผ๋ก ๋ค์ ๋ถ๋ถ์ ์ฐพ๊ฒ ๊ตฌํ ํ๋ค.
void SearchTest(){
regex pattern("(\\w+[\\w\\.]*)@(\\w+[\\w\\.]*)\\.([A-Za-z]+)");
string str("Primary:SooKkaRak@gmail.com Secondary:Sweeper@yahoo.com");
smatch m;
while (regex_search(str, m, pattern)) {
for (size_t i = 0; i < m.size(); i++) {
cout << i << "๋ฒ์งธ : " << m[i] << endl;
}
cout << endl;
// ๋ค์ sub match๋ฅผ str๋ก ์
ํ
str = m.suffix();
}
}
smatch ๊ฐ์ฒด์ suffix() ํจ์๋ pattern์ ์ ์ ()์์ ๋ด์ฉ์ ์ ์ฅํด ๋๋ค. ๋ฌธ์์ด์์ ์ผ์นํ๋ ๋ง์ง๋ง ๋ถ๋ถ์ ์ํ์ค๋ฅผ ๊ฐ์ ธ์จ๋ค. ์ฌ๊ธฐ์๋ primary:~~~๋งค์นญ ํ, index๋ฅผ Primary:SooKkaRak@gmail.com๋์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ ธ์์ str์ ๋ค์ ๋ฃ์ผ๋ฏ๋ก Secondary:~~~๋ฅผ ํ์ํ ์ ์๋ ๊ฒ์ด๋ค.
3) std::regex_replace ๋ ๋ฌธ์์ด์ ์นํํ ๋
์ฐธ๊ณ ๋ ํผ๋ฐ์ค: http://msdn.microsoft.com/en-us/library/bb982317(v=vs.100).aspx
void ReplaceTest(){
string str("Primary:SooKkaRak@gmail.com Secondary:Sweeper@yahoo.com");
regex pattern("(\\w+[\\w\\.]*)@(\\w+[\\w\\.]*)\\.([A-Za-z]+)");
string result = regex_replace(str, pattern, string("$1@$2.net"));
cout << result << endl;
}
regex_replace(str, pattern, string("$1@$2.net"): str ๋ฌธ์์ด์์ ์ ๊ท ํํ์ pattern๊ณผ ์ผ์นํ๋ ๋ฌธ์์ด์ replace(3๋ฒ์งธ ์ธ์)์ ๊ต์ฒดํ ํ, ์ ์ฒด ๋ฌธ์์ด์ ๋ฐํํ๋ค.
์๋ ์์ ๋ ์ผ/์/์ฐ๋ ํ์์ ๋ ์ง๋ฅผ ์ฐ๋/์/์ผ์ ํ์์ผ๋ก ๋ฐ๊พธ์ด ์ค๋ค.
y/m/d๊ฐ์ ๋ธ๋ฆฌ๋ฏธํฐ๋ /(์ฌ๋์ฌ), -(ํ์ดํ), .(๋ง์นจํ) ์ธ ๊ฐ์ค ํ๋๊ฐ ๋ ์ ์๋ค.
string format_date(const string& date){
// 5๊ฐ์ ํ์ ํํ์
const regex pattern("(\\d{1,2})(\\.|-|/)(\\d{1,2})(\\.|-|/)(\\d{4})");
// ์ญ์ฐธ์กฐ๋ฅผ ์ญ์์ผ๋ก ๋์ดํ๋ replacer
string replacer = "$5$4$3$2$1";
return regex_replace(date, pattern, replacer);
}
int main(){
string date1 = "1/2/2008";
string date2 = "12.08.2008";
cout << date1 << " -> " << format_date(date1) << endl;
cout << date2 << " -> " << format_date(date2) << endl;
}
regex_replace(date, pattern, replacer): () ๊ดํธ ํ๋๋ฅผ ์ผ์ชฝ๋ถํฐ $1, $2, $3, $4, $5๋ก ํํํ๋๋ฐ, $1 ~ $5๋ก ํํ๋ ๋ฌธ์์ด date๋ฅผ $5 ~ $1๋ก ์์๋ฅผ ๋ฐ๊พธ๊ฒ ๋ค๋ ์๋ฏธ๋ค.
(์ ์ฝ๋์ ํ์ ์ ๊ท์ ์ค๋ช )
โ \\d{1,2}: ์ฒซ๋ฒ์งธ \๋ ์ ๊ท์ ์์์ ๋ปํ๊ณ , ๋๋ฒ์งธ \d๊ฐ ์ ๊ท์ ํ๋ณ ๊ธฐํธ๋ก ์ญ์ง์ ์ซ์ ํ๋๋ฅผ ๋ปํ๋ค. ๋ค์ {}๋ ์ ์ ๊ท์ \d์ ๊ฐ์๋ฅผ ์๋ฏธํ๋ค. ์ฆ ์ด ์ ๊ท์์ ์๋ฏธ๋ ์ญ์ง์ ์ซ์ 1~2๊ฐ๊ฐ ์๋ค๋ ๋ง์ด๋ค.
โก \\.|-|/: ์ฒซ๋ฒ์งธ \๋ ์ ๊ท์ ์์์ ๋ปํ๊ณ , ๋๋ฒ์งธ \๊ฐ ๊ธฐํธ๋ฅผ ๋ปํ๋๋ฐ, ํน์๋ฌธ์ ์์๋ ๋ฐ๋์ \๋ฅผ ์จ์ค์ผ ํน์ ๋ฌธ์์ด๋ก ์ธ์ํ๋ค. ์ฆ, ์ด ์ ๊ท์์ ์๋ฏธ๋ ํน์๋ฌธ์ . or - or / ๊ฐ ์จ๋ค๋ ๋ง์ด๋ค.
โข \\d{4}: ์ซ์์ด๊ณ 4 ์๋ฆฌ ์๋ผ๋ ์๋ฏธ์ด๋ค.
· ๊ธฐํ ํ์ ํํ์
\\d* : ์์์ ๊ฐ์์ ์ซ์๋ฅผ ์๋ฏธ
\\d+: ์ซ์ 1๊ฐ ์ด์์ ์๋ฏธ
\\d?: ์ซ์ 0๊ฐ or 1๊ฐ ์ด์์์ ์๋ฏธ
\\d{3}: ์ซ์ 3๊ฐ๋ผ๋ ์๋ฏธ. ๋ง์ฝ 1234๊ฐ ๋ค์ด์๋ค๋ฉด Matching or Search๊ฐ false๋ฅผ ๋ฆฌํดํจ.
\d{3,4}: ๋ฌธ์์ด์ด ์ซ์๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ, 3 or 4์๋ฆฌ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค๋ ์๋ฏธ
[0-9]: 0-9๋ก ์ด๋ฃจ์ด์ ธ์๋ค๋ ์๋ฏธ
[01]{3}: 0ํน์ 1๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ํด๋น ์ข ๋ฅ์ ๋ฌธ์๊ฐ 3๋ฒ ๋ํ๋ ์ ์๋ค๋ ์๋ฏธ
\w*: ์์์ ๋ฌธ์๋ฅผ ์๋ฏธ
\.: ๋ฌธ์ .์ ์๋ฏธ(๊ทธ๋ฅ .์ฐ๋ฉด ์์์ ๋ฌธ์๋ก ๊ฐ์ด ํด์๋จ)
[A-Za-z]+: A-Z์ a-z๊น์ง์ ์ํ๋ฒณ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค๋ ์๋ฏธ
[A-Z]+: A-Z๊น์ง ๋ฌธ์๊ฐ 1๊ฐ ์ด์ ์๋ค๋ ์๋ฏธ
[a-z]: a-z๋ก ์ด๋ฃจ์ด์ ธ์๋ค๋ ์๋ฏธ
[A-Z]{1,5}: A-Z๊น์ง์ ๋ฌธ์๊ฐ ์ต์ 1๊ฐ, ์ต๋ 5๊ฐ ์กด์ฌํ๋ค๋ ์๋ฏธ
· ๊ด๋ จ๋ฌธ์