22 Ocak 2018 Pazartesi

std::regex_replace

Giriş
Şu satırı dahil ederiz.
#include <regex>
C++11 ile gelen bu sınıflar çok faydalı. Eskiden GNU ile gelen C tarzı metodları kullanır ve şu satırı dahil ederdik.
#include <regex.h>
Girdi olan string, örüntüye göre dönüştürülüp yeni bir string döner. C#'taki Regex.Replace metoduna benzer.
string result = Regex.Replace(input, pattern, replacement)
match_flag
Açıklaması şöyle
format_default  Use ECMAScript rules to construct strings in
                std::regex_replace
format_sed      Use POSIX sed utility rules in std::regex_replace. 
regex_replace - output iterator + input iterator begin + input iterator end + regex + format string
String yerine iterator ile çalışır. Şöyle yaparız.
std::ofstream fs ("filename");
std::string text = ...;


std::regex_replace(std::ostreambuf_iterator<char>(fs),
  text.begin(), text.end(), std::regex("(\\n+)"), "\n");
regex_replace - input string + regex + format string
Şöyle yaparız.
std::regex r("\\s+",  std::regex::optimize);
std::string test = ...;

std::string out = std::regex_replace(test, r, " ");
regex_replace - input string + regex + format string içinde back reference
Dönüşüm için back reference (capture group) değerleri kullanılabilir. Capture Group $n veya $nn şeklinde belirtilir.
$n

The nth capture, where n is a single digit in the range 1 to 9 and $n is not followed by a decimal digit. If n ≤ m and the nth capture is undefined, use the empty String instead. If n > m, the result is implementation-defined.

$nn

The nnth capture, where nn is a two-digit decimal number in the range 01 to 99. If nn ≤ m and the nnth capture is undefined, use the empty String instead. If nn > m, the result is implementation-defined.
Örnek
$nn şeklinde 01 sayısının kullanımı var.
regex regex_a( "(.*)bar(.*)" );
cout << regex_replace( "foobar0x1", regex_a, "$010xNUM" ) << endl;
Çıktı olarak şunu alırız
foo0xNUM
Örnek
$1 şeklinde kullanım var. Şöyle yaparız.
std::string text = "...";
std::regex re("...");
std::string out = std::regex_replace(text, re, "<$1>");
Diğer
boost::regex_replace \\1 şeklinde çapture group erişimine izin veriyor. Bu kullanım sanırım Perl tarzı. C++11 ile uyumlumu bilmiyorum.
string s = boost::regex_replace(
    string("Example_45-3"),
    boost::regex("[^0-9]*([0-9]+).*"),
    string("\\1")
    );

Hiç yorum yok:

Yorum Gönder