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件)
- 最新から表示
- 回答順に表示
No.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という変数を作る必要がないです。
No.2
- 回答日時:
VS2015もC++11も詳しくなく、むしろ教えて欲しい位なのですが、Unicode を想定されていますか?
本の虫さん曰く Unicode 使うなら「正規表現ライブラリを使うべき」
http://cpplover.blogspot.jp/2015/01/c-stdregex.h …
と仰ってます処、私も内容が判らず…
なお、質問のコードについては無問題かと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで数字のみを2倍3倍にする...
-
PHPで あるフォルダ内の、特定...
-
正規表現でシングルクォーテー...
-
「半角数字」と「+」を許可する...
-
正規表現 先頭一桁をマッチさせ...
-
日本語の文字列のみをURLエンコ...
-
PHPの「ereg」って何の略で...
-
URLを抽出する正規表現
-
、"(ダブルクォーテーション)...
-
正規表現での英字+ハイフンの...
-
アンカーリンク 正規表現
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
テキストファイルから改行コー...
-
エスケープ文字の復帰(¥r)と...
-
文字の入力で横バー上段、中断...
-
グレープシティのSPREAD...
-
エクセルのCOUNTIFが正しくカウ...
-
UTF8メールがLotus Notesで文字...
-
jsp 改行コードで改行させて表...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを使ってHTMLソースから特定...
-
、"(ダブルクォーテーション)...
-
preg_matchでエラーが出ます。
-
PHPで変数から1行目だけを取得...
-
PHPの「ereg」って何の略で...
-
PHPの正規表現で住所を分けるに...
-
PHPで あるフォルダ内の、特定...
-
Excelで数字のみを2倍3倍にする...
-
正規表現で「0」のみ抽出
-
PHPで<a>タグ内からURLと文字を...
-
住所から特定の文字列、数値を...
-
正規表現で、半角大文字と半角...
-
正規表現で特定のHTMLタグのク...
-
正規表現でシングルクォーテー...
-
正規表現パターンの記入方法に...
-
Smartyで部分一致
-
preg_matchでのマッチが正しく...
-
正規表現を使いimgタグ内から幅...
-
PHPメールフォーム URLと半角...
-
電話番号のチェック ハイフン...
おすすめ情報