跨多行匹配正则表达式

3

我有一个文本文件中包含多个列表,格式如下。每个列表都以0开始,以Unique单词在新行开头结尾。我希望除了包含Unique的行之外将所有内容都删除。我查看了stackoverflow并尝试了以下操作,但它返回整个文本文件(示例中未列出文件中的其他字符串)。问题基本上是如何考虑正则表达式选择中的换行符。

^0(.|\n)*

输入:

0       145
1       139
2       175
3       171
4       259
5       262
6       293
7       401
8       430
9       417
10      614
11      833
12      1423
13      3062
14      10510
15      57587
16      5057575
17      10071
18      375
19      152
20      70
21      55
22      46
23      31
24      25
25      22
26      25
27      14
28      16
29      16
30      8
31      10
32      8
33      21
34      8
35      51
36      65
37      605
38      32
39      2
40      1
41      2
44      1
48      2
51      1
52      1
57      1
63      2
68      1
82      1
94      1
95      1
101     3
102     7
103     1
110     1
111     1
119     1
123     1
129     2
130     3
131     2
132     1
135     1
136     2
137     7
138     4
Unique: 252851

预期输出:

Unique: 252851

尝试使用^0[\s\S]*?[\n\r]Unique\b进行替换为Unique。你是在使用Notepad++吗? - Wiktor Stribiżew
每个文件中只有一行 Unique: 吗? - Tim Pietzcker
嗨。我正在使用Textmate。一个文本文件中有许多示例列表(每个都是唯一的)。 - Sebastian Zeki
你的换行符是什么?LF还是CR还是CRLF?或者混合使用? - Wiktor Stribiżew
不确定换行类型。我使用的是Mac 10.9和TextMate 2.0。 - Sebastian Zeki
2个回答

7
您需要使用类似以下的东西:
^0[\s\S]*?[\n\r]Unique:

替换为 Unique:

  • ^ - 行首
  • 0 - 字面量 0
  • [\s\S]*? - 零个或多个字符,包括换行符,尽可能少地匹配
  • [\n\r] - 换行符
  • Unique: - 整个单词 Unique:

另一种可能的正则表达式是:

^0[^\r]*(?:\r(?!Unique:)[^\r]*)*

其中\r代表当前文件中的换行符。将其替换为空字符串。

请注意,您还可以使用带有(?m)选项的正则表达式(?m)^0.*?[\r\n]Unique:(用Unique:替换):

m:多行(点(.)匹配换行符)


如果你使用的是Mac,那么很可能会有\r结尾。 - Wiktor Stribiżew
太棒了。一切都很顺利。谢谢! - Sebastian Zeki
我添加了一个带有(?m)选项的更短的替代方案。这个修饰符允许点匹配换行符(任何一个)。 - Wiktor Stribiżew

2
您的匹配换行符的方法应该是可行的,虽然不太优化(Alternation相对较慢);下一个问题是确保匹配在Unique之前停止:
(?s)^0.*(?=Unique:)

如果在您的文件中只有一个Unique:,则应该可以正常工作。

说明:

(?s)         # Start "dot matches all (including newlines) mode
^0           # Match "0" at the start of the file
.*           # Match as many characters as possible
(?=Unique:)  # but then backtrack until you're right before "Unique:"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接