Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.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 sed中的邮政编码过滤器_Regex_Linux_Unix_Sed_Postal Code - Fatal编程技术网

Regex sed中的邮政编码过滤器

Regex sed中的邮政编码过滤器,regex,linux,unix,sed,postal-code,Regex,Linux,Unix,Sed,Postal Code,假设邮政编码的格式为A0A 0AA,或者A0 0AA,其中a是任意字母,0是任意数字,我编写了以下sed脚本来搜索网页上的邮政编码 s/\(([[:alnum:]]\{2,4\})\) \(([[:alnum:]]\{3\})\)/\1 \2/p 将第一个零件(A0A)存储在第一个区域中,将第二个零件(0AA)存储在第二个区域中。然后打印出发现的内容。但是,运行此操作当前找不到任何邮政编码 有什么想法吗?谢谢很难找到适合你的正则表达式的东西 里面的括号是什么意思?因为它们是不可替代的,所以它们

假设邮政编码的格式为A0A 0AA,或者A0 0AA,其中a是任意字母,0是任意数字,我编写了以下sed脚本来搜索网页上的邮政编码

s/\(([[:alnum:]]\{2,4\})\) \(([[:alnum:]]\{3\})\)/\1 \2/p
将第一个零件(A0A)存储在第一个区域中,将第二个零件(0AA)存储在第二个区域中。然后打印出发现的内容。但是,运行此操作当前找不到任何邮政编码


有什么想法吗?谢谢

很难找到适合你的正则表达式的东西

  • 里面的括号是什么意思?因为它们是不可替代的,所以它们实际上是匹配的。无论如何,它们毫无用处
  • 当您的实际模式在某些位置需要[:alpha://strong>而在其他位置需要[:digit://strong>时,为什么要尝试匹配两个[:alnum://strong>块
  • 为什么{2,4}?你想要两个或三个,而不是两个、三个或四个。你真正想要的不是字母数字,就是字母数字
  • 因为您不指定单词边界,即使您修复了正则表达式,第一个模式将在单词末尾匹配A0,第二个模式将在单词开头匹配0AA
  • 你至少需要这样做

  • 去掉内括号
  • {2,4}更改为{2,3}
  • 在正则表达式的开头和结尾添加单词边界匹配项
  • 但是,这仍然不能完全满足您的要求。它将匹配无效的模式。你真正需要做的是

  • 去掉内括号
  • 更改第一个模式以匹配[:alpha:][:digit:][strong>或[:alpha:][:digit:][:alpha:][digit:][:alpha:(有两种方法)
  • 将第二个模式更改为匹配[:digit:][:alpha:][:alpha:][:alpha:][
  • 在正则表达式的开头和结尾添加单词边界匹配项

  • 我没有给出一个具体的例子来说明如何做到这一点,因为你要求“任何想法”。我假设您希望在给定正确指针的情况下尝试自己修复此问题。

    看起来您的括号有一些问题。以下是我的作品:

    $ sed -n 's/.*\b\([[:alnum:]]\{2,3\}\) \([[:alnum:]]\{3\}\)\b.*/\1 \2/p' <<< "here is a postcode: A0A 0AA. some more text"
    A0A 0AA
    

    $sed-n's/*\b\([[:alnum:]\{2,3\}\([[:alnum:]\{3\}\)\b.*/\1\2/p'我知道你在询问有效邮政编码的子集,但我希望这个针对英国邮政编码的解决方案会有所帮助。我会这样处理这个问题:

    看一下,格式是

    • A9 9AA
    • A99 9AA
    • AA9 9AA
    • AA99 9AA
    • A9A 9AA
    • AA9A 9A
    最后一部分的正则表达式很简单:
    [0-9][A-Z]{2}

    第一部分是骗子。我将问题分为两部分:

    • 可以使用
      [A-Z]{1,2}[0-9]{1,2}
      匹配上述前四种模式,即一个或两个字母后跟一个或两个数字
    • 最后两个模式可以使用
      [A-Z]{1,2}[0-9][A-Z]
      进行匹配,即一个或两个字母,然后是一个数字和一个字母
    总而言之:

    sed -rn 's/.*(([A-Z]{1,2}[0-9]{1,2}|[A-Z]{1,2}[0-9][A-Z]) [0-9][A-Z]{2}).*/\1/p'
    

    作为一般提示,我建议您开始构建更复杂的正则表达式,方法是构建和测试各个部分,验证它们是否工作,然后将整个过程组合在一起。在这种情况下,这意味着尝试匹配A0或A0A,然后匹配0AA,然后将它们放在一起。奇怪的问题。您的个人资料显示为UK,但您提供的格式不能充分描述英国邮政编码。您还修复了我强调的{2,4}问题。你应该在你的回答中指出这一点,否则OP可能不会注意到,仍然会被卡住。你还没有解决正则表达式会产生许多错误匹配的问题,但这不是我们被要求解决的问题,所以这是公平的。很高兴你意识到这一点,我想尽可能地为自己解决,这是我找到的最好的学习方法。在这些指针之后,我得到了s/(.*)([[:alpha:]\{1,2\})([:digit:]\{1,2\}[:alpha:]\{,1\})[:space:]]([:digit:]])([:alpha:]\{2\})(.]/\2\3\4\5谢谢。