我的表达方式如下:
ENTITY first
VHDL language standard: 3 (VHDL-2008)
ARCHITECTURE BODY arch
VHDL language standard: 3 (VHDL-2008)
现在我只想在ENTITY之后的第一个paranthesis正则表达式
所以结果应该是VHDL-2008
甚至是2008
。
我是regexps的新手。我尝试了什么:
"^ENTITY *(.*)"
仅返回“first”。所以我的问题是:如何在“第一次”之后申请换行? 我的尝试:
"^ENTITY .*\\n(.*)"
的结果令人困惑
"^(.*)"
增加了一些{和}。为什么呢?
我发现了一种非常难看的方法:
首先消除换行符
set data [regsub -all "\n" $data ""]
然后是这样的:
{ENTITY risc .*VHDL language standard: [0-3]..VHDL-(.*).}
如您所见,我不明白如何识别{或(paranthesis。更好的解决方案?
答案 0 :(得分:4)
假设您的表达式存储为单个字符串,您不必做任何特殊的事情来容纳换行符:regexp
man page说“默认情况下,换行符是一个完全普通的字符,没有特殊含义。”< / p>
要匹配第一组括号的内容,您可以执行以下操作:
% 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
答案 1 :(得分:1)
(
,)
,{
和}
是元字符。这意味着要将它们识别为普通字符,必须使用\
这样的转义:\(
,\)
,{{1} }和\{
。
在某些操作系统上,新行只是\}
,而在其他操作系统上,它是\n
。与这两者相匹配的正则表达式为\r\n
。
尝试使用此正则表达式而不是\r?\n
:
"^ENTITY .*\\n(.*)"
您可以找到演示和解释here。