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

时间:2018-07-23 12:18:24

标签: javascript regex string pattern-matching

我花了大约6个小时以上的时间来进行互联网拖网调查,以尝试找出以下问题:

  1. 我需要一个JavaScript正则表达式来标识#字符位于令牌的末尾。
  2. 令牌定界符为空白
  3. 我有以下正则表达式:/(\w+[#])/ig 3a。上述Regex的问题在于它将返回99999#999#a#dfkjdf#dfd#(其中哈希值位于字符串/令牌中间
  4. 测试数据看起来像是一串文本:
    #78890 _1ASBCJH- #78890 999 #werer 99999# today? 999#999 a#dfkjdf#dfd#f
  5. 因此,仅对于以上

  6. ,结果集应为9999#
  7. 用于以下测试数据: #78890 _1ASBCJH- #78890 999 #werer 99999# 999#999 today# a#dfkjdf#dfd#f

  8. 结果集应为: 99999# today#

请求背后的原因是我们的应用程序具有'reject'关键字功能,因此我想拒绝所有以#结尾的令牌/单词,例如UPS 09870#(这可能是一个UPS办公地点,我只想要UPS)。

我们的应用程序还具有“接受”功能(基于Regex),可以保持UPS的价值。

PS-我使用正则表达式来测试以#开头的单词/令牌,如下所示:/(^|\s)#(-|\w+)/ig

在此先感谢您的帮助。

4 个答案:

答案 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