2012-03-05 32 views
1

VHDLコードを解析して、いくつかのチェックを追加しようとしています。VHDL文字列リテラルの正規表現

文字列リテラルを検索する正規表現を探しています。文字列リテラルは、なるように二重引用符で囲まれています

" {characters} " 

問題は現在、次の要件です:引用マーク値が、その後、文字値の 列で表現される場合

文字列リテラル内の対応する の場所に隣接する二重引用符を書き込む必要があります。

これが意味している以下の法的な文字列リテラルは、次の場合

"""" 
" random stuff "" random stuff " 

私はわからない:

("(("")*[^\n"]*)*") 

は十分に私は/"([^"]|"")+"/がほとんどのために働くことを願っています

+0

どのようにエスケープされた引用符を扱っているのですか?法的文字列リテラルであることは意味がありません。 "" "" "" "" "?それは文字列リテラルです、またはそれは単にスペース上に浮動小数点の引用です、あなたはそれをあらゆる方法で持つことはできません。 – sweaver2112

+1

よく分からない場合は、正規表現を試してみてください: 'find -name '* .vhdl' | | perl -ne 'print if/regex /'> yourResult.txt'次に、 '' 'を含む行を検索するのと異なる結果を確認してください:' find -name '* .vhdl' | xargs cat | perl -ne 'if/"/ '> allQuotes.txt'。 'wc -l yourResult.txt allQuotes.txt' – nodakai

+0

好奇心、sebs、あなたはこのエスケープされていない二重引用符にもマッチしたくありませんか? 'dkfasdfasdfasd "kjlkdsajf?なぜいけないの? – sweaver2112

答えて

3

それをカバーしてあなたの必要。試してみてください。

編集:+*である必要があります。 OP自身が私よりも正規表現をよく知っています!

0

あなたはこの試みることができる:

replace = "\"" + match.$1 + "\"" 

注:(擬似コード/正規表現/

/(?<!["\\])"(\w\s)+"(?!")/ 

をその後、正規表現の後方参照を使用して、この表現はへの素朴な試みはすでにエスケープと一致しない可能二重引用符(振り返って、\または"は表示されませんが、\\"は実際には通常の二重引用符eの前に通常のバックスラッシュ、the more you think about it the more complicated it getsがあります。

6

正規表現の代わりにフルレクサーが必要な場合があります。私はここで読むの提案は、例えば、偽陽性を引き起こす可能性があります:

a <= '"'; -- assigns the character " to signal a. 

あなたの正規表現は、ここで"'; -- assigns the character "と一致します。

また、コードにコメントや文字リテラル、または文字列に奇妙な二重引用符が含まれていない場合は、最も単純な正規表現が使えます。

+0

私は、複数のグループで正規表現を作成して、 ''"を除外することができたと思います。 「そういう場合。ほとんどの正規表現エンジンは、正規表現を左から右へと評価し、2番目のグループに何かがある場合は、有効な文字列リテラルとして認識されます。 – sebs

+0

@あなたの提案された正規表現は、まだコメント(またはブロックコメント)や拡張識別子の引用符を考慮していないので、本当に速く複雑になります。私はRegexが仕事の正しいツールではないかもしれないと指摘したいと思います。 – Philippe