我正在尝试编写一个正则表达式在split()
函数中使用,以便按照以下规则拆分字符串:
\
,那么在\
之前和在\
之后的char之后(例如"Hel\\7o".split()
→["Hel", "\7", "o"]
;%
,我们有类似的行为,但我只接受字母。 (例如"He%7l%lo".split()
→["He%7l", "%l", "o"]
;""
或''
之间有一些字符串,它们就会分裂(例如"Hel\"lo\"".split()
→["Hel", ""lo""]
;
,或:
,或/
,我们会分裂(例如"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"]
分裂
最后,我设法解决问题的唯一方法是将我的目标分成两部分:
/(\\.|%[a-zA-Z]|\"[^"]*\"|\'[^']*\'|:|\/| +|\w+)/
),我按照我要求的前四个规则分割字符串;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
函数中仅使用正则表达式无法解决问题,但到目前为止我还没有找到任何其他解决方案。至少这个有效,其他人可能会发现它很有用。