プロが教えるわが家の防犯対策術!

Visual Studio 2015のWin32コンソールアプリケーションを
作成しています。
Cのソースファイル(拡張子が.c)内で正規表現を使いたいです。

ですが、Cの標準ライブラリには正規表現がないので、
C++の標準ライブラリを部分的に使おうと思います。
(Visual Studio 2015のC++はC++11に準拠しているので
正規表現の機能があります)
正規表現を使用しているソースのみをcppファイルで作成します。

以下ソースでそれらしく動いていますが、myregex.cpp内で
例外が発生したときは、is_match関数内部で例外をキャッチ後
つぶしてreturn 0するよう改造しようとは思っています。

【質問事項】
「その他何か考慮した方がよいことがあればおしえてください。
また、この方式でなくて特に新しい外部ライブラリを使用せずに
パターンマッチング、後置参照が可能な方法があれば教えてください。」

boostはインストールが大変そうだし、鬼車はサイトが消えてるし、
ライセンスの絡みが面倒くさいのであまり外部ライブラリを使用したく
ありません。

諸事情のためmain.cをmain.cppにするつもりはありません。
(全体をC++コンパイルするつもりはないということ。)


【ファイル構成】
main.c:呼び出し元
myregex.cpp:正規表現を使っている関数が定義
myregex.h:正規表現を使っている関数を宣言

-----------------------------(ソースここから)-------------------------------
■myregex.h
#pragma once

int is_match(char *target, char *pattern);


■myregex.cpp
#include <iostream>
#include <regex>

using namespace std;

extern "C" {
#include "myregex.h"
}

int is_match(char *target, char *pattern) {
    regex re(pattern);
    smatch ret;
    string str = target;
    if (regex_match(str, ret, re) == 1) {
        return 1;
    }
    else {
        return 0;
    }
}


■main.c
#include <stdio.h>
#include "myregex.h"

int main() {
    printf("ret = %d\n", is_match("abc", "a.*c"));
}

A 回答 (3件)

提示の方針で、問題ないと思います。

仰るとおり、例外(std::regex_error)のcatchをis_matchの中でする必要があります。

>その他何か考慮した方がよいことがあればおしえてください。
単純に、マッチしたかどうかではなくて、マッチした文字列とか部分文字列とかを返したい場合には、文字列のメモリ管理を少しだけ気をつける必要がありますかね。
(たいした話ではないですけど)

あとは、細かいですが、
int is_match(char *target, char *pattern) は、
int is_match(const char *target, const char *pattern) にしたほうがよいか。
この場合、is_match関数内で、string strという変数を作る必要がないです。
    • good
    • 0

VS2015もC++11も詳しくなく、むしろ教えて欲しい位なのですが、Unicode を想定されていますか?



本の虫さん曰く Unicode 使うなら「正規表現ライブラリを使うべき」
http://cpplover.blogspot.jp/2015/01/c-stdregex.h …
と仰ってます処、私も内容が判らず…

なお、質問のコードについては無問題かと思います。
    • good
    • 0

C言語でもCOMは使えるので vbscript.dll の正規表現を使われるとか。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!