我正在尝试编写一个正则表达式(用于JavaScript的正则表达式引擎),我可以用它来查找并替换冒号中表情符号名称的文本。当您键入:smiley-face:
时,就像在Slack或Discord中一样,当您提交聊天时它会替换它。我只针对文本节点,所以我不需要担心文本中的其他html。
是否可以编写一个可以匹配以下所有规则的正则表达式? (用monospace blocks突出显示的文本=正则表达式正匹配)
:any-non-whitespace:
:text1:
SAMPLE2:
:@(1@#$@SD:
:s:
:nospace::inbetween:
因为中间有2个冒号
:nospace:
{中间{1}}
我从这样的事情开始,但它不完整
:nospace:
我正在考虑可能发生这种情况的所有特殊情况。也许我正在过度思考它。
有很多Twitch表情,所以我不能使用表情符号unicode字符。正则表达式将找到匹配项并替换为标记
答案 0 :(得分:2)
我建议使用
:[^:\s]*(?:::[^:\s]*)*:
请参阅regex demo。它与:(?:[^:\s]|::)*:
具有相同的模式,但效率更高,因为(?:..|...)*
部分为unrolled。
<强>详情
:
- 冒号[^:\s]*
- 除:
和空格(?:
- 开始量化的非捕获组:
::
- 双冒号[^:\s]*
- 除:
和空格)*
- 分组结束,重复0次或更多次(由于*
量词):
- 冒号。答案 1 :(得分:0)
我的第一个想法是
:(::|[^:\n])+:
它匹配一个字符串,至少一个字符长,包括周围的冒号,由
组成::
)或但这基本上是Wiktor所拥有的(较慢的)替代方案(评论)。但是,无论如何我会把它留在这里,因为它正在工作,而不是其他提交的答案;)
答案 2 :(得分:0)
你想要这样的正则表达式吗?
list_filter = ['position']
Demo ,,,您可以另外将(:(?![\n])[()#$@-\w]+:)
插入unallowed characters
的字符类,并将(?![\n])
添加到字符类allowed characters
中}
答案 3 :(得分:0)
尝试此regx
/(^|\s)+:([^\s\n\r])+:|^:[^\s\n\r]+/g