在tcl中识别带有正则表达式的换行符

时间:2014-01-14 12:40:17

标签: regex tcl newline

我的表达方式如下:

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。更好的解决方案?

2 个答案:

答案 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