我在单个文本文件中有几个列表,如下所示。它始终以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 :(得分:2)
您需要使用类似
的内容^0[\s\S]*?[\n\r]Unique:
并替换为Unique:
。
^
- 开始行0
- 文字0
[\s\S]*?
- 包含零个或多个字符。尽可能少的换行[\n\r]
- 换行符号Unique:
- 整个字Unique:
另一种可能的正则表达式是:
^0[^\r]*(?:\r(?!Unique:)[^\r]*)*
其中\r
是当前文件中的行结尾。替换为空字符串。
请注意,您还可以将(?m)^0.*?[\r\n]Unique:
正则表达式(替换为Unique:
)与(?m)
option一起使用:
m
:多行(点(.
)匹配换行符)
答案 1 :(得分:1)
您的匹配换行符的方法应该有效,尽管它不是最佳的(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:"