【问题标题】:Regex to find and replace emoji names within colons正则表达式查找和替换冒号中的表情符号名称
【发布时间】:2018-04-10 04:28:12
【问题描述】:

我正在尝试编写一个正则表达式(用于 JavaScript 的正则表达式引擎),我可以使用它在文本中查找和替换冒号内的表情符号名称。就像在 Slack 或 Discord 中输入 :smiley-face: 时一样,它会在您提交聊天时替换它。我只针对文本节点,所以我不需要担心文本中的其他 html。

是否可以编写一个可以匹配以下所有规则的正则表达式? (用等宽块突出显示的文本 = 正则表达式正匹配)

:any-non-whitespace:
:text1:sample2:
:@(1@#$@SD::s:
:nospace::inbetween:因为中间有2个冒号
:nospace:middle:nospace:

我从这样的东西开始,但它不完整

/:(?!:)\S+:/gim

我正在尝试考虑这样做可能发生的所有特殊情况。可能是我想多了。

涉及到很多 Twitch 表情,所以我不能使用 emoji Unicode 字符。正则表达式将找到匹配项并替换为标签

【问题讨论】:

  • 我不太清楚你的规则,请为你的每条规则举几个例子
  • 您的第二个示例不应被允许作为有效的表情符号格式。这样会更容易。
  • 你可以试试:[^:\s]*(?:::[^:\s]*)*:。与:(?:[^:\s]|::)*: 相同,但效率更高。
  • @chrisz 实际上 OP 不需要任何东西。为什么要修改 OP 要求?
  • Fransisc0,我将 chrisz 所做的更改回滚到您的原始帖子。请检查我的建议,让知道是否可行。

标签: javascript regex emoji


【解决方案1】:

我建议使用

:[^:\s]*(?:::[^:\s]*)*:

请参阅regex demo。它与:(?:[^:\s]|::)*: 的模式相同,但效率更高一些,因为(?:..|...)* 部分是unrolled

详情

  • : - 冒号
  • [^:\s]* - 除了: 和空格之外还有 0+ 个字符
  • (?: - 量化非捕获组的开始:
    • :: - 双冒号
    • [^:\s]* - 除了: 和空格之外还有 0+ 个字符
  • )* - 分组结束,重复 0 次或更多次(由于 * 量词)
  • : - 冒号。

【讨论】:

    【解决方案2】:

    你想要这样的正则表达式吗?

    (:(?![\n])[()#$@-\w]+:)
    

    Demo,,, 其中你可以额外插入unallowed characters(?![\n])的字符类中,也可以额外插入allowed characters到字符类[()#$@-\w]

    【讨论】:

    【解决方案3】:

    我的第一个想法是

    :(::|[^:\n])+:
    

    它匹配一个字符串,至少一个字符长,包括周围的冒号,由以下任一组成

    • 两个冒号 (::),或
    • 一个既不是冒号也不是换行符的字符。

    但这基本上是 Wiktor 作为(较慢)替代品(cmets)所拥有的。但无论如何我都会把它留在这里,因为它正在工作,而不是其他提交的答案;)

    See it here at regex101.

    【讨论】:

      【解决方案4】:

      试试这个正则表达式

      /(^|\s)+:([^\s\n\r])+:|^:[^\s\n\r]+/g

      【讨论】:

      • 回答问题很好,但如果能解释正则表达式的作用和工作原理,您的答案会更好。
      猜你喜欢
      • 2018-12-21
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多