Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何为此构建正则表达式?_Regex - Fatal编程技术网

Regex 如何为此构建正则表达式?

Regex 如何为此构建正则表达式?,regex,Regex,数据: 有人能推荐一个以上的正则表达式吗? 我需要检测10位数字并将其表示为650-724-6354很简单: (650 ) 724-6354 (650) 724-6354 (650)724-6354 650 724-6354 650 724 6354 650 724 6354 这将为您提供3个正则表达式捕获中的数字: Search: .*(\d{3}).*(\d{3}).*(\d{4}) Replace: \1-\2-\3 在PCRE语法中,可能的解决方案是: /(\d{3})[

数据:

有人能推荐一个以上的正则表达式吗? 我需要检测10位数字并将其表示为
650-724-6354

很简单:

(650 ) 724-6354
(650)  724-6354
(650)724-6354
650 724-6354
650 724 6354
650   724   6354

这将为您提供3个正则表达式捕获中的数字:

 Search: .*(\d{3}).*(\d{3}).*(\d{4})
Replace: \1-\2-\3

在PCRE语法中,可能的解决方案是:

/(\d{3})[ \)]+(\d{3})[ \-]+(\d{4})/

然后,$1、$3、$5将包含您要查找的总共10个数字。

这里是一个更完整的建议,减少了更复杂字符序列的缺陷

一个用python编写的简单代码段,考虑到组之间的任何类型字符,返回每个数字序列的组成部分

/\(?\s*(\d{3})\s*\)?(\s*|-)(\d{3})(\s*|-)(\d{4})/
下面是使用示例字符串的测试代码:

import re


def get_components(phone_str):
    rex = re.compile(r"[^\d]*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})[^\d]*")
    return rex.findall(phone_str)[0]

你试过什么吗?它太简单了,只能在给定的字符串上工作。对于比括号或破折号更复杂的分隔符?考虑到通用验证,这是一个不完整的解决方案是的,它过于简单,但它适用于问题中显示的字符串。你知道,.@tompave:很抱歉,如果我不想检测序列6507246354,我该怎么办。目前它检测到了。我不知道你的意思。该正则表达式适用于字符串中的任何数字,如示例中的数字。然后,数字组将在捕获中可用(正则表达式中的括号组)。如果您想用连字符显示它们,恐怕这取决于您使用的语言。@tompave:谢谢您的回复。我的意思是,我忘了在我的示例中再提到一个例子,即它不应该考虑序列6507246354。目前它捕获了这个序列。可以对正则表达式执行某些操作,这些操作将在上面的示例中起作用,但不应在示例6507246354中起作用。
test_strs = [
    "650   724   6354",
    "(650 ) 724-6354",
     "(650)  724-6354",
     "(650)724-6354",
     "650 724-6354",
     "650 724 6354",
     "650   724   6354",
]
print(["%s-%s-%s"%get_components(p) for p in test_strs])