Python で作成している JavaScript プリプロセッサに軽いマークダウン サポートを追加しようとしています。
ほとんどの場合は機能していますが、私が使用している正規表現が少し奇妙な動作をすることがあります。生の文字列とエスケープ シーケンスに関係があると思います。
正規表現は次のとおりです。(?<!\\)\"[^\"]+\"
はい、文字で始まる文字列のみに一致することは承知しています"
。しかし、このプロジェクトは何よりも好奇心から生まれたので、今のところは我慢できます。
それを分解するには:
(?<\\)\" # The group should begin with a quotation mark that is not escaped
[^\"]+ # and match any number of at least one character that is not a quotation mark (this is the biggest problem, I know)
\" # and end at the first quotation mark it finds
そうは言っても、私は(明らかに)次のような問題にぶつかり始めています。
"This is a string with an \"escaped quote\" inside it"
「そのマークがエスケープされていない限り、引用符以外のすべて」と言う方法がよくわかりません。私は試した:
([^\"]|\\\")+ # a group of anything but a quote or an escaped quote
、しかしそれは非常に奇妙な結果につながります。
私はこれについてすべて間違っていると聞く準備ができています。簡単にするために、この正規表現は常に二重引用符 ( "
) で開始および終了して、ミックスに別の要素を追加しないようにします。自分がこれまでに持っているものを本当に理解したいです。
ご協力ありがとうございます。
編集
正規表現のテストとして、次のコード (以下の unutbu のパターンを使用) を使用して、縮小された jQuery スクリプト内のすべての文字列リテラルを見つけようとしています。
STRLIT = r'''(?x) # verbose mode
(?<!\\) # not preceded by a backslash
" # a literal double-quote
.*? # non-greedy 1-or-more characters
(?<!\\) # not preceded by a backslash
" # a literal double-quote
'''
f = open("jquery.min.js","r")
jq = f.read()
f.close()
literals = re.findall(STRLIT,jq)
以下の回答は、ほぼすべての問題を修正します。発生するものは、jquery 独自の正規表現内にあり、これは非常にまれなケースです。このソリューションは、有効な JavaScript をマークダウン リンクとして誤認しなくなりました。これは実際の目標でした。