首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex的Regex问题

Regex的Regex问题
EN

Stack Overflow用户
提问于 2014-05-30 17:33:42
回答 4查看 92关注 0票数 0

我正在尝试编写一个正则表达式,它将在CVS(昏迷分离值)文件中找到电话号码。

Catch是我只感兴趣的电话号码,在特定的专栏(作为一个只后,一定数量的昏迷)。贝娄,我有正则表达式,将这样做,它的工作良好的Javascript标准。

代码语言:javascript
复制
(?:^([^^]*\,){3}[^^]*)\d{3}-\d{3}-\d{4}

我实际上是在使用Bash,使用sed,grep,但我甚至找不到grep和sed使用什么Regex标准?

这是样本文本。

注意,现在我使用'^‘而不是',’来分隔值,因为用户在值.中包含了comas )

这不是真正的数据,信息技术是为了保护人们的隐私

代码语言:javascript
复制
28434658^17 Three^2013-09-19T19:57:23Z^80 W 54th St, Penthouse & 4th Fl, NY, 10018s212-409-1641^^Mary Szyb 347-340-1918^2 x week Thur 2.5hrs  & Sat 4 hrs
28937693^356 West 36th street^2013-09-19T18:17:57Z^356 West 36th street, suite 706sNew York New York 10018^null^null^on call: 
29219313^333 rector pl^2013-10-07T17:11:36Z^333 Rector Place 248-469-5859^^Jose Hernandez^2 x week Wed & Fri
28854346^50 Can^2013-09-23T13:10:54Z^152 East 28th Street, 7th Floor, NY, 10018s917-932-3962s646-710-4170^155 W 24rd St 3rd FL^null^Swlvia Smith347-933-6630sIrena Brown 347-991-1346s5 x week Mon-Fri
28434698^4Eleven^2013-09-19T19:57:23Z^112 West 28th Street, 3th Fl,sNY, 10018s917-922-3862s646-710-4170^^null^null

让我也澄清一件正确的产出是:

代码语言:javascript
复制
212-409-1641
248-469-5859
917-932-3962
646-710-4170
917-922-3862
646-710-4170

因为这些是列4中唯一的电话号码

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-30 20:10:19

我正在发布结束这项工作的regex:

代码语言:javascript
复制
([0-9]{3}-[0-9]{3}-[0-9]{4})(?=[^^]*(\^[^^]*){3}$)

谢谢大家的帮助。

我想我从这个问题中得到的教训是,如果一个解决方案不起作用,试着从不同的角度工作,在这种情况下,从后面数列。

票数 0
EN

Stack Overflow用户

发布于 2014-05-30 17:57:25

以下内容应该适用于你。

代码语言:javascript
复制
grep -Po '(\d{3}-){2}\d{4}' file.csv

更新:

在用逗号替换^之后,实际的数据。

代码语言:javascript
复制
28434658,17 Three,2013-09-19T19:57:23Z,80 W 54th St, Penthouse & 4th Fl, NY, 10018s212-409-1641,Mary Szyb 347-340-1918,2 x week Thur 2.5hrs  & Sat 4 hrs
28937693,356 West 36th street,2013-09-19T18:17:57Z,356 West 36th street, suite 706sNew York New York 10018,null,null,on call: 
29219313,333 rector pl,2013-10-07T17:11:36Z,333 Rector Place 248-469-5859,Jose Hernandez,2 x week Wed & Fri
28854346,50 Can,2013-09-23T13:10:54Z,152 East 28th Street, 7th Floor, NY, 10018s917-932-3962s646-710-4170,155 W24rd St 3rd FL,null,Swlvia Smith347-933-6630sIrena Brown 347-991-1346s5 x week Mon-Fri
28434698,4Eleven,2013-09-19T19:57:23Z,112 West 28th Street, 3th Fl,sNY, 10018s917-922-3862s646-710-4170,null,null

你可以试试以下的方法。

代码语言:javascript
复制
perl -nle '@F = split(/,(?!s| )/, $_); print $1 while ($F[3] =~ /((\d{3}-){2}\d{4})/g)' file.csv

输出

代码语言:javascript
复制
212-409-1641
248-469-5859
917-932-3962
646-710-4170
917-922-3862
646-710-4170
票数 1
EN

Stack Overflow用户

发布于 2014-05-30 17:46:27

Grep可以在-P或-E中使用perl或posix标准。详见man。对于这种情况,我通常首先使用剪切来分隔字段,前提是所有字段都不包含列分隔符。

代码语言:javascript
复制
echo "a,b,c,123-555-1212,d,e,f" | cut -f 4 -d','

或者从档案里,

代码语言:javascript
复制
while read line; do
   c4=$(echo $line | cut -f 4 -d',')
done < /tmp/file.csv

如果任何列都可以包含逗号,那么最好切换到ruby、python等中的CSV库。

更新:使用-d'^‘分隔列,您可以很容易地匹配您感兴趣的列,如上面所示,sed的棘手部分是提取电话号码,

代码语言:javascript
复制
f="80 W 54th St, Penthouse & 4th Fl, NY, 10018s212-409-1641"
echo $f | sed -r 's/(.*?)([0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$)/\2/'
212-409-1641

并不是说您必须使用扩展的regex命令行参数(-r),而不能使用像\d{3}这样的regex文本。sed的文档可以在info页面中找到,但是它通常更容易在网络上实现grep。这是一个很好的教程:http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substitution-examples/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23960356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档