我喜欢这个:
"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,首先出现在我脑海中的一个解决方案是使用正则表达式,但我不知道从哪里开始。有人可以在这里启发我吗?
答案 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"]
表达式基本上意味着:
\d+
至少一位数字[A-Z]{2}
后跟2个大写字母使用正则表达式时,我通常会使用像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|$
,这意味着任何空白字符或行尾。