Javascript 使用正则表达式以多种方式拆分单词

Javascript 使用正则表达式以多种方式拆分单词,javascript,regex,plpgsql,plv8,Javascript,Regex,Plpgsql,Plv8,致力于类似Solr的东西,但不是Java 要将单词拆分为如下标记: P90X = P, 90, X (split on word/number boundary) TotallyCromulentWord = Totally, Cromulent, Word (split on lowercase/uppercase boundary) TransAM = Trans, AM 寻找一个通用的解决方案,而不是针对上述示例。最好是不支持

致力于类似Solr的东西,但不是Java

要将单词拆分为如下标记:

P90X                 = P, 90, X (split on word/number boundary)

TotallyCromulentWord = Totally, Cromulent, Word (split on lowercase/uppercase boundary)

TransAM              = Trans, AM
寻找一个通用的解决方案,而不是针对上述示例。最好是不支持lookbehind的正则表达式风格,但如果需要,我可以使用PL/perl,它可以执行lookbehind

找到了一些答案,但他们似乎都使用了lookback

要拆分的内容:

  • 从小写字母到大写字母的转换
  • 从字母到数字或数字到字母的转换
  • (可选)拆分为其他几个字符(-)

  • 我主要关心的是1和2

    这不是我不想做的事情,但对于挑战,这里有一个javascript解决方案,您应该能够轻松地将其转换为任何语言:

    function split(s) {
        var match;
        var result = [];
        while (Boolean(match = s.match(/([A-Z]+|[A-Z]?[a-z]+|[0-9]+|([^a-zA-Z0-9])+)$/))) {
            if (!match[2]) {
                //don't return non alphanumeric tokens
                result.unshift(match[1]);
            }
            s = s.substring(0, s.length - match[1].length);
        }
        return result;
    }
    
    :


    此正则表达式应将段落或字符串中的所有单词拆分为标记。
    在你的例子中,甚至对简单的情况也有效

    全球匹配。另外,如果您想添加其他也可以添加的特定分隔符

       # /(?:[A-Z]?[a-z]+(?=[A-Z\d]|[^a-zA-Z\d]|$)|[A-Z]+(?=[a-z\d]|[^a-zA-Z\d]|$)|\d+(?=[a-zA-Z]|[^a-zA-Z\d]|$))[^a-zA-Z\d]*|[^a-zA-Z\d]+/
    
       (?:
            [A-Z]? [a-z]+ 
            (?= [A-Z\d] | [^a-zA-Z\d] | $ )
         |  
            [A-Z]+ 
            (?= [a-z\d] | [^a-zA-Z\d] | $ )
         |  
            \d+ 
            (?= [a-zA-Z] | [^a-zA-Z\d] | $ )
       )
       [^a-zA-Z\d]* 
    |  
       [^a-zA-Z\d]+ 
    

    你能显示你的预期输出吗?不看你的链接,最好列出所有适用于连续字母分隔的规则。谢谢你告诉我们。祝你搜索好运。这个问题的一个主要问题是,你要的是一个可以做四件不同事情的正则表达式;并且可以在某种程度上区分ancronym(IBM)和简单的大写单词“TransAM”。这是一个广泛的问题空间。前3个问题可以在一个正则表达式中完成。最后一个(缩写)必须在之后完成,或者如果已知列表可用,则可以立即完成。
       # /(?:[A-Z]?[a-z]+(?=[A-Z\d]|[^a-zA-Z\d]|$)|[A-Z]+(?=[a-z\d]|[^a-zA-Z\d]|$)|\d+(?=[a-zA-Z]|[^a-zA-Z\d]|$))[^a-zA-Z\d]*|[^a-zA-Z\d]+/
    
       (?:
            [A-Z]? [a-z]+ 
            (?= [A-Z\d] | [^a-zA-Z\d] | $ )
         |  
            [A-Z]+ 
            (?= [a-z\d] | [^a-zA-Z\d] | $ )
         |  
            \d+ 
            (?= [a-zA-Z] | [^a-zA-Z\d] | $ )
       )
       [^a-zA-Z\d]* 
    |  
       [^a-zA-Z\d]+