【问题标题】:Match all instances of a certain character inside every word preceded by a certain word and not delimited by a space匹配以某个单词开头且不以空格分隔的每个单词中某个字符的所有实例
【发布时间】:2020-04-27 13:42:37
【问题描述】:

给定一个字符串,如下所示:

word.hi。布拉。词。

我想构建一个正则表达式,它将匹配所有以“word”开头的“.”和任何其他非空格字符

因此,在上面的示例中,我希望匹配第一个、第二个和最后一个点。

虽然使用全局标志 (/(?:word.*)\K./gU) 匹配第一个和最后一个点很容易,但我不确定如何构造一个也匹配第二个点的正则表达式。

感谢任何指针。

【问题讨论】:

  • 工具或语言是什么?
  • 我正在尝试在 ruby​​ 中使用 gsub,将点替换为破折号

标签: regex regex-lookarounds gsub


【解决方案1】:

您可以匹配 word,然后使用 \G 锚点获取所有连续匹配项,不包括匹配的空白字符或点。

(?:\bword|\G(?!\A))[^.\s]*\K\.

部分

  • (?:非捕获组
    • \bword 匹配 word 前面有一个单词边界
    • |或者
    • \G(?!\A)在上一场比赛结束时断言位置,而不是在开始时
  • )关闭非捕获组
  • [^.\s]* 匹配除 . 或空白字符之外的任何字符的 0+ 次出现
  • \K清除匹配缓冲区(忘记匹配到现在)
  • \.匹配一个点

Regex demo

【讨论】:

  • 很酷,谢谢,确实效果很好,将其标记为已接受的答案,但不应该转义点吗? (即在 [^.\s] 中)
  • @rmadhwal \G 锚在两个位置匹配,在字符串的开头或在前一个匹配的结尾。使用(?!\A) 可以防止字符串开头的匹配,因为它应该在单词之后匹配。字符类中的点不需要转义。
  • 在我输入之后阅读 \G 是如何工作的,所以编辑它!感谢您的帮助,非常感谢!
  • 事后看来,[^.\s]* 位确实很聪明,道具
猜你喜欢
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
相关资源
最近更新 更多