我正在尝试按照以下规则编写用于在split()
函数中使用的正则表达式,以便分割字符串:
\
,则在\
之前和在\
之后的字符之后进行字符分割(例如"Hel\\7o".split()
→{{1 }}; ["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]|\".*\"|\'.*\'|:|\/| )/
,我想拥有"mmDD"
。
当然,到目前为止,这将需要与所有其他规则一起使用,因此["mm", "DD"]
将返回"mm mmDDYYy%y"
。
在最后一个示例中,您还可以看到最后一条规则必须区分大小写(["mm", " ", "mm", "DD", "YY", "y", "%y"]
与"YY"
分开)。
我已经找到了这个答案-> JavaScript Split string by multiple occurrences of letters,但这对我没有帮助,因为它丢失了出现的次数(例如,"y"
返回了"mmDD".split(/(.)\1*/)
,但是我需要{{1 }}。
我基本上已经尝试过所有正则表达式规则,但是在此之后我迷失了方向。甚至可以直接使用["m","D"]
函数吗?
感谢帮助。
编辑:如果有帮助,请访问regex101链接https://regex101.com/r/ezXKkG/1/
Wiktor Stribi addedew还建议了["mm","DD"]
,我在全局规则中添加了以下内容:split()
。
使用此方法,(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[a-z]))
被拆分为/(\\.|%[a-zA-Z]|\".*\"|\'.*\'|:|\/| |(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[a-z]))/
(NICE!),但是在诸如"MMmm"
的情况下却不起作用,该["MM", "mm"]
被拆分为"MMmdD"
< / p>
答案 0 :(得分:0)
最后,我设法解决问题的唯一方法是将目标分为两部分:
/(\\.|%[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
函数中使用正则表达式来解决问题,但到目前为止,我还没有找到其他解决方案。至少这一项有效,其他人可能会发现它有用。