0

我想在版本控制提交消息中添加很多 Redmine 问题编号,这些编号前面带有 # 符号,例如 #123、#456 等,但我只想匹配它们,如果它们被标点字符集包围,或者是行的开头或结尾。例如 '#234aa, #567' 应该只匹配 #567。', - ;#456,,' 应该匹配 #456 因为 ',-; ' 都在标点字符集中。我尝试了一个示例表达式

function myFunction()
{
    var str="erwet,#3456 #623 #345 fdsfsd"; 
    var n=str.match(/\#[\d+]+[\s]/g);
    document.getElementById("demo").innerHTML=n;
}

我也想将它们匹配到一个数组或一个列表中,但我正在尝试的演示将它们匹配到一个字符串中。

4

1 回答 1

1

好的,所以我认为我有一个正则表达式可以完成这项工作,它匹配标点符号的事实使您示例中的几个句子有点令人困惑,但这里是:

var re = /(?:^|['".,;:\s])(#\d+)(?:['".,;:\s]|$)/;​

这可以分解为:

(?:^|['".,;\s]) //matches either the beginning of the line, or punctuation
(#\d+ )         //matches the issue number
(?:['".,;:\s]|$)//matches either punctuation, whitespace, or the end of the line

所以我们得到:

re.test('#234aa, #567') //true
re.exec('#234aa, #567') //["#567", "#567", "", index: 8, input: "#234aa, #567"] 
re.test("', - ;#456,,'")//true
re.exec("', - ;#456,,'")//[";#456,", "#456", index: 5, input: "', - ;#456,,'"]   

我不太确定\s最后一点,因为这既不是标点符号也不是行尾,但你在你的基本代码中有它,所以我认为它是你想要的。

于 2012-12-08T22:03:06.573 回答