按出现的字符分割字符串

时间:2019-04-05 15:05:05

标签: javascript regex

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

  1. 如果找到了\,则在\之前和在\之后的字符之后进行字符分割(例如"Hel\\7o".split()→{{1 }};
  2. 如果找到["Hel", "\7", "o"],我们的行为类似,但是我只接受字母。 (例如%"He%7l%lo".split()
  3. 如果["He%7l", "%l", "o"]""之间有一些字符串,它们会被分割(例如''"Hel\"lo\"".split();
  4. 如果找到["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>

1 个答案:

答案 0 :(得分: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函数中使用正则表达式来解决问题,但到目前为止,我还没有找到其他解决方案。至少这一项有效,其他人可能会发现它有用。