
findstrの正規表現を使ってC/C++の関数名を取得したいです。
どのようにしたらよいのでしょうか?
途中までは以下かなと思っていますが、最後の「)」の記述をどうすればよいのか分かりません。
^[a-zA-Z][a-zA-Z0-9].*
関数は以下のように3パターン書かれています。
int hoge(void) { return hoge; }
void hoge(int hoge)
{
}
void hoge( int hoge1
int hoge2
int hoge3
)
{
}
すみませんがどなかたご教授ください。
No.5ベストアンサー
- 回答日時:
No1、4です。
findstr /r /c:"^[A-Za-z_][A-Za-z_0-9]* [A-Za-z_][A-Za-z_0-9]*("
と、/r /c: オプションをつけることで空白も使えました。
ご回答ありがとうございます。
ご指摘のとおり”(”ですね。失礼しました。
結果ですが、だめでした。
最後の”(”を無くすと、ファイル先頭の方ににある、
変数や関数宣言も検出しちゃいましたが、
目的の関数は漏れなく検出していますので、使わせていただきます。
ありがとうございました。
No.6
- 回答日時:
どの程度の精度で考えてますか?
完全なものは正規表現では無理です。
下記のようなケースについて
「検出できなくてもいい/絶対検出したい」
「関数名で無いものを誤検出してもいい/誤検出は困る」
「検出できるようにC++のソースを書き換えるからいい/書き換えないで対応したい」
等を考え、それに合せた方法(他のツールを使う、等も含める)を使います。
C++ では、ただの改行と空白は同じ扱いなので
int hoge(int hoge1){}
と
int
hoge
(
int
hoge1
)
{
}
とは同じです。
前者で統一されていれば、正規表現である程度の精度で検索できますが、後者の場合は(findstrでは)無理です。
※ たしか、複数行にわたる検索に対応していなかったはず
classHoge hoge(Fuga) ;
は、文脈によって
・classHoge型変数 hoge の宣言 。コンストラクタの引数に Fuga を指定
・classHoge型関数 hoge のプロトタイプ宣言 。引数に Fuga型
と違う解釈ができます。単純に文字列だけを見るfindstrでは、分別不可能です。
関数宣言文で検索するなら、名前に :: が含まれるケースを考慮する必要があるでしょう。
namespaceHoge::classHoge namespaceHoge::classHoge::hoge(namespaceFuga::classFuga fuga1){}
厳密にやるなら、 :: と連続していることを調べる必要があります。
文法チェックはコンパイラにまかせるなら、 : を「関数名に使える文字」として扱うという方法があります。
_ (アンダースコア) は関数名に使えます。
先頭にも使えます。
但し、先頭に使うと予約名になってしまう場合があるので、自作部分での使用は避けた方がよいでしょう。
https://msdn.microsoft.com/ja-jp/library/Cc44018 …
「予約名の形式」
ご回答ありがとうございます。
不足はNGですが、余計に検出はOKです。
一手間いりますが、artoo(No5)さん案でいけそうです。
No.4
- 回答日時:
>関数名といえば「int hoge(void)」の内、hogeになると思っていました。
それで正しいのですが、質問文中に書かれている書きかけ正規表現では、それが行頭にあるものを探そうとしているようなので、???となってしまいました。
で、探すときには「英字で始まり英数字が続くものに(が後続するもの」かと思ったのですが、最後の「)」という記述もあり、これも???となってしまいました。
(行頭)型名(空白) 関数名(
を探すとすると、findstr "^[A-Za-z_][A-Za-z_0-9]* [A-Za-z_][A-Za-z_0-9]*(" でいいかと思ったのですが、findstr は空白は「または」の意味になるのでこれでは駄目です。実用的には、空白の代わりに「.」を指定して、
findstr "^[A-Za-z_][A-Za-z_0-9]*.[A-Za-z_][A-Za-z_0-9]*("
でどうでしょうか。空白が複数個というケースもあるのなら、「.*」と書かざるを得ず、他の物も引っかかりそうですが、コーディングルールで質問文中の3パターンしか無いと言うことであれば大丈夫ですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
system関数がうまくいかない
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
「{ } で囲むだけ」は正しい?
-
実数の整数部,小数部の取得
-
PowerShellがうまくいかない
-
(int *)の意味
-
商と剰余を同時に求める(C言語)
-
【C++】関数ポインタの使い方
-
ColorをRGBで指定する方法
-
int型の変数値をバイト列として...
-
四捨五入方法
-
c言語のenum
-
非常に
-
VC++の配列で
-
systemの戻り値を取得する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
最早開始時間と最遅完了時刻を...
-
【C++】関数ポインタの使い方
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
実数の整数部,小数部の取得
-
「{ } で囲むだけ」は正しい?
-
if と配列の組み合わせ
-
ColorをRGBで指定する方法
-
acceptをalarmでタイムアウトさ...
-
systemの戻り値を取得する方法
-
足して100になるような乱数のア...
-
PowerShellがうまくいかない
-
int型の変数値をバイト列として...
-
構造体の勉強中です 合計点の高...
-
std::set<int> で、ある値が何...
おすすめ情報