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

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

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

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

Q&A

解決済

3回答

1642閲覧

javaScriptの正規表現でC/C++の#includeの後の<>にマッチさせる

yumetodo

総合スコア5850

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

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

0グッド

0クリップ

投稿2016/03/24 05:44

編集2016/03/24 08:02

現在syntaxhighlighterを使って自分のブログでソースコードを色付けしているのですが

http://freesofutotravel.blog94.fc2.com/blog-entry-22.html
をみると分かる通り

cpp

1#include <iostream> 2#include <string> 3#include <vector> 4#include <stdexcept> 5#include <algorithm>

のようにあると、vectorとかstringに緑色の色がついてしまいます。
イメージ説明

syntaxhighlighterの置換リストは

js

1 this.regexList = [ 2 { regex: /#[ ]*(?:define|error|import|undef|elif|include|using|ifdef|line|ifndef|if|pragma|else|endif)/g, css: 'preprocessor' }, 3 { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments 4 { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments 5 { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings 6 { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings 7 { regex: /!(?:defined)/g, css: 'preprocessor' }, 8 { regex: new RegExp(this.getKeywords(preprocessor_word), 'gm'), css: 'preprocessor' }, 9 { regex: new RegExp(this.getKeywords(typedefined), 'gm'), css: 'color1 bold' }, 10 { regex: new RegExp(this.getKeywords(macro), 'gm'), css: 'color2 bold' }, 11 { regex: new RegExp(this.getKeywords(reserved), 'gm'), css: 'keyword bold' } 12 ]; 13

のようになっていて
(js全体:shBrushCpp_kai.js)
vectorとかstringがtypedefinedにマッチするので緑色になっています。

で、#include と同じ行かつ#includeの後にある<>にマッチする正規表現と言うのは書けるものなのでしょうか?書けるとしたらどのようにかけばいいでしょうか?

追記

@tozjp 氏の修正を

js

1new RegExp(this.getKeywords(typedefined) + "(?!>$)", 'gm')

のようにしても変わらなかったです
イメージ説明

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

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

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

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

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

guest

回答3

0

ちょっとSyntaxHighlighter.jsのソースを読んでみたんですが、マッチングパターン以外に処理用の関数を設定できるみたいですよ?

javascript

1function getMatches(code, regexInfo) 2{ 3 function defaultAdd(match, regexInfo) 4 { 5 return match[0]; 6 }; 7 8 var index = 0, 9 match = null, 10 matches = [], 11 func = regexInfo.func ? regexInfo.func : defaultAdd 12 ; 13 14 while((match = regexInfo.regex.exec(code)) != null) 15 { 16 var resultMatch = func(match, regexInfo); 17 18 if (typeof(resultMatch) == 'string') 19 resultMatch = [new sh.Match(resultMatch, match.index, regexInfo.css)]; 20 21 matches = matches.concat(resultMatch); 22 } 23 24 return matches; 25};

処理用の関数が未定義の場合は、defaultAddが使われるみたいですので、たとえば、

javascript

1{ regex: /#include (<.+>)/g, 2 css: 'preprocessor', 3 func:function(match, regexInfo){return match[1]} 4},

みたいに書いたら動くんじゃないでしょうか。(コードは適当です)

投稿2016/03/24 10:00

Lhankor_Mhy

総合スコア35871

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

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

yumetodo

2016/03/24 11:13

うう、BA決めた後に回答に気がついた、すみません。 なるほど、関数も指定できるのか、試してみます
guest

0

ベストアンサー

「#include と同じ行かつ#includeの後にある<>にマッチ」させるというよりも、 typedefined の定義に「#include と同じ行かつ#includeの後にある<>ではないこと」という条件を追加したほうがいいのではありませんか?
後読みなしで表現しようと思うと、「直後が ">" ではない」という先読みだとどうでしょうか。
C の構文に詳しくないのですが、これって他の本来ハイライトしたい型名にマッチしなくなってしまいますかね。

javascript

1new RegExp(this.getKeywords(typedefined) + "(?!>)", 'gm')

投稿2016/03/24 07:18

編集2016/03/24 07:21
tozjp

総合スコア790

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

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

tozjp

2016/03/24 07:24

new RegExp(this.getKeywords(typedefined) + "(?!>$)", 'gm') 最後が > で終わっている行に限定したほうが安全…?
yumetodo

2016/03/24 07:48

それだと #include <sprout/string.hpp> とか #include <string.h> みたいに .h/.hpp/.c/.cc/.cpp/.inl が>の前、末尾につくの場合対応できないですね・・・。 "(?!>)" をいじれば対応できるのかな・・・。
yumetodo

2016/03/24 08:02

いや、そもそも追記しましたが動いてないですね・・・
tozjp

2016/03/24 10:50 編集

new RegExp(this.getKeywords(typedefined)+"(?!.*&gt;$)", 'gm'); > じゃなく &gt; で来てました。 キーワード+任意の文字列 (.h など) + 最後が &gt; の場合にヒットしなくなると思います。 → &gt; で終わる行の (途中のものを含む) キーワードにヒットしなくなると思います。
yumetodo

2016/03/24 11:14

できましたありがとうございます
guest

0

単純にマッチングを伸ばすのであれば、下記で行けるのではないかと。

javascript

1{ regex: /#[ ]*(?:define|error|import|undef|elif|include|using|ifdef|line|ifndef|if|pragma|else|endif)[ ]*<.+?>/g }

javascript の場合正規表現の "後読み" の実装がまた普及してないから、#include の後にある <> "のみ" にマッチするのは難しそうですね。

投稿2016/03/24 05:59

HAZI

総合スコア31

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

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

yumetodo

2016/03/24 06:03

やっぱりマッチングを伸ばすしか無いのかなぁ・・・。 Visual Studioみたいな見た目にしたかったので色を分けたかったんだけれども。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問