0

これは私のコードです:

#include <iostream>
#include <string.h>
#include <regex>

using namespace std;

int main () {

    string test = "COPY" ;
    regex r1 = regex ("(COPY\b)(.*)") ; 
    if (regex_match (test,r1) ) {
        cout << "match !!" ;
    } else {
        cout << "not match !!";
    }

わかりました、このコードは私に「一致!!」を出力すると思いました 、そしてそれが私が欲しかったものです。
しかし、それは私に「一致しません!!」を与えます。
私は何をすべきか ?

注意:
"COPY" を一致させたいのですが、"COPYs" や "COPYYY" は一致させたくないので、コードで "\b" を使用しました。

4

2 に答える 2

2

文字はC / C ++の「エスケープ」シーケンスであるため、改行を入れるときのように、2文字ではなく1文字であっても使用する\bため、あなたは二重エスケープする必要があります。したがって、式は this:から this: になります。\\n"(COPY\b)(.*)""(COPY\\b)(.*)"

極端な場合、\正規表現の文字に一致させたい場合は、これが必要です。文字はエスケープ文字でもあるため、エスケープをエスケープしているためです"\\\\"\

参考までに、これが.NETで正規表現に生の文字列構文を使用することが多いため、エスケープする必要はありません。他の一部の言語ではこれがエスケープ文字として使用されないため、正規表現の方が簡単です。

于 2013-02-02T14:58:00.853 に答える
1

まず、括弧を修正します(ifステートメントで)。

次に試してください:

regex r1 = regex ("(COPY)(\\b|$)") ;

これは、' COPY ' の後にワード ブレークまたは文字列の末尾を探します。

つまり、コードは次のようになります。

#include <iostream>
#include <string.h>
#include <regex>

using namespace std ;

int main () {

    string test = "COPY" ;
    regex r1 = regex ("(COPY)(\\b|$)") ; 
    if (regex_match (test,r1) ) {
        cout << "match !!" ;
    } else {
        cout << "not match !!";
    }
}
于 2013-02-02T14:51:08.730 に答える