在 emacs lisp 中使用正则表达式获取 C++ 字段
Get C++ field using regular expressions in emacs lisp
我正在尝试使用 elisp 和正则表达式在 C++ 中获取 class 字段的类型和名称
该字段的类型为:
int foo_;
(类型:int
,名称:foo
)
或
foo<bar> baz_bar_;
(类型: foo<bar>
, 名称 baz_bar
)
到目前为止,我得到了这 2 个正则表达式。
类型:
.+(?= .*_;)
姓名:
\w+(?=_;)
问题是 elisp 不支持先行。
我如何将这些正则表达式翻译成与 elisp 兼容的正则表达式?
与其写两个正则表达式,不如写一个正则表达式然后提取子匹配怎么样?我认为这可以解决您的前瞻性问题。而且,如果你需要在不同的地方进行子匹配,不管怎样,只做整个匹配,只提取你需要的部分。
所以类似(未经测试):
\(.+\) +\(.+\)_;
然后要获取类型,请使用 (match-string 1)
,或要获取名称,请使用 (match-string 2)
。
但值得注意的是,通常无法使用正则表达式匹配 C++ 成员。我相信声明符语法非常复杂,只能使用解析器才能真正完成。
我正在尝试使用 elisp 和正则表达式在 C++ 中获取 class 字段的类型和名称
该字段的类型为:
int foo_;
(类型:int
,名称:foo
)
或
foo<bar> baz_bar_;
(类型: foo<bar>
, 名称 baz_bar
)
到目前为止,我得到了这 2 个正则表达式。
类型:
.+(?= .*_;)
姓名:
\w+(?=_;)
问题是 elisp 不支持先行。
我如何将这些正则表达式翻译成与 elisp 兼容的正则表达式?
与其写两个正则表达式,不如写一个正则表达式然后提取子匹配怎么样?我认为这可以解决您的前瞻性问题。而且,如果你需要在不同的地方进行子匹配,不管怎样,只做整个匹配,只提取你需要的部分。
所以类似(未经测试):
\(.+\) +\(.+\)_;
然后要获取类型,请使用 (match-string 1)
,或要获取名称,请使用 (match-string 2)
。
但值得注意的是,通常无法使用正则表达式匹配 C++ 成员。我相信声明符语法非常复杂,只能使用解析器才能真正完成。