我已经进行了大约6个多小时的互联网搜索,试图找出以下内容:
- 我需要一个javascript正则表达式,用于标识
#
字符位于令牌的末尾 - 标记分隔符是一个空格
- 我有以下Regex:
/(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#
请求背后的原因是我们的应用程序具有"拒绝"关键字功能,因此我想拒绝以#
结尾的所有令牌/单词,例如UPS09870#
(可能是UPS办公室位置,我只想要UPS(。
我们的应用程序还有一个"接受"功能(基于Regex(,可以保持UPS的价值。
PS-我有一个正则表达式来测试以#
开头的单词/令牌,如下所示:/(^|s)#(-|w+)/ig
提前感谢您的帮助。
我根本不会使用正则表达式,它们对这个任务来说太过分了。
function accept(s) {
return s.split(' ').filter(x => x.endsWith('#'));
}
结果将是一个匹配单词的数组。如果您想要包含列表的字符串,请将.join(' ')
添加到链的末尾。
您可以使用
/(?:^|s)w+#(?!S)/g
请参阅regex演示。
详细信息
(?:^|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)
)
您可以将split()
和filter()
方法与/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);
我刚刚也尝试了一些解决方案:\b(\w+(*[#]\b