使用正则表达式拆分主题标签和搜索项目

时间:2019-05-31 00:22:32

标签: javascript regex

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

Cat

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

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

我想要做的是将#标签和单词分成两个单独的列表,因此我希望能够更新第二个regex表达式,以便它忽略#标签。我将如何实现?

例如,如果输入为:

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

预期输出应为2个数组:

"Hello this is #my #question for today"

如果可能的话,我还想使主题标签正则表达式返回不包含主题标签的单词,否则,我可以稍后在数组中对单词进行字符串拆分

2 个答案:

答案 0 :(得分:1)

您可以同时使用负向和正向回望。显然,否定的lookbehinds将匹配没有您的“哈希标签”的作品,而肯定的将与包含它们的那些匹配。


负向隐藏匹配您的常规搜索字词

/\b(?<!#)[^#\s]+/g
  • \b确保您正在看一个单词的开头
  • (?<!)是令人反感的。禁止匹配#

Regex101 Example


正向查找以匹配您的“散列”单词

/(?<=#)\w+/g
  • (?<=)是正向查找,如果在#之后发现\w+,则允许匹配

Regex101 Example


Additional information关于环视

答案 1 :(得分:0)

您可以简单地分割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)