我正在尝试多个正则表达式,但无法让它们工作。
我有一个简单的输入,用户可以输入他们喜欢的任何内容,只是最终结果必须包含表情符号。为了实现这一点,我必须从字符串中删除所有不是表情符号的字符,然后检查长度是否 >= 1。
所以基本上是这样的:
asf..?23kj😔gasdf..😅,fwe34
应该变成这样:😔😅
。然后我会检查长度以确认它 >=1,然后我就可以开始了。
从我从评论中得到的信息,其中一些可能有帮助,也可能没有帮助 -
验证字符串包含 1 个或多个表情符号:
# ^(?=[\S\s]*(?:\ud83d[\ude00-\ude4f]))
^
(?=
[\S\s]*
(?: \ud83d [\ude00-\ude4f] )
)
仅删除表情符号,保留其余部分(全局):
找到:
(?:\ud83d[\ude00-\ude4f])*((?:(?!\ud83d[\ude00-\ude4f])[\S\s])+)(?:\ud83d[\ude00-\ude4f])*
$1
(?: \ud83d [\ude00-\ude4f] )*
( # (1 start)
(?:
(?! \ud83d [\ude00-\ude4f] )
[\S\s]
)+
) # (1 end)
(?: \ud83d [\ude00-\ude4f] )*
要删除除表情符号(全局)之外的所有内容:
找到:
((?:\ud83d[\ude00-\ude4f])*)(?:(?!\ud83d[\ude00-\ude4f])[\S\s])+((?:\ud83d[\ude00-\ude4f])*)
$1$2
( # (1 start)
(?: \ud83d [\ude00-\ude4f] )*
) # (1 end)
(?:
(?! \ud83d [\ude00-\ude4f] )
[\S\s]
)+
( # (2 start)
(?: \ud83d [\ude00-\ude4f] )*
) # (2 end)
编辑:要使用不同的表情符号 utf16 范围,请执行以下操作
不同的高代理:
(?:
High_surrogate_A [Low_surrogate_start_A-Low_surrogate_end_A]
| High_surrogate_B [Low_surrogate_start_B-Low_surrogate_end_B]
| High_surrogate_C [Low_surrogate_start_C-Low_surrogate_end_C]
)
或者,相同的高替代值,不同的低替代值范围:
(?:
High_surrogate [Low_surrogate_start1-Low_surrogate_end1Low_surrogate_start2-Low_surrogate_end2]
)
或者混合:
(?:
High_surrogate_A [Low_surrogate_startA1-Low_surrogate_endA1Low_surrogate_startA2-Low_surrogate_endA2]
| High_surrogate_B [Low_surrogate_start_B-Low_surrogate_end_B]
)
您看到的地方:
(?: \ud83d [\ude00-\ude4f] )*
在占位符中替换上述其中一项
HERE
HERE
*
您看到的地方:
(?! \ud83d [\ude00-\ude4f] )
在占位符中替换上述其中一项
HERE
(?!
HERE
)
注意 - 您也可以添加高代理范围,但是所有高代理必须共享相同的低代理范围。
表情符号位于补充平面中,位于 1F601 - 1F64F。普通的 JS 正则表达式不能(很好)处理这样的代码点。如果您有一个支持新的
u
标志的 ES6 实现(Babel 可以),那么它应该可以为您完成这项工作。
tags.replace(/^[\u{1f600}-\u{1f64f}]/g, 'X');
否则,您需要考虑使用诸如https://github.com/mathiasbynens/regenerate之类的库。