【问题标题】:Regex - match only first occurence in line and ignore every second正则表达式 - 仅匹配第一次出现并忽略每一秒
【发布时间】:2018-02-08 07:18:36
【问题描述】:

我有一个文本文件中的一行,我只想匹配第一个出现的数字而忽略第二个。 字符串如下所示:

Dauerstufe              1 a             1 a             2 a             2 a             3 a             3 a             5 a             5 a            10 a            10 a            20 a            20 a            30 a            30 a            50 a            50 a           100 a           100 a

所以我只想匹配:1 2 3 5 10 20 30 50 100 或用户可能想要输入的任何其他数字。 使用[0-9]+ 仅匹配数字非常容易。 但是如何让它只匹配第一个呢?

提前感谢您的帮助!

编辑:我忘了说正则表达式要在 vba 中使用。

【问题讨论】:

  • 使用编程语言
  • 获得匹配项后,您始终可以删除重复项。

标签: regex


【解决方案1】:

最简单的方法是使用哈希表或关联数组。

使用匹配的号码作为键。

PHP 示例如下:

$myarray[$x] = "";

稍后,只需循环数组的键。由于它只会在密钥存在时覆盖,因此您不必担心删除重复项。

【讨论】:

    【解决方案2】:

    使用这个(.*?)(?'first'\d{1,3})(.+?)(\k{first})( a)

    Online demo

    【讨论】:

    • 有什么办法可以在 vba 中进行这项工作吗? (见编辑过的原始问题)并且只匹配数字——而不是它周围的所有东西?
    【解决方案3】:

    要获取您要查找的值,您还可以使用否定前瞻选择最后出现的值。

    \b(\d+)\b(?!.*\1\b)

    【讨论】:

      【解决方案4】:

      您可以使用/[0-9]+/ regexp 并在RegExp 对象上设置Global 标志。

      Set myRegExp = New RegExp
      myRegExp.Global = True
      myRegExp.Pattern = "[0-9]+"
      

      查看详情:How to Use the VBScript RegExp Object

      【讨论】:

        猜你喜欢
        • 2018-06-28
        • 2016-03-18
        • 2022-08-13
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多