用Regex以各种方式拆分单词

时间:2014-08-22 18:01:39

标签: javascript regex plpgsql plv8

处理类似于Solr的WordDelimiterFilter的东西,但不是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,这可以做后卫。

在SO上找到了一些答案,但他们似乎都使用了lookbehind。

要分开的事情:

  1. 从小写字母转换为大写字母
  2. 从字母转换为数字或数字转换为字母
  3. (可选)拆分其他一些字符( - _)
  4. 我主要担心的是1和2.

2 个答案:

答案 0 :(得分: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;
}

Demo

P90X [ 'P', '90', 'X' ]
TotallyCromulentWord [ 'Totally', 'Cromulent', 'Word' ]
TransAM [ 'Trans', 'AM' ]
URLConverter [ 'URL', 'Converter' ]
Abc.DEF$012 [ 'Abc', 'DEF', '012' ]

答案 1 :(得分:0)

这个正则表达式应该分成一个段落或字符串中所有单词的标记 甚至适用于你的简单案例。

全球比赛。此外,如果您想添加其他特定的分隔符,也可以这样做。

   # /(?:[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]+