regex - 在 tcl 中使用正则表达式识别换行符

标签 regex tcl newline

我有这样的表达:

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/

相关文章:

string - PowerShell字符串串联给出了换行符

c++ - 在不破坏目标流的情况下写入流的前 N ​​行以外的所有内容

python - 贪婪的正则表达式每第 n 行拆分 python

regex - 如何在 bash 中获取变量配置的值?

android - android 中的正则表达式只接受英语

tcl - Expect Script - 如何验证文件的第一行和最后一行

javascript - JS 正则表达式查找 <a> 中不包含的单词?

regex - 非贪婪正则表达式根据原子在正则表达式中的位置表现贪婪

oop - [incr Tcl] 中的静态函数继承