我正在用ruby(pcre regex)逐行处理文件,其想法是计算使用了多少行,不包括页面标记、空行和标记标记。
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
发布于 2020-07-18 19:22:12
发布于 2020-07-18 19:51:07
链式倒火柴
在Ruby中,您有很多方法来反演匹配,包括V和Enumerable#reject。虽然您当然可以将其作为一个复杂的正则表达式来完成,但这会使您的代码更不容易测试,也更难阅读。相反,可以利用一些核心方法来构建逻辑和/或正则表达式,而不是使用一个复杂的正则表达式。
例如,假设您已经将文件放入一个文件变量中:
page_marker = /\[==\| Page \d+ \|==\]/
tag_markers = /^<.*?>$/
file.lines.map(&:chomp).
grep_v(page_marker).
grep_v(tag_markers).
reject { |line| line.empty? }.
count
#=> 7假定有许多其他方法来表达这一点,那么链式方法的主要好处是:
其他答案可能会引导您使用消极或积极的前瞻性/后向断言,但为了可维护性和可测试性,我强烈建议采用一种更可组合的方法。
https://stackoverflow.com/questions/62972456
复制相似问题