【问题标题】:How to replace all the words that contain an underscore in a string using Regex and JavaScript?如何使用 Regex 和 JavaScript 替换字符串中包含下划线的所有单词?
【发布时间】:2020-06-05 13:46:50
【问题描述】:

我想使用正则表达式检测所有带有下划线的单词(但不仅是英语!),然后在它们前面放置一个井号标签,例如这样的句子:

mind_viral immunity is an important element of general_wellbeing

将产生两个匹配项:mind_viral 和 'general_wellbeing`,然后将字符串更改为

#mind_viral immunity is an important element of #general_wellbeing 

我正在尝试使用这个正则表达式:

([a-zA-Z]+(?:_[a-zA-Z]+)*)

但它匹配所有单词,而不仅仅是带有下划线的单词。

我可以做些什么不同的事情?

【问题讨论】:

  • [a-zA-Z]+(?:_[a-zA-Z]+)+ - + 匹配一次或多次次
  • @Aerodynamika 另外,前导或尾随或相邻的下划线呢?我可能会选择([a-zA-Z]*(?:_[a-zA-Z]*)+) 这场比赛mind_viral。 mind__viral、_mindViral、mindViral_ 等。
  • @WiktorStribiżew 请你重新打开这个问题,因为我还需要它不仅可以用英语工作,而且你提供的答案不包括这种可能性。
  • 什么意思?它涵盖了你的问题。如果您需要匹配任何字母,请将 [A-Za-z] 替换为 \p{L}、[[:alpha:]](请参阅 this)(如果您的库支持)。
  • @WiktorStribiżew 不,它没有。它不适用于俄语。我也希望能够不仅匹配它们而且替换它们。请重新打开问题,以便其他人也可以提供他们的答案。谢谢。

标签: regex


【解决方案1】:

借助 ECMAScript 2018+ 兼容的 JS 环境,您可以使用

s = s.replace(/\p{L}+(?:_\p{L}+)+/gu, '#$&')

注意u 标志,它在 JS 正则表达式中启用 Unicode 属性类。

这里,

  • \p{L}+ - 匹配任何一个或多个 Unicode 字母
  • (?:_\p{L}+)+ - 一次或多次重复
    • _ - 下划线
    • \p{L}+ - 任意一个或多个 Unicode 字母

替换为#$&:# 是文字字符,$& 是对整个匹配值的反向引用。

查看 JS 演示:

const s = "mind_viral immunity is an important element of general_wellbeing виктор_стрибижев привет";
console.log(s.replace(/\p{L}+(?:_\p{L}+)+/gu, '#$&'));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2016-10-13
    相关资源
    最近更新 更多