Re: [問題] 反向表列的正規式?

作者: godspeedlee (妳,我可以)   2011-07-17 04:37:53
※ 引述《Uruzu (...)》之銘言:
: 前言:
: 因為ctags沒有支援我正在用的程式語言(systemverilog)
: 於是上google尋找解法,在當中找到了一個範例,可以讓ctags支援SV
: 但是那個例子不夠周全,只好自己動動手,加入適當的Regex,
: 好讓它看起來更完整一點
: 問題一:
: typedef class Myclass;
: typedef enum { .... } enum_type;
: 上面兩行是程式碼中經常出現的code
: 我想單純的用兩個Regex把這兩種分開來
: ^[ \t]*typedef[ \t]+.*[ \t]+([a-zA-Z_0-9]+)[ \t]*;
: 這會符合第一、二行code
: ^[ \t]*typedef[ \t]+enum[ \t]+.*[ \t]+([a-zA-Z_0-9]+)[ \t]*;
: 這會符合第二行code
: 要如何反向表列,才能使第一個Regex只會符合第一行而不包含第二行?
用 Negative Lookahead 試試看
第一個改成:
^[ \t]*typedef[ \t]+(?:(?!enum\b).*)[ \t]+([a-zA-Z_0-9]+)[ \t]*;
: 問題二:
: 有時候 code 會寫成這樣:
: typedef enum { AAA,
: BBB,
: ... } enum_type;
: ^[ \t]*typedef[ \t]+enum[ \t]+.*[ \t]+([a-zA-Z_0-9]+)[ \t]*;
: 紅色的部份該如何處理分行的部份比較好?
就我知道的回答你一下,ctags 提供的 regex 從
http://ctags.sourceforge.net/EXTENDING.html
的解釋來看是 line-oriented,所以 .* 無法跨行
(無法打開 dot match new line 的功能?)
但是上述的連結有提到可以用 callback 的方式解決,
這可能要請你多花點功夫了
剩下的就留給其他人補充吧 :)

Links booklink

Contact Us: admin [ a t ] ucptt.com