【问题标题】:Perl Adding two regex in the same timePerl同时添加两个正则表达式
【发布时间】:2019-09-19 19:23:22
【问题描述】:

对于 perl 脚本,我想将两个正则表达式放入相同的模式属性中。第一个正则表达式应该在下一个范围内输入
数字 {2,4} 两个或四个相同。

例如空白 1 1111 123

带有竖线 (|) 1|1111|123 的示例

这是空格的正则表达式只能正常工作

if($msg{'what'} =~ /\cmd\s(\d{2,4})\s(\d{4,6})\s(\d{3,4})/)

有两个模式 \s 和 |它不工作。

if($msg{'what'} =~ /\cmd\s(\d{2,4})\s?\|(\d{4,6})\s?\|(\d{3,4})/)

期望的输出是在一行正则表达式中获得带有空格或竖线的结果。

1|1111|123 或 1 1111 123

【问题讨论】:

  • 您的意思是“由空格或竖线字符分隔”吗?
  • 请给出几个示例输入和所需的结果。
  • tadman Yes Yunnosch 结果类似于示例 1 或 2

标签: perl


【解决方案1】:

你的正则表达式

/(\d{1,4})\s?\|(\d{4,6})\s?\|(\d{3,4})/)

寻找一个可选的空间,然后是一个管道,即,必须有一个管道来匹配正则表达式。如果您想要管道或空白,请使用两个[\s|] 中的bracketed character class

/(\d{1,4})[\s|](\d{4,6})[\s|](\d{3,4})/)

因为它是一个带括号的字符类,你也不需要转义管道符号。

请注意,尽管您的示例输入不适合您发布的正则表达式;特别是,您的示例没有“cmd”前缀,并且它们仅以一个前导数字开头,而不是 2 到 4,正如您的正则表达式所期望的那样。我在这里调整了正则表达式以匹配示例输入。

robert@saaz:~$ echo 1 1111 123 | perl -ne 'print "matches\n" if (m/(\d{1,4})[\s|](\d{4,6})[\s|](\d{3,4})/);' 
matches

robert@saaz:~$ echo '1|1111|123' | perl -ne 'print "matches\n" if (m/(\d{1,4})[\s|](\d{4,6})[\s|](\d{3,4})/);' 
matches

【讨论】:

  • 谢谢 如果我想添加另一个 |像这样'1|11|11|123'
  • 您只需将其放入正则表达式中,只需为您需要的多个组重复\d{1-4}[\s|]。只要确保不要以[\s|] 结束正则表达式,否则它只会在输入以| 或空格结尾时匹配。
  • 罗伯特我做了但没有工作 (\d{1,4})[\s|](\d{4,6})[\s|](\d{4,6} )[\s|](\d{3,4}) 我正在使用 regex101.com 进行测试。
  • @DrJay 您的正则表达式需要 4 到 6 位数字,但您的输入只有 2 个(在管道之间)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多