我正在爲Markdown-like語法構建解析器,並且目前正在努力實現對粗體和斜體文本範圍的強大支持。我想「翻譯」下的正則表達式進行了大膽範圍的開始到ANTLR4詞法語法(表達式從降價的語法高亮的Atom編輯拍攝):如何在Markdown-like語法中實現lookbehead和lookahead以獲得粗體和斜體文本範圍?
(?<=^|[^\w\d\*])\*\*(?!$|\*|\s)
正回顧後檢查如果「**」序列位於字符串的起始位置,或者前面沒有字母,數字或另一個星號。負向前視檢查序列是否在字符串結尾之前,並且沒有跟着另一個星號或任何空格字符。
我已經瞭解到,我必須使用語義斷言在ANTLR4做一個前瞻(使用_input.LA(1)),做這樣的事情:
ASTERISK_BOLD_START
: { /*Lookbehind checks*/}? '**' {/*Lookahead checks with _input.LA(1)*/}?
;
但我如何實現回顧後檢查?我怎樣才能檢查整個字符串解析的開始或結束?
感謝您的諮詢!我已經知道這兩個實現。 Stackoverflow上的一個忽略斜體範圍內的Markdown(並且它根本不實現粗體範圍)。 Github上的那個被其作者稱爲「不可用」和「醜陋」。它在解析器中執行所有上下文相關的東西,這使解析器變得緩慢而複雜。 我認爲,由於上下文敏感性,真的沒有辦法使用語義謂詞。這可能不是最優雅的方式,但我認爲它適合鬆散的Markdown類語法。 –