Chinaunix

标题: 匹配固定格式的数字 [打印本页]

作者: sunzhiguolu    时间: 2016-03-14 16:23
标题: 匹配固定格式的数字
有一些具有固定格式的数字, 如下:

  1. 031-723-2328
  2. 12345678
  3. (234)-001-8932
  4. 123-345-1234
  5. 5761234
  6. (234-777-1234
复制代码
条件:
1.> 长度为7的数字
2.> 由 3,3,4 长度组成, 并由 - 字符进行分割的
3.> 第一组数字由一对小括号包围起来的, 但是必须成对出现

要求的结果是:
031-723-2328
(234)-001-8932
123-345-1234
5761234

请问该如何匹配, 谢谢...
作者: jason680    时间: 2016-03-14 17:20
回复 1# sunzhiguolu

你都写完了,写出正则也没有问题才对
   
作者: sunzhiguolu    时间: 2016-03-14 17:28
回复 2# jason680
我写的是期望的结果啊,,,

   
作者: sunzhiguolu    时间: 2016-03-14 17:35
@jason680
之所以写的这么全, 下面有真相, 请看:

作者: sunzhiguolu    时间: 2016-03-14 17:59
回复 2# jason680
以上的问题中其实就差 => 处理过程
我想利用条件表达式进行处理, 但是就是写不出来. 不知道大神能否指点一下.

   
作者: jason680    时间: 2016-03-14 21:29
回复 5# sunzhiguolu

你不自已写出正则,如何能提高?

条件:
1.> 长度为7数字
        \d{7}

2.> 由 3,3,4 长度组成, 并由 - 字符进行分割的
   

3.> 第一组数字一对小括号包围起来的, 但是必须成对出现
   
作者: sunzhiguolu    时间: 2016-03-14 22:34
本帖最后由 sunzhiguolu 于 2016-03-14 22:50 编辑

回复 6# jason680
使用条件表达式的方式, 如何弄啊, 您能展示个小例子吗?
  1. ^(?:(?:\(\d{3}\)|\d{3})-)?\d{3}-?\d{4}$
复制代码

作者: jason680    时间: 2016-03-14 23:18
本帖最后由 jason680 于 2016-03-14 23:25 编辑

回复 7# sunzhiguolu

条件:
1.> 长度为7的数字
        \d{7}

2.> 由 3,3,4 长度组成, 并由 - 字符进行分割的
      \d{3}-\d{3}-\d{4}

3.> 第一组数字由一对小括号包围起来的, 但是必须成对出现
      [(]\d{3}[)]-\d{3}-\d{4}
      \(\d{3}\)-\d{3}-\d{4}


就这样,你要的结果...
其他自已想(这问题不再回帖),多看书---骆驼书
Here you are

$ perl -lane '{
  print if(
    m/^(
         \d{7}                    # xxxxxxx  (7 digits)
       | \d{3}-\d{3}-\d{4}        # xxx-xxx-xxxx
       | [(]\d{3}[)]-\d{3}-\d{4}  # (xxx)-xxx-xxxx
         )$ /x
  )
}' FILE
031-723-2328
(234)-001-8932
123-345-1234
5761234


作者: sunzhiguolu    时间: 2016-03-14 23:40
@jason680
我写的那个问题还是很多, 多谢大神指点. 谢谢!
作者: 小perl    时间: 2016-03-14 23:58
自己多写多测试就会了、、
作者: RE_HASH    时间: 2016-03-15 00:26
按你的思路:
/^((\(\d{3}\)-)|(\d{3}-?))?\d{3}-?\d{4}$/
作者: sunzhiguolu    时间: 2016-03-15 00:26
@小perl
大神 您说的在理! 向大神们学习, 天天向上!
作者: sunzhiguolu    时间: 2016-03-15 00:29
本帖最后由 sunzhiguolu 于 2016-03-15 00:29 编辑

回复 11# RE_HASH
大神好像, 不行. 会命中 => 123-4567

   
作者: RE_HASH    时间: 2016-03-15 00:34

以为你在找电话号码,123-4567 不是好的?
作者: sunzhiguolu    时间: 2016-03-15 00:43
回复 14# RE_HASH
我的这些数字的确是按照北美的电话号码格式弄的, 只不过我规则我给改了下. 真是难逃大神法眼啊!
我想问下, 如何利用条件表达式进行匹配. 您能指点下吗?

   
作者: RE_HASH    时间: 2016-03-15 00:48
条件表达式 是啥意思?
作者: sunzhiguolu    时间: 2016-03-15 00:55
本帖最后由 sunzhiguolu 于 2016-03-15 00:59 编辑

回复 16# RE_HASH
大神, 我只知道简单的语法格式, 应该是个挺不错的东西. (个人感觉不一定对, 让正则表达式好像 if else 的感觉)
(?(1)true-pattern|false-pattern)

搞不懂它里面的整数值到底起个啥作用?

   
作者: RE_HASH    时间: 2016-03-15 01:09
我试了试,加了条件以后变复杂了好多。不觉得是个好习惯。别人看你的代码要猜半天。

那些?(1)?(2)是依赖顺序的,你想改的时候也不方便。虽然可以给个名字,那REGEX就更长了。

我这么多年用perl都没用过,看来不学也罢。
作者: sunzhiguolu    时间: 2016-03-15 01:15
回复 18# RE_HASH
懂您的意思了, 谢谢大神帮忙.

   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2