除了首字母缩略词外,在空格上分割短语

时间:2014-10-11 01:03:57

标签: javascript regex

希望在白色空间上分割短语,除非有可能的首字母缩略词。例如:

"弗兰克永远在I B M工作" - >弗兰克,在工作,我,B M,永远

另一个选择是"挤压"首字母缩略词 - > "弗兰克永远在IBM工作"

3 个答案:

答案 0 :(得分:2)

使用split的功能,它允许您通过将分割元素放置在捕获组中来保留分割元素,并使缩写元素除了空格之外还可以分割元素。

var separator = /\s+|\b([A-Z\s]*[A-Z])\b/;

这会在结果中加入一些未定义的内容,因此您需要将其过滤掉。

function split(str) { return str.split(separator).filter(Boolean); }

split("Frank worked at I B M forever")
> ["Frank", "worked", "at", "I B M", "forever"]

从首字母缩略词的字母之间删除空格:

function squish(str) { return str.replace(/\s/g, ''); }
function split(str)  { return str.split(separator).filter(Boolean).map(squish); }

split("Frank worked at I B M forever")
> ["Frank", "worked", "at", "IBM", "forever"]

此正则表达式的人类可读版本:

Split on
    white space
    OR
    Between words, capturing as a group
        optional capital letters or whitespace
        followed by a capital letter

有关split此功能的详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split

  

如果separator是包含捕获括号的正则表达式 ,则每次匹配separator时,捕获括号的结果(包括任何未定义的结果)都会被拼接进入输出数组。

答案 1 :(得分:1)

对于您的特定示例,\b([A-Z]) (?=[A-Z]\b)似乎运作良好:

s = "Frank worked at I B M forever"
p = s.replace(/\b([A-Z]) (?=[A-Z]\b)/g, "$1")
document.write(p)

答案 2 :(得分:0)

对于第一个请求,请使用此模式((?:[A-Z] )+)|注意末尾有一个空格 并替换为$1,
然后通过替换\s?,\s? w / ,来修剪额外的空格 Demo