正则表达式用于删除不同行上的重复数字

时间:2011-09-28 20:58:30

标签: regex pcre bbedit

这可能很简单,但我无法弄清楚:

我有一个随机数(可以是1,2,3或4位数) 它在第二行重复:

2131
2131

如何删除第一个号码?

编辑:抱歉,我没有更好地解释。这些行位于纯文本文件中。我正在使用BBEdit作为我的编辑器。实际文件看起来像这样(只有应用程序.10,000行):

336
336
rinde
337
337
diving
338
338
graffiti
339
339
forest
340
340
mountain

如果可能,结果应如下所示:

336 - rinde
337 - diving
338 - graffiti
339 - forest
340 - mountain

5 个答案:

答案 0 :(得分:3)

搜索:

^(\d{1,4})\n(?:\1\n)+([a-z]+$)

替换:

\1 - \2

我无法访问BBEdit,但显然你必须检查“Grep”选项才能启用regex search-n-replace。 (我不知道为什么他们这么称呼它,因为它似乎是由PCRE库驱动的,它比grep强大得多。)

答案 1 :(得分:2)

因为你没有提到任何编程语言,工具。我假设这些数字在文件中。每行每个,并且任何重复的数字都在相邻行中。 uniq命令可以解决您的问题:

kent$  echo "1234
dquote> 1234
dquote> 431
dquote> 431
dquote> 222
dquote> 222
dquote> 234"|uniq

1234
431
222
234

答案 2 :(得分:2)

查找另一种方式:/^(\d{1,4})\n(?=\1$)/替换:""
修饰符mg(多行和全局)

$str =
'1234
1234
431
431
222
222
222
234
234';

$str =~ s/^(\d{1,4})\n(?=\1$)//mg;
print $str;

输出:
1234
431个
222个
234

已添加在修改过的示例中,您可以执行以下操作:

查找:/(?=^(\d{1,4}))(?:\1\n)+\s*([^\n\d]*$)/
替换:$1 - $2
Mods:/ mg(多行,全局)

测试:

$str =
'
336
336
rinde
337
337
337
diving
338
338
graffiti
339
337
339
forest
340
340
mountain
';

$str =~ s/(?=^(\d{1,4}))(?:\1\n)+\s*([^\n\d]*$)/$1 - $2/mg;

print $str;

输出:
336 - rinde
337 - 潜水
338 - 涂鸦
339个
337个
339 - 森林 340 - 山

已添加2 - 我对OP后期所需的输出格式比原始问题印象更深刻。它有很多元素,所以无法控制自己,产生了一种太复杂的正则表达式。

搜索:/^(\d{1,4})\n+(?:\1\n+)*\s*(?:((?:(?:\w|[^\S\n])*[a-zA-Z](?:\w|[^\S\n])*))\s*(?:\n|$)|)/
替换:$1 - $2\n
修饰语:mg(multi-line, global

扩展 -

# Find:
s{ # Find a single unique digit pattern on a line (group 1)

   ^(\d{1,4})\n+   # Grp 1, capture a digit sequence

   (?:\1\n+)*      # Optionally consume the sequence many times,
   \s*             # and whitespaces (cleanup)

   # Get the next word (group 2)
   (?:
     # Either find a valid word
       (                      # Grp2 
          (?:
             (?:\w|[^\S\n])*     # Optional \w or non-newline whitespaces
             [a-zA-Z]            # with at least one alpha character
             (?:\w|[^\S\n])*
          )
       )
       \s*                    # Consume whitespaces (cleanup),
       (?:\n|$)               # a newline
                              # or, end of string
     |
     # OR, dont find anything (clears group 2)
   )
 }

# Replace (rewrite the new block)
 {$1 - $2\n}xmg;  # modifiers expanded, multi-line, global

答案 3 :(得分:0)

查找

((\d{1,4})\r(\D{1,10}))|(\d{1,6})

取代:

\2 - \3

你应该可以很容易地从那里清理它!

答案 4 :(得分:-2)

使用regexp无法检测到这种模式。

您可以将字符串拆分为“\ n”,然后进行比较。