使用Regex识别以特定字符(#)结尾的所有标记/单词



我已经进行了大约6个多小时的互联网搜索,试图找出以下内容:

  1. 我需要一个javascript正则表达式,用于标识#字符位于令牌的末尾
  2. 标记分隔符是一个空格
  3. 我有以下Regex:/(w+[#])/ig3a。上述Regex的问题是,它将返回99999#999#以及a#dfkjdf#dfd#(其中哈希位于字符串/令牌中间
  4. 测试数据看起来像一个文本字符串:
    #78890 _1ASBCJH- #78890 999 #werer 99999# today? 999#999 a#dfkjdf#dfd#f
  5. 因此,结果集应为9999#,仅适用于以上

  6. 对于这样的测试数据:#78890 _1ASBCJH- #78890 999 #werer 99999# 999#999 today# a#dfkjdf#dfd#f

  7. 结果集应为: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+#$/gregex组合使用,以获得所需结果:

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

最新更新