Javascript正则表达式错误可能需要回溯类型功能?

时间:2015-08-12 20:08:30

标签: javascript arrays regex string

我试图在Javascript学习网站上完成练习。

说明如下:

  • 输入:单词的字符串,其中某些单词可能包含#标签符号/井号。

  • 输出:以#标签符号为前缀的字符串数组,但不包含标签/井号#。

  • 单独的英镑符号不计算在内,例如:字符串"#"将返回一个空数组。

  • 如果一个单词前面有多个主题标签,则只有最后一个主题标签计数(例如" ## alot"将返回["很多"])
  • Hashtags不能位于单词的中间(例如"#line hashtag"返回空数组)
  • Hashtags必须在字母字符之前(例如"#120398"或"#?"无效)

我的努力是这样的:

function getHashtags(post) {
  return /#(\w+)/.exec(post)
}

但它导致了这个:

String Input: Hello #world
Outpu t: [ '#world', 'world', index: 6, input: 'Hello #world' ]

String Input: #lol #sorryNotSorry #heya #coolbeans
Output: [ '#lol','lol', index: 0, input: '#lol #sorryNotSorry #heya #coolbeans']

String Input: # # # #
Output: null

String Input: this is an in#line hash
Output: [ '#line', 'line', index: 13, input: 'this is an in#line hash' ]

String Input: too ##many tags
Output: [ '#many', 'many', index: 5, input: 'too ##many tags' ]

String Input: invalid chars #$? #;wha
Output: null

String Input: "" //empty string
null

String Input: #blue#red#yellow#green
Output:[ '#blue', 'blue', index: 0, input: '#blue#red#yellow#green' ]

我认为我需要回顾功能,但我知道Javascript不支持它,我还没有找到解决方法!有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

你实际上(几乎)正确地这样做了。当您使用exec时,它只返回第一组结果。如果您继续致电exec(假设您正在使用全局标记g),则会开始返回下一个匹配项。这个例子来自mozilla的网站:

var myRe = /ab*/g;
var str = 'abbcdefabh';
var myArray;
while ((myArray = myRe.exec(str)) !== null) {
  var msg = 'Found ' + myArray[0] + '. ';
  msg += 'Next match starts at ' + myRe.lastIndex;
  console.log(msg);
}

Exec

我可以补充一点,每个人都可以从这问题的问题中得知。干得好,展示了你为解决问题所做的工作。我甚至会告诉你如何实现它。

function getHashtags(post)
{
    regex = /#(\w+)/g;
    arr = [];

    while((results = regex.exec(post)) !== null)
    {
        arr.push(results[1]);
    }

    return arr;
}

答案 1 :(得分:2)

  

Hashtags不能位于单词的中间(例如"#line hashtag"返回一个空数组)

- 使用不允许单词字符出现在\B之前的非单词边界#。另外,要在#位于主题标签中间时排除匹配项,请添加一个未跟# (?!#)\b的单词边界。

  

Hashtags必须在字母字符之前(例如"#120398"或"#?"无效)

- 在[a-zA-Z]之后立即使用#,然后您可以使用\w。如果您打算添加[a-z]修饰符,请/i

所以,使用

/\B#+([a-z]\w*(?!#)\b)/gi

请参阅demo

这将涵盖基于拉丁语脚本的基本标签提取。



function getHashtags(post) {
  var re = /\B#+([a-z]\w*(?!#)\b)/gi;
  arr = []; 
  while ((m = re.exec(post)) !== null) {
    arr.push(m[1]);
    document.write("Hashtag: " + m[0] + ", name: " + m[1] + "<br/>");
  }
  return arr;
}


var strs = ['##alot', 'Hello #world', '#lol #sorryNotSorry #heya #coolbeans', '# # # #', 'this is an in#line hash', 'too ##many tags', 'invalid chars #$? #;wha', '', '#blue#red#yellow#green'];
strs.forEach(function (str) {
  console.log(getHashtags(str));
});
&#13;
&#13;
&#13;