2015-11-15 17 views
6

Iは、次の正規表現しようとした:私は、正規表現が完全に正確であろうと予想し、グループが発見されるC++正規表現での改行のマッチング方法は?

const static char * regex_string = "([a-zA-Z0-9]+).*"; 

void find_first(const std::string str); 

int main(int argc, char ** argv) 
{ 
     find_first("0s7fg9078dfg09d78fg097dsfg7sdg\r\nfdfgdfg"); 
} 
void find_first(const std::string str) 
{ 
     std::cout << str << std::endl; 
     std::regex rgx(regex_string); 
     std::smatch matcher; 
     if(std::regex_match(str, matcher, rgx)) 
     { 
       std::cout << "Found : " << matcher.str(0) << std::endl; 
     } else { 
       std::cout << "Not found" << std::endl; 
     } 
} 

DEMO

を。しかし、そうではありませんでした。どうして? C++の正規表現で改行をどのように一致させることができますか? Javaではうまく動作します。

+0

正規表現IIRCでは '$'です。 –

+0

'。*'の代わりに '(。| \ r \ n)*'をマッチさせましたか? – Zereges

答えて

4

通常、dot in regexは、改行以外の任意の文字に一致します。std::ECMAScript syntax

.    ラインターミネータ(LF、CR、LS、PS)を除く任意の文字を改行しません。多くの正規表現のフレーバーで

0s7fg9078dfg09d78fg097dsfg7sdg\r\nfdfgdfg 
[a-zA-Z0-9]+ matches until \r ↑___↑ .* would match from here 

ドットも改行を一致させるために利用できるDOTALLフラグがあります。

ていない場合は、そのようなクラスで一緒に[^]ない何もまたは[\S\s]空白または非空白\n

regex_string = "([a-zA-Z0-9]+)[\\S\\s]*"; 

またはオプションのラインを使用するなど、任意の文字でウィッヒ結果として、異なる言語での回避策があります休憩:([a-zA-Z0-9]+).*(?:\\r?\\n.*)*または([a-zA-Z0-9]+)(?:.|\\r?\\n)*

See your updated demo

+0

よろしくお願いします。あなたは私が望むものを捕まえました。 –

1

あなたはお試しくださいconst static char * regex_string = "((.|\r\n)*)"; 私はそれがあなたを助けてくれることを願っています。

+0

あなたは '\'文字をエスケープする必要があります – Sopel

+0

hmm、\ charsの代わりに\\を使用してください。 –

+0

または、生の文字列 'R"((。| \ r \ n)*)) " – Broxzier