提取许多子字符串并将它们放入JavaScript中的数组中

时间:2016-10-13 10:40:28

标签: javascript arrays regex

我喜欢这个:

"1x 20GP 1x 40GP 1x 40HQ 5x 45HQ 2x 20RF 5x 40RQ"

现在我想削减20GP,40GP,40HQ,45HQ,20RF,40RQ的部分并将它们放入阵列中。但是,事情是我的字符串可以改变取决于用户输入的值。

一般来说,如果它们出现在字符串中,我想将20GP,40GP,40HQ,45HQ,20RF和40RQ提取到一个数组中。

我想知道最好的方法是什么。我只是学习JavaScript,首先出现在我脑海中的一个解决方案是使用正则表达式,但我不知道从哪里开始。有人可以在这里启发我吗?

2 个答案:

答案 0 :(得分:3)

是的,这可以通过RegEx很容易实现:

var txt = "1x 20GP 1x 40GP 1x 40HQ 5x 45HQ 2x 20RF 5x 40RQ"

var matches = txt.match(/\d+[A-Z]{2}/g); // delivers ["20GP", "40GP", "40HQ", "45HQ", "20RF", "40RQ"]

表达式基本上意味着:

  1. \d+至少一位数字
  2. [A-Z]{2}后跟2个大写字母
  3. 使用正则表达式时,我通常会使用像https://regex101.com/这样的工具。这可能是开始学习/试验的好地方。

    我还建议YouTube

    上的谈话 / Reg(exp){2} lained /:揭秘Lea Verou的正则表达式

答案 1 :(得分:1)

对于您的基本输入,nozzleman提出的正则表达式将起作用。 但是,如果您想要更强大的功能,可以尝试以下正则表达式:

txt.match(/\dx\s(.*?(?=\s|$))/g);

(test it here against your input)

这将从格式化的字符串中提取数据:

[Number]x [data1] [Number]x [data2] ....

此解决方案的优点是我们不对数据施加任何格式限制。它可以超过3个字符,数据可以用制表符或换行符分隔,而不是简单的空格

解释正则表达式:

  • \dx:匹配任意数字后跟字母x
  • \s:匹配任何空白字符(空格,制表符,...)
  • (.*?(?=\s|$)):创建包含匹配文本的捕获组
    • .*??制作了我们的模式lazy.*捕获任何字符串
    • (?=\s|$)(?=positive lookahead。它允许我们假设一个模式将存在而不捕获它。在这里,我们寻找模式\s|$,这意味着任何空白字符或行尾。