【问题标题】:How to match a specified character after the nth occurrence of a delimiter如何在第 n 次出现分隔符后匹配指定字符
【发布时间】:2017-03-31 08:48:36
【问题描述】:

我刚刚在 regex101 上测试了一个正则表达式,并得到了一些意想不到的结果。我试过的表达是

^[^-]*(?:-[^-]*){1}\Kt

在这个字符串上

this is a test - try to split -this- string - into its substrings

regex101上的匹配结果是单词“split”末尾的“t”

这是一个测试 - 尝试将t -this- 字符串 - 拆分为它的子字符串

为什么不返回单词“try”中的第一个“t”?

这是一个测试 - t尝试将 -this- 字符串 - 拆分为其子字符串

【问题讨论】:

  • 因为* 是贪婪的并且[^-] 匹配t。您是否打算使用^[^-]*-[^-]*?\Kt?甚至^[^-]*-[^-t]*\Kt?
  • 哇,谢谢,这确实有效。你太棒了:)

标签: regex string


【解决方案1】:

这里有几点需要注意:

  • [^-]t 匹配,并且与 * 贪婪量词匹配,直到它在途中找到的最后一个 t
  • t 可以添加到否定字符类以匹配第一个 t, or makelazy with?`
  • {1} 限制量词是多余的,因为每个模式原子默认匹配一次
  • 仅对其中一个分支或没有量词使用非捕获组是没有意义的

使用

^[^-]*-[^-]*?\Kt

^[^-]*-[^-t]*\Kt

【讨论】:

  • 感谢维克托。只是好奇,在没有指定非捕获组和随后的编号量词的情况下,我将如何选择单词“string”中的“t”(即在出现 3 次“-”分隔符之后),使用前面的表达式捕获组,可以通过 ^[^-]*(?:-[^-]*?){3}\Kt 来实现
  • 那么你需要使用一个分组结构。我写道:只有一个分支或没有量词。如果需要使用量词,则必须使用组。
  • 感谢您的澄清,我在 2-3 小时前才开始使用正则表达式,因此其中一个分支部分对我来说有点神秘,所以我感到困惑并略过了下一部分,抱歉。跨度>
  • 好的,我明白了。如果您在此处需要更多说明,请随时发表评论。
猜你喜欢
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多