首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用regex提取标签之间的字符串

使用regex提取标签之间的字符串
EN

Stack Overflow用户
提问于 2016-12-19 21:50:56
回答 2查看 171关注 0票数 1

我有以下字符串

代码语言:javascript
复制
------------------------------------------------------------------------
r100 | dawson | 2012-10-3 04:21:27 -0600 (Wed, 3 Oct 2012) | 8 lines
Changed paths:
   M /branches/project/foo.cpp
   A /branches/project/foo1.cpp
   D /branches/project/foo2.cpp

:SUMMARY: Add new file
:Module:

------------------------------------------------------------------------

现在我要做的是,列出为某个特定提交而更改的所有文件。为此,我首先需要提取标签“更改路径:”和“:汇总:”之间的信息,好吧,我的regex解决方案不是很整洁。当我这么做的时候

代码语言:javascript
复制
set blocks [regexp -nocase -lineanchor -inline -all -- {^\s*?Changed paths\s*?:\s*?.*?:} $summary]

其中$summary是上面的字符串内容,我的输出是,

代码语言:javascript
复制
{Changed paths:
   M /branches/project/foo.cpp
   A /branches/project/foo1.cpp
   D /branches/project/foo2.cpp

:}

预期产出:

代码语言:javascript
复制
   M /branches/project/foo.cpp
   A /branches/project/foo1.cpp
   D /branches/project/foo2.cpp

我似乎无法摆脱“改变的道路:”。我在这方面没有很多经验,有人能指出我做错了什么吗?如果有一种方法可以将那些修改过的文件存储在列表中呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-19 22:13:30

您需要用捕获括号包装regex模式中获取所需子字符串的部分,然后指定一个在regexp中保存值的变量。

代码语言:javascript
复制
Changed paths\s*?:\s*?(.*?):SUMMARY
                      ^^^^^

见下面的演示:

代码语言:javascript
复制
set summary {------------------------------------------------------------------------
r100 | dawson | 2012-10-3 04:21:27 -0600 (Wed, 3 Oct 2012) | 8 lines
Changed paths:
   M /branches/project/foo.cpp
   A /branches/project/foo1.cpp
   D /branches/project/foo2.cpp

:SUMMARY: Add new file
:Module:

------------------------------------------------------------------------}
regexp {\n\s*?Changed paths\s*?:\s*?(.*?):SUMMARY} $summary - blocks
puts $blocks

Tcl在线演示

如果Changed paths出现在字符串的开头,则使用^而不是\n

$summary - blocks的意思是:我们将$summary字符串传递给regexp,并丢弃整个匹配值(-),并将捕获组1的内容分配给$blocks变量。

票数 1
EN

Stack Overflow用户

发布于 2016-12-20 00:33:51

您也可以使用(基于您的示例)

代码语言:javascript
复制
regexp -nocase -line -inline -all {^\s+.*$} $summary

代码语言:javascript
复制
regexp -nocase -line -inline -all {^.*\.cpp$} $summary
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41231602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档