在句子中查找定义长度的数字并解析它

时间:2017-01-18 03:05:17

标签: javascript html regex dom

我正在使用包含段落和包装"文章编号"在锚标记中的javascript阅读网页上元素的内容。例如:

我们需要更新25223.(或)KB25223需要更新。

这里的主要背景是它总是一个5位数字,但我不希望它从6位或7位数字中取5位数。它将被alpha非数字或特殊字符包围。我更喜欢使用正则表达式语句,但我不太了解修饰符以解决所有问题。

2 个答案:

答案 0 :(得分:1)

这应该恰好匹配5位数字,仅此而已:

str.match(/\b\d{5}\b/g);

如果你想要用KB25223等前面的字母来捕捉它,请尝试:

str.match(/(?:^|\D*)(\d{5})(?=\D|$)/g)

然后在必要时删除该组的非捕获部分。

str是包含商品编号

的字符串

答案 1 :(得分:0)

让我们忽略HTML部分,并假设您的文本适合使用正则表达式进行搜索。 (不要试图用正则表达式解析HTML!)

假设您有一个文本,其中可以显示多个数字,我们已经在javascript字符串text中包含该文本。

你想要的是这样的:

// text variable already contains our text
var re = /(?:\D|\b)(\d{5})(?=\D|\b)/g;
var arr;
while ((arr = re.exec(text)) !== null) {
    var item = arr[1];
    console.log('found item ' + item);
}

(如果您想查看有关它的详细信息,我会从MDN窃取该代码。)

正则表达式的模式部分包含在/ /斜杠中。 g是一个标志,表示" global":准备匹配字符串中的所有匹配项。

该模式有三个部分。关键部分是(\d{5})\d表示任何数字; \d{5}表示匹配任意数字五次。括号表示"捕获",即保存以供日后使用。

第一部分(?:\D|\b)表示匹配任何非数字或任何分词,但不保存以供日后使用。 \D为非数字,\b为分词,|表示"或",符号(?: ... )表示将这些组合在一起,但不要拯救他们。我们需要这两个的原因是匹配字符串之前的字符串,如KB12345this is 12345,但如果数字是字符串中的第一个字符,则匹配{{1 }}

最后一部分12345 rocks!表示匹配任何非数字或任何分词,但甚至不将其视为比赛的一部分(?=\D|\b)意味着展望它是否存在。如果您有(?= ... )之类的字符串,则无需计算它:12345y67890必须将这两个数字视为字边界,因此不要将其作为匹配的一部分。

运行y一次返回如下数组:

re.exec()

[ 'B25223', '25223', index: 1, input: 'KB25223 needs to be updated.' ] 包含整个匹配。 arr[0]返回我们在括号中捕获的内容并保存以供日后使用。 (如果我们有更多的捕获parens,arr[1]arr[2] n arr[会有值。)]是匹配开始的地方index(我们正在搜索的文字)。如果没有匹配,则input会返回exec()

null保存索引以开始下一个匹配,因此可以循环运行。