Javascript 在句子中找到一个已定义的长度数字并对其进行分析
我正在使用javascript从网页上的元素中读取内容,其中包含段落,并在锚定标记中包装“Article Number”。例如: 我们需要更新25223。(或)KB25223需要更新Javascript 在句子中找到一个已定义的长度数字并对其进行分析,javascript,html,regex,dom,Javascript,Html,Regex,Dom,我正在使用javascript从网页上的元素中读取内容,其中包含段落,并在锚定标记中包装“Article Number”。例如: 我们需要更新25223。(或)KB25223需要更新 这里的主要内容是它总是一个5位数的数字,但我不希望它从一个6或7位数的数字中获取5位数。它将被字母、非数字或特殊字符包围。我更喜欢使用regexp语句,但我对修饰符了解不够,无法解决所有问题。这应该正好匹配5位数字,仅此而已: str.match(/\b\d{5}\b/g); 如果您想让它同时捕获前面的字母,如K
这里的主要内容是它总是一个5位数的数字,但我不希望它从一个6或7位数的数字中获取5位数。它将被字母、非数字或特殊字符包围。我更喜欢使用regexp语句,但我对修饰符了解不够,无法解决所有问题。这应该正好匹配5位数字,仅此而已:
str.match(/\b\d{5}\b/g);
如果您想让它同时捕获前面的字母,如KB25223,请尝试:
str.match(/(?:^|\D*)(\d{5})(?=\D|$)/g)
然后根据需要移除组的非捕获部分
str
是包含文章编号的字符串让我们忽略HTML部分,并假设可以使用正则表达式搜索文本。(不要尝试用正则表达式解析HTML!)
假设您有一个可以显示多个数字的文本,并且我们已经有了javascript字符串中的文本,text
您想要的是这样的:
//文本变量已包含我们的文本
var re=/(?:\D |\b)(\D{5})(?=\D |\b)/g;
var-arr;
while((arr=re.exec(text))!==null){
var项目=arr[1];
console.log('found item'+item);
}
(如果您想了解更多详细信息,我从中窃取了该代码。)
正则表达式的模式部分包含在斜杠中g
是一个表示“全局”的标志:准备匹配字符串中的所有匹配项
该模式有三个部分。基本部分是(\d{5})
<代码>\d表示任何数字\d{5}
表示匹配任意数字五次。括号中的意思是“捕获”,即保存以备将来使用
第一部分,(?:\D |\b)
,表示匹配任何非数字或任何分词,但不保存它们以供以后使用\D
是非数字,\b
是分词,|
表示“或”,符号(?:…)
表示将它们组合在一起,但不保存它们。我们需要这两个字符的原因是匹配字符串中数字前面的字符,如KB12345
或这是12345
,但也要匹配字符串中的第一个数字,如12345代码>
最后一部分,(?=\D |\b)
,表示匹配任何非数字或任何分词,但甚至不将其作为匹配的一部分。(?=…)
的意思是向前看,看看它是否在那里。如果您有一个类似于12345y67890
的字符串,则不需要对其进行计数:y
必须作为两个数字的单词边界进行计数,因此不要将其作为匹配的一部分
运行一次re.exec()
将返回如下数组:
['B25223',
'25223',
索引:1,
输入:“KB25223需要更新。”]
arr[0]
包含整个匹配项arr[1]
返回我们在括号中捕获并保存以供以后使用的内容。(如果我们有更多的捕获参数,arr[2]
到arr[
n]
)索引是匹配从输入开始的地方(我们正在搜索的文本)exec()
如果不匹配,则返回null
exec()
保存索引以开始下一个匹配,这样它就可以在循环中运行。但是,如果一个数字超过5个字符,它只需要该数字的5位数字,而它应该完全忽略它。@TylerFields:不,它不需要。它只处理5位数字。你试过了吗?“123456”。匹配(/(?:^\D*)(\D{5})(?=\D$)/g)将返回23456。它不应该捕捉到那个6位数的数字。这正是我想要的,非常感谢!