【问题标题】:Matching a number preceeded by a know string, followed by an unknown number of characters匹配一个数字,前面是已知字符串,后跟未知数量的字符
【发布时间】:2014-09-15 23:14:24
【问题描述】:

[SOME_WORDS:200:1000]

尝试仅匹配最后一个 1000 部分。这两个数字都是可变的,并且可以包含未知数量的字符(尽管它们应该包含数字,但我不能排除它们也可能包含其他字符)。 SOME_WORDS 部分是已知的,不会改变。

所以我首先对[SOME_WORDS: 进行积极的后视,然后对尾随的] 进行积极的前瞻
这给了我们(?<=\[SOME_WORDS:).*(?=])的模式
并截取部分200:1000

现在因为我不知道SOME_WORDS: 后面有多少个字符,但我知道它以另一个: 结尾,所以我使用.*: 来表示任何时间的任何字符,然后是:
这给了我们(?<=\[SOME_WORDS:.*:).*(?=])的模式

但是此时模式不再匹配任何东西,这就是我感到困惑的地方。我在这里做错了什么?

如果我假设第一个数字总是 3 个字符长,我可以将 .* 替换为 ... 以获得模式 (?<=\[SOME_WORDS:...:).*(?=]) 并且这正确捕获了 1000 部分。但是我不明白为什么用.* 替换... 会使模式无法捕获任何内容。

编辑: 我用来测试正则表达式模式的在线工具似乎无法正常工作。模式(?<=\[SOME_WORDS:.*:).*(?=])1000 匹配,在.net 中实际完成时没有问题

【问题讨论】:

  • 简单地回答,没有。
  • 为什么不这样做:\[SOME_WORDS:\d+:(\d+)\]?或者即使你不能保证数字是数字:\[SOME_WORDS:.+:(.+)\]
  • @Garry 你可以试试这个(?<=\[SOME_WORDS:[^:]*:).*(?=])
  • @AvinashRaj 不确定这是有效的正则表达式

标签: c# regex


【解决方案1】:

您通常不能在后视中使用+*,只能在前瞻中使用。 如果 c# 确实允许这些,那么您可以使用 .*? 而不是 .*,因为 .* 会吃掉第二个 :

试试这个: (?<=\[SOME_WORDS:)(?=\d+:(\d+)]) 比赛将在第一个捕获组中

引用http://www.regular-expressions.info/lookaround.html

坏消息是大多数正则表达式风格不允许您在后视中使用任何正则表达式,因为它们不能向后应用正则表达式。正则表达式引擎需要能够在检查回溯之前计算出要退回多少个字符。在评估后视时,正则表达式引擎确定后视内正则表达式的长度,后退主题字符串中的许多字符,然后在后视内从左到右应用正则表达式,就像使用普通正则表达式一样。

【讨论】:

    【解决方案2】:

    正如 Robert Smit 所说,这是因为 * 是一个贪婪的运算符。贪婪运算符在首先匹配时尽可能多地使用字符。如果匹配失败,他们只会放弃字符。如果你让贪婪操作符变得懒惰(*?),那么匹配会消耗尽可能少的字符以使匹配成功,所以:不会被*.消耗你也可以使用[^:]*,即匹配除: 以外的任何字符。

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多