【问题标题】:Find a defined-length number in a sentence and parse it在句子中找到一个定义长度的数字并解析它
【发布时间】:2017-06-02 07:35:52
【问题描述】:

我正在使用包含段落并将“文章编号”包装在锚标记中的 javascript 从网页上的元素中读取内容。示例:

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

这里的主要内容是它总是一个 5 位数字,但我不希望它从 6 或 7 位数字中获取 5 位数字。它要么被字母非数字或特殊字符包围。我更喜欢使用正则表达式语句,但我对修饰符了解不足,无法解决所有问题。

【问题讨论】:

    标签: javascript html regex dom


    【解决方案1】:

    这应该完全匹配 5 位数字,仅此而已:

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

    如果您希望它也能捕获带有前字母的内容,例如 KB25223,请尝试:

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

    然后根据需要删除组的非捕获部分。

    str是包含文章编号的字符串

    【讨论】:

    • 这会起作用,但是如果一个数字超过 5 个字符,它只需要从该数字中提取 5 个数字,因为它应该完全忽略它。
    • @TylerFields:不,它没有。它只处理 5 位数字。你试过了吗?
    • "123456".match(/(?:^|\D*)(\d{5})(?=\D|$)/g) 将返回 23456。它不应该捕获那个 6 位数字。
    【解决方案2】:

    让我们忽略 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 是一个表示“全局”的标志:准备匹配字符串中的所有匹配项。

    该模式由三个部分组成。基本部分是(\d{5})\d 表示任意数字; \d{5} 表示匹配任意数字五次。括号表示“捕获”,即保存以备后用。

    第一部分,(?:\D|\b),表示匹配任何非数字或任何分词,但不要保存它们以备后用。 \D 是非数字,\b 是分词,| 表示“或”,符号(?: ... ) 表示将它们组合在一起,但不要保存它们。我们需要这两个的原因是匹配字符串中数字之前的字符,如KB12345this is 12345,但如果数字是字符串中的第一个,也匹配,如12345 rocks!

    最后一部分(?=\D|\b) 表示匹配任何非数字或任何分词,但甚至不将其算作匹配的一部分(?= ... ) 表示向前看,看看它是否在那里。如果你有一个像12345y67890 这样的字符串,你不需要计算它:y 必须算作两个数字的单词边界,所以不要将它作为匹配的一部分。

    运行re.exec() 一次会返回一个这样的数组:

    [ 'B25223',
      '25223',
      index: 1,
      input: 'KB25223 needs to be updated.' ]
    

    arr[0] 包含整个匹配项。 arr[1] 返回我们在括号中捕获并保存以备后用的内容。 (如果我们有更多捕获括号,arr[2]arr[n] 中会有值。)index 是匹配在 input 中开始的位置(我们的文本'正在搜索)。如果没有匹配,exec() 返回 null

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

    【讨论】:

    • 这正是我想要的,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-01-18
    • 2023-03-04
    • 2012-09-10
    • 1970-01-01
    • 2015-09-02
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多