处理类似于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.
答案 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]+