在字符串开头时使用可变的多个标识符块和不同的语义来解析输入,而不会后退

时间:2019-01-23 11:21:51

标签: javascript regex

我写了some regex,它可以查看一个字符串并抽取可变数量的匹配项。这些匹配项是由特殊的起始字符串确定的,但是如果它们位于字符串的开头,则会有些不同,并且也不应该将它们收集在结果中。 (请原谅我缺乏适当的正则表达式术语!)它可能写得不太好,但大多数情况下都有效。问题在于它使用了后向功能,而Firefox仍然不支持此功能。因此,我很乐意为您提供一些帮助。这是一个示例:

 /(?<=(?:^| +)#).+?(?:(?= +[#>:].+)|$)/g

一些投入和预期产出:

hello #a tag here #another tag :something else #tags-> ['a tag here', 'another tag', 'tags']

#tag-> ['tag']

#x #(字符串开头的空格,由于某种原因SO正在将其删除)-> ['x']

#x #y-> ['x', 'y']

#x#y-> ['x#y']

干杯!

1 个答案:

答案 0 :(得分:0)

您可以捕获所需的子字符串:

/(?:^| )#(.+?)(?= +[#>:]|$)/g

请参见regex demo。要匹配任何空白字符,请用\s替换模式中的常规空格。

详细信息

  • (?:^| )-字符串或空格的开头
  • #-一个#字符
  • (.+?)-除换行符以外的任何1个或多个字符,应尽可能少
  • (?= +[#>:]|$)-此位置必须有字符串结尾,或者1+空格后跟#>:

var strs = ['hello #a tag here #another tag :something else #tags','#tag','#x #y','#x#y',' #x'];
for (var s of strs) {
  var rx = /(?:^| )#(.+?)(?= +[#>:]|$)/g;
  console.log(s);
  var m, res = [];  
  while (m=rx.exec(s)) {
    res.push(m[1]);
  }
  console.log(res);
}