匹配多行正则表达式

时间:2016-01-29 09:49:43

标签: regex

我在单个文本文件中有几个列表,如下所示。它始终以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

2 个答案:

答案 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:"