正则表达式:匹配忽略非数字

时间:2017-11-22 22:03:58

标签: .net regex phone-number

我有一个杂乱的电话号码列表,有些(可能是假的)包含相同的重复数字,但也可能包含其他标点符号,空格,字母等。如何使用.NET RegEx识别此类数字。这是一个例子:

00000000000000
(11)1111111111
22/ 222-2222222222
cell +33,333-3333-3333.
14 244-44444 Ext. 444

我需要正则表达式匹配前4,但不是最后一个有其他数字。我的^(\d)\1+$抓住了第一个号码。我还尝试^([.-[\D]])\1+$来匹配不是非数字的重复字符。失败。 ^(\d)(?:[\1-[\D]])+$也是如此。一种简单的方法是使用\D删除一次传递中的所有非数字,然后使用第一个正则表达式,但我不想创建2个正则表达式引擎调用(这些是来自在SQL Server中。)

每行的输出是一个简单的布尔0-1。没有匹配时为0,匹配时为1:

1
1
1
1
0

更新: 稍微扩展这个问题。如果我想删除整行,只要正则表达式匹配,什么是替代正则表达式?因此,替换正则表达式将返回4个空行和一个原始行。我试图通过环视来做到这一点,但失败了。

1 个答案:

答案 0 :(得分:2)

您可以使用

#!/bin/bash

file="file1"
C=0
flag=0

while read line
do
        (( ++C ))

        [ $C -eq 4 ] && break;

        [[ "$line" =~ '[^[:alpha:]]' ]] && flag=1


done < "$file"

[ $flag -eq 0 ] && echo "$file"

请参阅regex demo

<强>详情

  • ^\D*(\d)(?:\D*\1)+\D*$ - 字符串开头
  • ^ - 0+非数字
  • \D* - 第1组:数字
  • (\d) - 连续发生1次或更多次
    • (?:\D*\1)+ - 0+非数字
    • \D* - 与第1组中捕获的数字相同的数字
  • \1 - 0+非数字
  • \D* - 字符串结束。