【问题标题】:Regex to only keep hashtags正则表达式仅保留主题标签
【发布时间】:2021-06-20 14:33:03
【问题描述】:

使用正则表达式我试图只在文本中保留主题标签。我正在尝试匹配其他所有内容并替换为不重要的组。但也许有更聪明的方法。

示例文本:

This is a #text, which is #full of #hashtags.
Well, this is not #easy to
#extract #them. 
I think I #start to lose: #hope.

我最好的尝试:([\s\.\,]|^)[^#]\w+([\s\.\,]*?|$)

替换为$2 返回

 a #text #full #hashtags #easy
#extract #them. I #start: #hope.

预期结果应该有 4 行,如示例中所示。空间也可以保留。
理想的期望结果:

#text #full #hashtags
#easy
#extract #them
#start #hope

Demo

【问题讨论】:

  • 没有关于正则表达式引擎和编程语言的确切细节,提供一个简单的答案并不容易。尝试将(#\w+)|(?:(?!#\w).)+ 替换为"$1 "(没有")。如果你在 Notepad++ 中工作,它会变得简单得多。
  • 使用 PCRE2,您可以使用 conditional replacement。 Boost 也可以这样做,但替换为 (?{1}$1\n:)

标签: regex hashtag regexp-replace


【解决方案1】:

如果您不介意保留前导空格(之后可能会修剪),您可以在替换和匹配中使用第 1 组:

.*?(\s*#\w+)|.+

模式匹配:

  • .*? 尽可能匹配除换行符以外的任何聊天内容
  • (\s*#\w+) 在第 1 组中捕获匹配的可选空白字符,然后是 # 和 1+ 个单词字符
  • |或者
  • .+ 匹配除换行符以外的任何字符 1 次以上

Regex demo

如果您不想保留前导空格但不介意尾随空格,则可以在替换和匹配中使用组 1 后跟空格:

.*?(#\w+)|.+

Regex demo

【讨论】:

    【解决方案2】:

    这个很好,很容易理解,和你的替换一样:

    [^#]*?(#\w+)
    

    它只吃尽可能多的字符,直到遇到#,然后将所有正常单词字符捕获到组中,然后重复。

    Try it online!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 2011-03-05
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多