我有这样的表达:
ENTITY first
VHDL language standard: 3 (VHDL-2008)
ARCHITECTURE BODY arch
VHDL language standard: 3 (VHDL-2008)
现在我只需要 ENTITY 之后的第一个括号的正则表达式
因此结果应该是 VHDL-2008
甚至 2008
。
我是正则表达式的新手。我尝试过的:
"^ENTITY *(.*)"
仅返回“第一个”。所以我的问题是:如何在“first”之后请求换行符? 我的尝试:
"^ENTITY .*\\n(.*)"
结果非常令人困惑
"^(.*)"
其中添加了一些 { 和 }。为什么?
我发现了一个非常丑陋的方法来做到这一点:
首先消除换行符
set data [regsub -all "\n" $data ""]
然后是这样的:
{ENTITY risc .*VHDL language standard: [0-3]..VHDL-(.*).}
正如你所见,我不明白如何识别 { 或 ( 括号。有更好的解决方案吗?
最佳答案
假设您的表达式存储为单个字符串,您无需执行任何特殊操作即可容纳换行符:regexp
man page说“默认情况下,换行符是一个完全普通的字符,没有特殊含义。”
要匹配第一组括号的内容,您可以这样做:
% set str {ENTITY first
VHDL language standard: 3 (VHDL-2008)
ARCHITECTURE BODY arch
VHDL language standard: 3 (VHDL-2008)}
% regexp {^ENTITY[^(]+\(([^)]+)} $str -> vhdl
1
% puts $vhdl
VHDL-2008
% # or use non-greedy matching
% regexp {^ENTITY.+?\((.+?)\)} $str -> vhdl
1
% puts $vhdl
VHDL-2008
关于regex - 在 tcl 中使用正则表达式识别换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21113798/