2016-09-08 13 views
1

これは私の正規表現C言語での作業であり、何か問題があります。私はsedで使用されている構文、つまりs/findthisstring/replacewiththis/gを複製しようとしています。ここではfindthisstringが存在し、replacewiththisは存在しません。Posixの正規表現がC言語で動作しない

私が思いついた正規表現は、それが私がめちゃくちゃにされた部分が.+であると信じて私のコード

int verifyPattern(char *pattern) { 
    regex_t regex; 
    int reti = regcomp(&regex, "^s/(.*)/(.*)/g$", 0); 

    if (reti) { 
     fprintf(stderr, "Could not compile regex\n"); 
     exit(1); 
    } 

    reti = regexec(&regex, pattern, 0, NULL, 0); 
    if (!reti) { 
     puts("Match"); 
    } else if (reti == REG_NOMATCH) { 
     puts("No match"); 
    } else { 
     puts("Regex error"); 
    } 

    return 1; 
} 

である。ここ^s/(.*)/(.*)/g$

です。私が.*と置き換えるとすべてが問題ありません。誰もがこれのための回避策を知っている??

ありがとうございます!

+0

動作しないものを表示するようにテストケースを提供してください。 –

+0

なぜ正規表現のスラッシュをエスケープしていますか? '/'は正規表現エンジンのメタ文字ではありません。また、正規表現を解析する方法がわからない限り、埋め込み正規表現を見つけるのは簡単ではありません。 – sln

+0

'const char * str_regex ="^s /((\\\\。| [^ *)/ g $ ";} –

答えて

1

パターンに$を許可するように、REG_EXTENDEDフラグを渡すのを忘れました。また、あなたの正規表現は、あまりにも多くの/.../セクションを許可します。何が必要エスケープシーケンスまたは/\以外の文字のいずれかと一致することです:

int reti = regcomp(&regex, "^s/(\\\\.|[^\\\\/]+)+/(\\\\.|[^\\\\/]+)*/g$", REG_EXTENDED); 

C demo

は基本的に、私はエスケープシーケンス(\\.)のいずれかに合致する(\\.|[^\\/]+)パターンで.を置き換え参照しますか、 (|\および/以外の1つ以上の文字。ここで

は、テストのリストです:

verifyPattern("s/s/s/g");//Match 
verifyPattern("s/s//g");//Match 
verifyPattern("s//s/g");//No Match 
verifyPattern("s/s\\/s/g");//No match 
verifyPattern("s/s\\/s/text/text/text/g"); // No match 
関連する問題