【问题标题】:POSIX regex for Version string版本字符串的 POSIX 正则表达式
【发布时间】:2020-06-25 00:28:22
【问题描述】:

我有一个我无法控制的源,我想过滤掉所有包含某些字符的字符串。 例如其中:

9
8.1.0
5.0
9.0
5.1
8.0.0
7.0 (cdfsdsdsd)
5.0.2
8
7.0.1
7.1
6.0
7.0
Over 32323
7.0 rdx K9 bnsm
9.2.3
8.oo
pp
unknown
8.0_vgfe10051988
6.0.1
8.0.0-derv10051988
9.1
9.0.0
8.0.1
7.0_xccv10051988
7.1.3
10.0
7.0.X.1.C
8.0.0_vged10051988
4.4.4
7.1.2
7.0 [NKL 24 | ABC]
8.1
7.1.1
5.1.1
7.0_Jgrd10051988
9.XXX
9.0.1
8.0
5.0.1
8.1.1
10

其中我只需要那些只有数字和的字符串。

9
8.1.0
5.0
9.0
5.1
8.0.0
5.0.2
8
7.0.1
7.1
6.0
7.0
9.2.3
6.0.1
9.1
9.0.0
8.0.1
7.1.3
10.0
4.4.4
7.1.2
8.1
7.1.1
5.1.1
9.0.1
8.0
5.0.1
8.1.1
10

我尝试了很多正则表达式,但似乎没有什么是通用的, 这个正则表达式也给出了[0-9]*.?[0-9] 字符串。 我工作的是^(\*|\d+(\.\d+){0,2}(\.\*)?)$,但这不是POSIX。

如何获得也适用于 Redshift 的 POSIX?

【问题讨论】:

  • 试试^(\*|[0-9]+(\.[0-9]+){0,2}(\.\*)?)$。它符合 POSIX ERE。
  • 当你说 POSIX 时,你还应该澄清它是 BRE 还是 ERE 语法。
  • @WiktorStribiżew:抱歉,这似乎与任何字符串都不匹配
  • 如果相关文档是here,即使\d也可以,写成\\d就行了。 '^(\\*|\\d+(\\.\\d+){0,2}(\\.\\*)?)$'
  • 那么,成功了吗?

标签: regex amazon-redshift posix regex-group


【解决方案1】:

通过查看 Amazon 文档,Redshift 似乎支持 POSIX ERE。那你试试看:

^[[:digit:]]+(\.[[:digit:]]+)*$

【讨论】:

    【解决方案2】:

    您的正则表达式有效,您只需要在字符串文字中使用双反斜杠。

    根据Amazon Redshift "POSIX Operators" documentation

    Amazon Redshift 在正则表达式中支持以下受 Perl 影响的运算符。使用两个反斜杠 ('\\') 转义运算符。

    所以,你可以使用

    '^(\\*|\\d+(\\.\\d+){0,2}(\\.\\*)?)$'
    

    【讨论】:

      【解决方案3】:

      最简单的是:

      ^[.0-9]+$
      

      如果您不支持扩展正则表达式,您可以这样做:

      ^[.0-9][.0-9]*$
      

      我在你的输入和输出上运行了这个命令,得到了一个空的差异:

      $ diff <(grep -P '^[.0-9]+$' input) output
      $ echo $?
      0
      

      根据您的具体输入,即使 ^[.0-9]*$ 也可以。

      但请注意,“只有数字和. 的字符串”与“版本字符串”之间存在差异。简单的正则表达式还将捕获如下输入:

      1..2
      ..
      .
      0...
      .1
      

      如果这不是问题,您可以使用简单的正则表达式。

      【讨论】:

        猜你喜欢
        • 2015-11-02
        • 2013-02-24
        • 2016-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多