使用正则表达式拆分字符串,保留分隔符

时间:2015-03-24 16:33:26

标签: javascript regex

这会根据需要拆分字符串但不保留分隔符:

"200 g Joghurt".split(/[0-9]?\s?[–|-]?\s?[0-9]+\s?g{0,1}\b/)
["", " Joghurt"]

我有这样的案例

  • 100-200g
  • 1g
  • 240-1500g

这个帖子建议使用积极向前看。 Javascript and regex: split string and keep the separator

但如果我把它分成了很多东西:

"200 g Joghurt".split(/(?=[0-9]?\s?[–|-]?\s?[0-9]+\s?g{0,1}\b)/)
["2", "0", "0 g Joghurt"]

问题: 如何在数字和g之后拆分上面的那个字符串(数字可以是任何数字,Joghurt可以是任何单词)。 e.g。

["200-400g", "joghurt"]

编辑: 有些情况下我没有g例如

  • 1首歌
  • song
  • michael jackson song

所以只是与g匹配不起作用。我在例子中提到的案例是g的案例。并且g总是与一个数字或一系列数字组合。对此感到抱歉。我想将配方成分分成配料和量。 g是克,也许这使用例更清晰。

编辑2: 我也修改了一下,正则表达式基本上正如你在这个例子中看到的那样: https://regex101.com/r/rL7hY9/1 但它并没有将它分成一个整体。我的其他正则表达式案例也有这个问题,regex101上的匹配是整个组。但.split()不会将其拆分为一部分(具有正向前瞻)。

3 个答案:

答案 0 :(得分:0)

如果你总是拥有" g"你可以使用它并重新添加" g"到第一个数组元素。这可能比尝试创建一些巨大的RegEx更容易。如果它只需要RegEx,你可能想要匹配一个带有负面lookbehind的空间" g"。但是,Lookbehinds并非在所有RegEx引擎中都可用。

答案 1 :(得分:0)

您可以使用此正则表达式 - (?!\s*g)\s。我们匹配前面带有“g”的空格:

alert("200 g Joghurt".split(/(?!\s*g)\s/))

答案 2 :(得分:0)

好的,我找到了答案。我发布的第一个stackoverflow链接表明了积极的前瞻性。但它比这更容易,你只需要将正则表达式放在括号中:

"200 g Joghurt".split(/([0-9]+\s?[–|-]?\s?[0-9]*\s?g{0,1}\b)/gi) Javascript - string.split(regex) keep separators 之后我删除空字符串和空格。

我创建的另一个解决方法是。首先使用.match,这会提供匹配的正则表达式,然后使用.split,这会切除正则表达式部分。如果没有global flag,那么这很容易。