Re: [问题] 反向表列的正规式?

楼主: Uruzu (...)   2011-07-19 00:51:16
※ 引述《godspeedlee (我是好人,也是个坏人)》之铭言:
: ※ 引述《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]*;
今天试着改用上列的表示式
但是ctags不认得,有error message
看来GNU Regex没有支援这样的用法的样子…
http://www.delorie.com/gnu/docs/regex/regex_toc.html
只好先改成这种蠢样子,顶着用先
^[ \t]*typedef[ \t]+[^e][^n][^u][^m].*[ \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 的方式解决,
: 这可能要请你多花点功夫了
: 剩下的就留给其他人补充吧 :)
这样看来,new line的问题需要从source code改起才能解决
目前先放生吧,对这部份兴致不高,要花不少功夫

Links booklink

Contact Us: admin [ a t ] ucptt.com