質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

1回答

996閲覧

拡張正規化表現を使って関数、クラス、enumを認識さ強調表示させたい。

退会済みユーザー

退会済みユーザー

総合スコア0

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2021/09/12 08:16

編集2021/09/12 09:09

###やりたい事
正規化表現「Regex」を使って関数、クラス、enumを認識させたい。

###質問内容
提示コードですがこれはnanoエディタのシンタックスハイライトの設定ファイルです。この設定ファイルに関数、クラス、enumを認識させて色を変化させたいのですが調べて構文を確認しましたが実装方法がわかりません。

color [bold,][italic,]fgcolor,bgcolor start="fromrx" end="torx" 開始が拡張正規表現「fromrx」に一致し、終了が拡張正規表現「torx」に一致するすべてのテキストを、指定された前景色と背景色でペイントします。少なくとも1つを指定する必要があります。これは、「fromrx」の最初のインスタンスの後、「torx」の最初のインスタンスまでのすべてのテキストが色付けされることを意味します。これにより、構文の強調表示を複数行にまたがることができます。

###参考サイト
A: https://qiita.com/yynsmk/items/cc6591178e732d3f7b7a
B: https://userweb.mnet.ne.jp/nakama/
C: http://www.turtle.gr.jp/techno/regular-expression.html
D: https://www.nano-editor.org/dist/latest/nano.html#Syntax-Highlighting(8.2構文の強調表示)

nanorc

1## Here is an example for C/C++. 2 3syntax c ".([ch](pp|xx)?|C|cc|c++|cu|H|hh|ii?)$" 4header "-*-.*\<C(++)?((;|\s).*)?-*-" 5magic "^(C|C++) (source|program)" 6comment "//" 7 8# Constants. 9color blue "\<[A-Z_][0-9A-Z_]+\>" 10# Labels. 11color magenta "^[[:space:]]*[A-Z_a-z]+:[[:space:]]*$" 12 13color blue "\<(float|double|bool|char|int|short|long|sizeof|enum|void|auto|static|const|struct|union|typedef|extern|(un)?signed|inline|true|false)\>" 14color blue "\<([[:lower:]][[:lower:]_]*|(u_?)?int(8|16|32|64))_t\>" 15color blue "\<(class|namespace|template|public|protected|private|typename|this|friend|virtual|override|using|mutable|volatile|register|explicit)\>" 16color blue "\<(for|if|while|do|else|case|default|switch)\>" 17color blue "\<(try|throw|catch|operator|new|delete)\>" 18color blue "\<(goto|continue|break|return)\>" 19color magenta "'([^']|(\["'abfnrtv\]))'" "'\(([0-3]?[0-7]{1,2}))'" "'\x[0-9A-Fa-f]{1,2}'" 20 21# GCC builtins. 22color cyan "__attribute__[[:space:]]*(([^)]*))" "__(aligned|asm|builtin|hidden|inline|packed|restrict|section|typeof|weak)__" 23 24# Strings. In general you will want your strings and comments to come last, 25# because highlighting rules are applied in the order they are read in. 26color blue ""([^"]|\")*"" "#[[:space:]]*include[[:space:]]+<[^[:blank:]=]*>" 27# Multiline strings. This regex is VERY resource intensive, 28# and sometimes colours things that shouldn't be coloured. 29###color brightyellow start=""(\.|[^"])*\[[:space:]]*$" end="^(\.|[^"])*"" 30 31# Preprocessor directives. 32color magenta start="^[[:space:]]*#[[:space:]]*(if(n?def)?|elif|warning|error|pragma)\>" end="(\`|[^\])$" 33color magenta "^[[:space:]]*#[[:space:]]*(define|else|endif|include(_next)?|undef)\>" 34 35# Comments. 36color green "//.*" 37#color brightblue "//.*" 38 39color green start="/*" end="*/" 40 41# Reminders. 42color brightwhite,yellow "\<(FIXME|TODO|XXX)\>" 43 44# Trailing whitespace. 45#color ,green "[[:space:]]+$"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

理論的に不可能です。

C言語など、多くのプログラミング言語の文法は文脈自由文法によって定義されていますが、これは正規表現より扱える幅が広い文法です。

端的に言えば、いくつあるかわからないカッコのネストに対して「対応するカッコ」を拾うことが、正規表現では不可能なのに対して文脈自由文法では可能です。

投稿2021/09/12 08:52

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/09/12 08:54

関数はできそうな気がするのですが無理なのでしょうか?
maisumakun

2021/09/12 08:57

適当でよければできるかもしれませんが、完璧にやることは不可能です。 関数の引数や返り値自体が関数ポインタを含んでさらにカッコが発生する状態になりうるので、「どれが関数か」完全に判定するには、無限のカッコに対してマッチさせる必要があり、正規表現の能力では足りません。
退会済みユーザー

退会済みユーザー

2021/09/12 09:03

ちょとそれますがIEDの配色はどうやって認識しているのでしょうか?
maisumakun

2021/09/12 09:06

当然、(正規表現より複雑な処理を行って)文法を認識して処理しています。
退会済みユーザー

退会済みユーザー

2021/09/12 09:08

拡張正規表現「fromrx」を使っても無理なのでしょうか?何度もすいません。
maisumakun

2021/09/12 09:12

EREは、BREを書きやすくした程度のもので、扱える文法の範囲は同じです。
Zuishin

2021/09/12 09:15 編集

「fromrx」という意味不明な言葉を使うなら引用しろよ。 https://www.nano-editor.org/dist/v3/nano.html fromrx というのは開始を表す正規表現に仮にあてがわれた文字列(from regular expression)であり、それ以上の意味はありません。 「拡張正規表現」は普通の正規表現のことです。
退会済みユーザー

退会済みユーザー

2021/09/13 11:31 編集

今更質問ですがvimでは括弧( { } )を選択すると対応する括弧( { } )も強調してくれるのですがそれはnano エディタでは不可能ということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問