按出现字符拆分字符串

问题描述 投票:0回答:1

我正在尝试编写一个正则表达式在split()函数中使用,以便按照以下规则拆分字符串:

  1. 如果找到\,那么在\之前和在\之后的char之后(例如"Hel\\7o".split()["Hel", "\7", "o"];
  2. 如果找到%,我们有类似的行为,但我只接受字母。 (例如"He%7l%lo".split()["He%7l", "%l", "o"];
  3. 如果在""''之间有一些字符串,它们就会分裂(例如"Hel\"lo\"".split()["Hel", ""lo""];
  4. 如果找到,或:,或/,我们会分裂(例如"Hel/lo Wor:ld".split()["Hel", "/", "lo", " ", "Wor", ":", "ld"];

我已经完成了迄今为止我用以下正则表达式所说的内容:/(\\.|%[a-zA-Z]|\".*\"|\'.*\'|:|\/| )/

现在,我需要一个最后的拆分规则,即我需要从其他char的出现中拆分char的出现。基本上,如果我有"mmDD",我想有["mm", "DD"]。 当然,到目前为止,这需要与所有其他规则一起使用,因此"mm mmDDYYy%y"将返回["mm", " ", "mm", "DD", "YY", "y", "%y"]。 在最后一个示例中,您还可以看到最后一条规则需要区分大小写("YY""y"中拆分)。

我找到了这个答案 - > JavaScript Split string by multiple occurrences of letters但是它没有帮助我,因为它失去了发生次数(例如"mmDD".split(/(.)\1*/)返回["m","D"],但我需要["mm","DD"]

我试图使用基本上所有的正则表达式规则,但在此之后我会失去理智。是否可以直接使用split()功能?

感谢帮助。

编辑:如果有帮助,这里是regex101链接https://regex101.com/r/ezXKkG/1/

此外,WiktorStribiżew建议(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[a-z])),我在全球规则中添加,如下:/(\\.|%[a-zA-Z]|\".*\"|\'.*\'|:|\/| |(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[a-z]))/

有了这个,"MMmm"分为["MM", "mm"](NICE!),但它不适用于:"MMmdD",在["MM", "md", "D"]分裂

javascript regex
1个回答
0
投票

最后,我设法解决问题的唯一方法是将我的目标分成两部分:

  1. 使用类似于我首次提到的正则表达式(/(\\.|%[a-zA-Z]|\"[^"]*\"|\'[^']*\'|:|\/| +|\w+)/),我按照我要求的前四个规则分割字符串;
  2. 为了实现第五个和最后一个规则,我运行以下代码: tokens = toSplit.split(/(\\.|%[a-zA-Z]|\".*\"|\'.*\'|:|\/| )/); tokens.forEach(token => { if (/^[a-zA-Z]$/).test(token) { let newToken = ''; for (let i = 0, len = token.length; i < len; i++) { const tokenChar = token[i]; const lastChar = newToken[newToken.length - 1]; if (lastChar && lastChar !== tokenChar) { // saving newToken newToken= ''; } newToken+= tokenChar; } } )}

基本上,对于我用正则表达式检索的每个字符串,我检查它是否仅由字符组成。如果是这样,我手动将字符串拆分为不同的子串迭代。

我知道这个答案在split函数中仅使用正则表达式无法解决问题,但到目前为止我还没有找到任何其他解决方案。至少这个有效,其他人可能会发现它很有用。

© www.soinside.com 2019 - 2024. All rights reserved.