Javascript正则表达式:查找一个不跟随空格字符的单词

7
我需要一个JavaScript正则表达式,可以匹配不以空格字符结尾且紧接着有@符号的单词,像这样:

@bug - 匹配 "@bug",因为它后面没有空格

@bug and me - 不匹配任何内容,因为"@bug"后面有空格

@bug and @another - 只匹配"@another"

@bug and @another and something - 不匹配任何内容,因为两个单词都后面跟着空格。

能帮忙吗? 补充说明: 字符串是从中获取的,而FF会在其末尾添加自己的标记。虽然我基本上只需要以@开头的最后一个单词,但$(字符串结尾)不能用。


1
当你说“不跟随空格字符”时,你是真的在说“在字符串的末尾”吗?它们不一定是同一件事。 - user1106925
不是的,它来自contenteditable div,而且FF会在末尾放置它自己的标签。 - Zeljko
2个回答

16

尝试使用re = /@\w+\b(?! )/。它会查找一个单词(确保捕获整个单词),并使用负向预查来确保单词后面没有空格。

使用上述设置:

var re = /@\w+\b(?! )/, // etc etc

for ( var i=0; i<cases.length; i++ ) {
    print( re2.exec(cases[i]) )
}

//prints
@bug
null
@another
null
唯一可能无法正常工作的情况是您的单词以下划线结尾并且您希望该标点符号成为单词的一部分:例如 '@bug and @another_ blahblah' 将选择出 @another,因为 @another 后面没有跟随一个空格。
这似乎不太可能发生,但如果您也想处理该情况,则可以使用 /@\w+\b(?![\w ]/,这将对@bug and @another_返回null,对于@another和@bug_则返回@bug_

5

听起来你只是想要在输入的结尾找到单词:

/@\w+$/

测试:

var re = /@\w+$/,
    cases = ['@bug',
             '@bug and me',
             '@bug and @another',
             '@bug and @another and something'];

for (var i=0; i<cases.length; i++)
{
    console.log(cases[i], ':', re.test(cases[i]), re.exec(cases[i]));
}

// prints
@bug : true ["@bug"]
@bug and me : false null
@bug and @another : true ["@another"]
@bug and @another and something : false null

1
问题在于这个字符串来自<div contenteditable="true">,由于某种原因,FF总是添加一些标签,比如:<br _moz_dirty="">。在这种情况下,正则表达式无法工作。 - Zeljko
@Zeljko,示例输入没有显示任何类似的内容,而您的问题也没有提到HTML。想要更好的答案?那就问一个更好的问题。 - Matt Ball
你说得对,我没有注意到那个额外的标记。有什么提示吗?我尝试了负向先行断言和其他的方法,但它都失败了。 - Zeljko
@Zeljko 像我说的一样,我真的不知道输入实际上是什么样子,所以如果没有看到你正在使用的真实输入,我就无法提供太多帮助。为什么不在传递给正则表达式之前先去掉 <br _moz_dirty="">?无论如何,现在是睡觉时间了,明天早上我会再来查看。 - Matt Ball
想象一下这样的输入:** #bug and #another<br_moz_dirty="">** 我不能只是去掉这个标签,因为其他浏览器可能会自己添加其他内容。 - Zeljko
@Zeljko,晚上最后一个建议:https://dev59.com/WXA75IYBdhLWcg3wH1bP - Matt Ball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接