首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果行匹配或以尖括号开始和结束,则regex匹配。

如果行匹配或以尖括号开始和结束,则regex匹配。
EN

Stack Overflow用户
提问于 2020-07-18 18:44:31
回答 2查看 61关注 0票数 1

我正在用ruby(pcre regex)逐行处理文件,其想法是计算使用了多少行,不包括页面标记、空行和标记标记。

代码语言:javascript
复制
 1. [==| Page 4 |==]
 2.
 3. 上側
 4.
 5. 勉州爛 夜 菌
 6.
 7. 洲⑪蝿 香n
 8.
 9. 本聘
10.
11. [==| Page 5 |==]
12.
13. <IMAGE
14. <IMAGE>
15. IMAGE>
16.
17. [==| Page 6 |==]
18.
19. 欝輛蓼 \縄《卿⑪儡

我知道如何在这个regex /^(?!\[==\| Page \d+ \|==\]).+$/中使用忽略标题和空行。

但我不太确定如何也忽略标签。与我所使用的这些标记匹配的正则表达式与/^<.*>$/一样简单,我不知道如何将其反转。

扫描后的结果应该是["上側", "勉州爛 夜 菌", "洲⑪蝿 香n", "本聘", "<IMAGE", "IMAGE>", "欝輛蓼 \縄《卿⑪儡"].length #=> 7

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-18 19:22:12

您也可以使用或在“向前看”表达式中排除其他行!

^(?!\[==\| Page \d+ \|==\]|$|<.*>).*$

Regex Demo

票数 0
EN

Stack Overflow用户

发布于 2020-07-18 19:51:07

链式倒火柴

在Ruby中,您有很多方法来反演匹配,包括VEnumerable#reject。虽然您当然可以将其作为一个复杂的正则表达式来完成,但这会使您的代码更不容易测试,也更难阅读。相反,可以利用一些核心方法来构建逻辑和/或正则表达式,而不是使用一个复杂的正则表达式。

例如,假设您已经将文件放入一个文件变量中:

代码语言:javascript
复制
page_marker = /\[==\| Page \d+ \|==\]/
tag_markers = /^<.*?>$/

file.lines.map(&:chomp).
  grep_v(page_marker).
  grep_v(tag_markers).
  reject { |line| line.empty? }.
  count

#=> 7

假定有许多其他方法来表达这一点,那么链式方法的主要好处是:

  1. 相当可读的。
  2. 清楚地传达代码的步骤意图。
  3. 可合成的,因此易于修改或扩展。
  4. 如果需要调试,可以在irb中查看方法链中每个步骤的结果。

其他答案可能会引导您使用消极或积极的前瞻性/后向断言,但为了可维护性和可测试性,我强烈建议采用一种更可组合的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62972456

复制
相关文章

相似问题

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