【问题标题】:Using Regex to split hashtag and search items使用 Regex 拆分主题标签和搜索项
【发布时间】:2019-05-31 00:22:31
【问题描述】:

我有一个正则表达式来列出输入到我的应用程序中的搜索中的主题标签,如下所示:

text.match(/#[a-z]+/gi);

和一个正则表达式来列出搜索中的所有单词

text.match(/\S+\s*/g);

我希望能够将主题标签和单词拆分为两个单独的列表,因此我希望能够更新第二个正则表达式,使其忽略主题标签。我将如何实现这一目标?

例如,如果输入是:

"Hello this is #my #question for today"

预期的输出应该是 2 个数组:

[Hello, this, is, for, today], 
[my, question]

如果可能的话,我还想让主题标签正则表达式返回没有主题标签的单词,否则如果不可能,我可以稍后将字符串拆分为数组中的单词

【问题讨论】:

  • 您能否举一个搜索字符串和当前输出的示例以及您的预期输出示例?谢谢。
  • @NewToJS 感谢您的回复。我已经包含了预期的输出

标签: javascript regex


【解决方案1】:

您可以通过消极和积极的后视来做到这一点。显然,负面的lookbehinds 将匹配没有您的“哈希标签”的作品,而正面的将匹配那些带有它们的作品。


Negative LookBehind 以匹配您的正常搜索字词

/\b(?<!#)[^#\s]+/g
  • \b 确保您正在查看单词的开头
  • (?&lt;!) 是消极的后视。阻止# 的匹配

Regex101 Example


Positive LookBehind 以匹配您的“散列”字词

/(?<=#)\w+/g
  • (?&lt;=) 是一个正向的后视,如果在 \w+ 后面找到 #,则允许匹配

Regex101 Example


Additional information 关于 Lookarounds

【讨论】:

    【解决方案2】:

    您可以简单地拆分 space 字符,然后您可以检查单词是否以 # 开头或不使用此正则表达式

    `/^#.+/`
    

    上面的正则表达式匹配#,后跟至少一个字符,如果你想匹配单个#,也可以简单地使用startsWith

    /^#.+/.test(inp)   ---> inp.startsWith('#')
    

    let str = `Hello this is #my #question for today`
    
    let {withHash,withOutHash} = str.split(/\s+/).reduce((op,inp)=>{
      let hash = /^#.+/.test(inp)
      let key = hash ? 'withHash' : 'withOutHash'
      op[key] = op[key] || []
      op[key].push(inp)
      return op
    },{})
    
    
    console.log(withHash)
    console.log(withOutHash)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 2017-01-15
      • 2014-12-09
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 2014-11-09
      相关资源
      最近更新 更多