2

我正在尝试编写一个正则表达式来将一个句子分成单词。我的第一个想法是分割空格或标点符号,然后我意识到我不想用“0.5”这样的小数分割数字,也不想分割像“14:55:02”这样的时间戳。所以,我试图用负前瞻和负后瞻来解决我的问题,但我无法将它们放在一起......而且javascript似乎不支持后视。

到目前为止我最好的尝试:

var query = "I've been 0.5 hit at 21:05. I'm okay.";
var delimiter = /[\s\.,:;?!+=\/\\]+(?![0-9])/g;

if(delimiter.test(query)){

    var words = query.split(delimiter);
    console.log(words);

    // ["I've", "been 0.5", "hit", "at 21:05", "I'm", "okay", ""]
}

JSFiddle

所以基本上,我需要一个正则表达式来拆分我的查询,但如果被数字包裹,[\s\.,:;?!+=\/\\]+则不要拆分。[\.,:/]请帮忙!

4

1 回答 1

4

这是我的看法:

[\s,;?!+=/\\]+|[.:](?!\d)\s*

Regex101
小提琴

基本上我已经将这两种情况分开了,并且只在.or之后应用了前瞻:

是的,不幸的是,JS 不支持lookbehinds。

对于更麻烦的I love pizza.2 more pizzas please!情况,您需要切换到匹配而不是拆分:

(?:\d[.:]\d|[^\s.:,;?!+=/\\])+

如果它在两位数之间,则不会将.或视为分隔符。:

正则表达式101

在 JS 中:

var query = "I've been 0.5 hit at 21:05. I'm okay. I love pizza.2 more pizzas please!" ;
var re = /(?:\d[.:]\d|[^\s.:,;?!+=\/\\])+/g;
var words = [];
var match;

while (match = re.exec(query))
    words.push(match[0]);
        
for (i in words)
    document.getElementById("demo").innerHTML += words[i] + "<br>";
<div id="demo"></div>

于 2014-11-29T00:11:23.073 回答