我花了大约6个小时以上的时间来进行互联网拖网调查,以尝试找出以下问题:
#
字符位于令牌的末尾。/(\w+[#])/ig
3a。上述Regex的问题在于它将返回99999#
和999#
和a#dfkjdf#dfd#
(其中哈希值位于字符串/令牌中间#78890 _1ASBCJH- #78890 999 #werer 99999# today? 999#999 a#dfkjdf#dfd#f
因此,仅对于以上
9999#
用于以下测试数据:
#78890 _1ASBCJH- #78890 999 #werer 99999# 999#999 today# a#dfkjdf#dfd#f
结果集应为:
99999# today#
请求背后的原因是我们的应用程序具有'reject'关键字功能,因此我想拒绝所有以#
结尾的令牌/单词,例如UPS 09870#
(这可能是一个UPS办公地点,我只想要UPS)。
我们的应用程序还具有“接受”功能(基于Regex),可以保持UPS的价值。
PS-我使用正则表达式来测试以#
开头的单词/令牌,如下所示:/(^|\s)#(-|\w+)/ig
在此先感谢您的帮助。
答案 0 :(得分:3)
我根本不会使用正则表达式,因为它们对于完成这项任务来说是多余的。
function accept(s) {
return s.split(' ').filter(x => x.endsWith('#'));
}
结果将是匹配单词的数组。如果您想要包含列表的字符串,请在链的末尾添加.join(' ')
。
答案 1 :(得分:1)
您可以使用
/(?:^|\s)\w+#(?!\S)/g
请参见regex demo。
详细信息
(?:^|\s)
-字符串或空格的开头\w+
-1个以上的字符字符#
-一个#
字符(?!\S)
-在#
之后紧接空格或字符串结尾。JS演示:
console.log(
"#78890 _1ASBCJH- #78890 999 #werer 99999# 999#999 today# a#dfkjdf#dfd#f"
.match(/(?:^|\s)\w+#(?!\S)/g)
.map(function(x) { return x.trim(); })
)
或者,如果您仅打算支持ECMAScript 2018兼容环境,则可以使用后视供电模式/(?<!\S)\w+#(?!\S)/g
,其中(?<!\S)
要求空格或字符串的开头必须紧靠左侧当前位置:
console.log("#78890 _1ASBCJH- #78890 999 #werer 99999# 999#999 today# a#dfkjdf#dfd#f"
.match(/(?<!\S)\w+#(?!\S)/g)
)
答案 2 :(得分:1)
您可以将split()
和filter()
方法与 the /\w+#$/g
regex 结合使用,以获得所需的结果:
str.split(" ").filter(v => v.match(/\w+#$/));
演示:
这是一个有效的演示:
var str = "#78890 _1ASBCJH- #78890 999 #werer 99999# today# 999#999 a#dfkjdf#dfd#f";
var results = str.split(" ").filter(v => v.match(/\w+#$/));
console.log(results);
答案 3 :(得分:0)
我也尝试作为解决方案: \ b(\ w +)* [#] \ B