Agora que tenho um sistema funcional capaz de compilar tanto expressões regulares quanto strings literais puras, é hora de mostrar a você como simplificar mais ainda os exemplos tratados aqui.
Basicamente, uma string literal pura é um string na qual os caracteres de saída (como \n \t ou \”) do C++ não são processados. Uma string literal pura começa com R”( e termina em in)”, vamos ver em um in um exemplo da diferença entre uma string normal e uma string pura em C++:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string normal_str="First line.\nSecond line.\nEnd of message.\n";
string raw_str=R"(First line.\nSecond line.\nEnd of message.\n)";
cout<<normal_str<<endl;
cout<<raw_str<<endl;
return(0);
}
normal_str será processado na hora da compilação, então você verá três linhas de texto e uma linha vazia. No caso da variável raw_str, que é uma string literal, o compilador não irá processar os caracteres de saída, então você verá uma única linha de texto com um conteúdo idêntico àquele que você tem no código fonte do C++.
Se você compilar e executar o código acima, salvo em um arquivo chamado “raw_string_00.cpp”, isto é o que você deve ver:
sol@sol:~$ clang++ -std=c++0x -stdlib=libc++ raw_string_00.cpp
sol@sol:~$ ./a.out
First line.
Second line.
End of message.
First line.\nSecond line.\nEnd of message.\n
sol@sol:~$
Se você não tiver clang-3.1 and libc++ na sua máquina, você também pode compilar o código acima com g++-4.6. Nesse caso, você usaria esta linha para compilar o código:
g++ -std=c++0x raw_string_00.cpp
A parte acima não pode ser compilada com o Visual Studio 2010, que não oferece suporte para strings literais puras, quando da escrita deste artigo.
Uma primeira aplicação do conceito de string pura é na simplificação da sintaxe das expressões regulares. O codificador pode colocar todo seu esforço em escrever uma expressão regular de acordo com o padrão ECMAScript e não em se certificar de que sua expressão regular será processada corretamente pelo compilador.
Pegue por exemplo a expressão regular usada neste artigo para verificar se o input do usuário era um número inteiro. Sem strings puras é assim que o código deve ser (e se você quiser usá-lo com o VS 2010, deve mantê-lo desta maneira):
regex integer("(\\+|-)?[[:digit:]]+");
Usando uma string pura, podemos simplificar a parte do código acima, podemos retirar os caracteres de saída:
string raw_pattern=R"((\+|-)?[[:digit:]]+)";
regex integer(raw_pattern);
ou uma versão mais condensada:
regex integer(R"((\+|-)?[[:digit:]]+)");
Um padrão para números correspondentes pode ser escrito desta maneira:
...
string input;
regex rr(R"(((\+|-)?[[:digit:]]+)(\.(([[:digit:]]+)?))?((e|E)((\+|-)?)[[:digit:]]+)?)");
cout<<"Give me a real number!"<<endl;
cin>>input;
if(regex_match(input,rr))
cout<<"float"<<endl;
else
{
cout<<"Invalid input"<<endl;
}
...
Para aqueles interessados em aprender a sintaxe do novo C++11, eu recomendo a leitura do Professional C++, de M. Gregoire, N. A. Solter e S. J. Kleper:

Se você quiser aprender mais sobre expressões regulares, a melhor fonte no campo é o livro Mastering Regular Expressions, de Jeffrey E.F. Friedl:

?
Texto original disponível em http://solarianprogrammer.com/2011/10/16/cpp-11-raw-strings-literals-tutorial/








