【问题标题】:regular expression to find the first occurance of a number from a given keyword正则表达式从给定关键字中查找数字的第一次出现
【发布时间】:2016-01-22 13:04:00
【问题描述】:

我有一个字符串

“ZTFN00识别号为89320394,手机号为+918017828848”

我想从关键字 ZTFN 中识别出第一次出现的数字(在本例中为 89320394)。此外,表达式不应返回带有 ZTFN 的 00,并且只返回第一次出现的数字。

我试过\d+(?!ZTFN00),但是不行!!

请推荐

【问题讨论】:

  • 真正相关的标签是什么?试试\b\d+\b(至少应该使用PCRE)。顺便说一句,正则表达式引擎只返回一个匹配,它取决于具体的语言来实现多个匹配。因此,如果您使用适当的方法,则只会返回第一个匹配项。
  • 如果您的要求是匹配第一次出现的 89320394 的 8 位数字,请尝试 \d{8} 关闭 global 否则 @WiktorStribiżew 建议的也是正确的。
  • 要获取单词边界后的第一个数字,请尝试^.*?\b\K\d+ like this
  • 您是否在寻找ZTFN00 之后的第一个孤立数字字符串? print / (?: ZTFN00 ){1}+ .*? \b (\d+) \b /x。尽管可能会删除其中的大部分内容,但这取决于您的实时数据格式。您应该始终发布一些真实数据,以便我们在发布解决方案之前对其进行测试

标签: regex perl pcre pcregrep


【解决方案1】:

应该这样做:

perl -ne '/ZTFN00\D+(\d+)/ && print $1,"\n"' yourfile

如果您的“数字”始终由空格分隔(ZTFN 后没有 00),那么您可以将其用作测试:

perl -ne 'print m/\b(\d+)\b/,"\n"' yourfile

【讨论】:

  • \d+周围使用群表达的目的是什么?
  • @noob:因为 Perl 不能很好地工作/根本无法像所有其他语言一样使用 \g<0>/\0/$0
  • @Wiktor Stribiżew,Perl 确实有。它被称为$&。这也不是这里需要的。
  • “Perl 不能很好地工作/根本不能与 \g<0>/\0/$0 像所有其他语言一样”。即使您将$& 添加到列表中,该陈述也是完全错误的。
  • @WiktorStribiżew:长期以来,在代码中的任何位置使用$& 都会对程序中的每个模式匹配产生开销。有各种半心半意的修复,但 Perl 5 v20 终于解决了这个问题。除非您不关心性能,否则您可以保证您的程序将始终在 Perl 5 v20 或更高版本下运行。你仍然应该避免使用$&
【解决方案2】:
grep -Po 'ZTFN00.*?\K\b\d+\b'

返回在该数字之前看到ZTFN00 的行中单词边界之间的第一个数字。 \K 是一个可变长度的后视:“匹配我左边的内容,但不要保留它”。

【讨论】:

    【解决方案3】:

    谢谢大家! 简单来说,我要找的是这个 如果有一个字符串,它有一个关键字 ZTFN00,那么正则表达式应该能够返回字符串左边或右边最接近的 9 到 11 位数字。

    我想在 oracle 的 REGEXP_REPLACE 函数中执行此操作。

    以下是一些示例字符串

    1. 作为组合的一部分,SAP UPDATE_BP 服务中出现以下错误(错误:653,R11:186:ID 类型 ZTFN00 的编号 867278489 已存在)

    在上面,正则表达式应返回 867278489

    1. 作为组合的一部分,SAP UPDATE_BP 服务中出现以下错误(错误:653,R11:186:编号 ZTFN00 标识号 123456778 已存在)

    在上面,正则表达式应返回 123456778

    非常感谢您分享您的专业知识和指导

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      相关资源
      最近更新 更多