【问题标题】:Identify all tokens/words which end with a specific character (#) using Regex使用正则表达式识别所有以特定字符 (#) 结尾的标记/单词
【发布时间】:2018-07-23 12:18:24
【问题描述】:

我已经通过大约 6 个多小时的互联网拖网来尝试找出以下内容:

  1. 我需要一个 javascript 正则表达式来标识 # 字符位于标记的末尾。
  2. 标记分隔符是一个空格
  3. 我有以下正则表达式:/(\w+[#])/ig 3a。上述正则表达式的问题在于它将返回 99999# AND 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#

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

我们的应用程序还有一个“接受”功能(基于正则表达式),可以保持 UPS 值。

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

提前感谢您的帮助。

【问题讨论】:

  • 抱歉格式化,这些数字应该更容易阅读。

标签: javascript regex string pattern-matching


【解决方案1】:

我根本不会使用正则表达式,它们对于这项任务来说太过分了。

function accept(s) {
    return s.split(' ').filter(x => x.endsWith('#'));
}

结果将是匹配单词的数组。如果您想要一个包含列表的字符串,请将@​​987654322@ 添加到链的末尾。

【讨论】:

  • 使用endsWith() 确实比正则表达式更好,很好的方法。
  • @chŝdk 它还具有对不匹配 \w 的字符不敏感的优点。
  • 是的,确实使用它是 100% 安全的,不管 # 之前的字符是什么,你都打败了我 ;)
  • 感谢您的回答。不幸的是,它必须是一个正则表达式。
  • @AndyS 为什么?如果这是人为的限制(例如,因为这是家庭作业),你应该这么说。
【解决方案2】:

你可以使用

/(?:^|\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)
)
        

【讨论】:

    【解决方案3】:

    您可以结合使用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);

    【讨论】:

    • 附注正则表达式上的 /g 限定符是多余的。
    • @Alnitak 是的,很好地指出,我只是从我正在测试的 regex101 中复制它。谢谢;)
    • 您当然可以通过完全省略正则表达式中的\w+ 来使这个“安全”回复:其他字符,即v.match(/#$/)
    • 嗯,是的,这是真的,尽管 OP 从未明确定义什么是令牌。我的.endsWith() 解决方案在技术上也存在同样的问题。
    【解决方案4】:

    我刚刚尝试过的解决方案也是: \b(\w+)*[#]\B

    【讨论】:

      猜你喜欢
      • 2017-09-12
      • 2013-08-26
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多