从字符串R

时间:2019-05-04 02:38:09

标签: r regex validation

我正在尝试提取R中所有格式(国际和其他格式)的电话号码。

示例数据:

phonenum_txt <- "sDlkjazsdklzdjsdasz+49 123 999dszDLJhfadslkjhds0001 123.456sL:hdLKJDHS+31 (0) 8123zsKJHSDlkhzs&^#%Q(999)9999999adlfkhjsflj(999)999-9999sDLKO*$^9999999999adf;jhklslFjafhd9999999999999zdlfjx,hafdsifgsiaUDSahj"

我想要:

extract_vector
[1] "+49 123 999"
[2] 0001 123.456
[3] "+31 (0) 8123"
[4] (999)9999999
[5] (999)999-9999
[6] 9999999999
[7] 9999999999999

我尝试使用:

extract_vector <- str_extract_all(phonenum_txt,"^(?:\\+\\d{1,3}|0\\d{1,3}|00\\d{1,2})?(?:\\s?\\(\\d+\\))?(?:[-\\/\\s.]|\\d)+$")
我从HERE获得的

,但是我的正则表达式技能不足以转换它以使其在R中工作。

谢谢!

2 个答案:

答案 0 :(得分:2)

虽然您的数据似乎不现实,但是this expression可能会帮助您设计所需的表达式以匹配您的字符串。

(?=.+[0-9]{2,})([0-9+\.\-\(\)\s]+)

我添加了一个额外的边界,通常在输入复杂时可以添加边界。

enter image description here

如果愿意,可以添加或删除边界。例如,该表达式也可以工作:

([0-9+\.\-\(\)\s]+)

或者您可以为其添加其他左右边界,例如,如果所有电话号码都用小写/大写字母包裹:

[a-z]([0-9+\.\-\(\)\s]+)[a-z]

您可以简单地调用所需的目标输出,该目标输出使用$1在捕获组中。

enter image description here

如果/当有真实数据可用时,正则表达式设计最有效。

答案 1 :(得分:1)

您可以使用此正则表达式匹配并提取字符串中包含的所有电话号码。

(?: *[-+().]? *\d){6,14}

此正则表达式的思想是允许在电话号码中的一位前允许该字符集[-+().]中的一个字符(因为这些字符可以出现在您的电话号码中)。如果您的电话号码可以包含更多的字符,例如{}[],则可以将其添加到此字符集中。这个可选字符集可能被可选空格包围,因此我们在该字符集前后都有一个空格星号,最后我们有\d用来将其与一个数字匹配,并且整个模式都被量化了{{1} }至少出现6次或最多出现14次(您可以根据需要配置这些数字),因为根据样本数据,电话号码中的最小数字为6(尽管实际上我认为是7或8)新加坡,但取决于您)

Regex Demo

R Code Demo

{6,14}

打印所有必需的数字,

library(stringr)
str_match_all("sDlkjazsdklzdjsdasz+49 123 999dszDLJhfadslkjhds0001 123.456sL:hdLKJDHS+31 (0) 8123zsKJHSDlkhzs&^#%Q(999)9999999adlfkhjsflj(999)999-9999sDLKO*$^9999999999adf;jhklslFjafhd9999999999999zdlfjx,hafdsifgsiaUDSahj", "(?: *[-+().]? *\\d){6,14}")