Javascript正则表达式只匹配点作为标点符号,没有数字

时间:2014-11-29 00:00:27

标签: javascript regex string-split negative-lookbehind

我试图写一个正则表达式将一个句子分成单词。我的第一个想法是分裂空格或标点,然后我意识到我不想分割一个带小数的数字,如" 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\.,:;?!+=\/\\]+上拆分我的查询,但如果[\.,:/]被数字包裹,则不要拆分。请帮忙!

1 个答案:

答案 0 :(得分:3)

这是我的看法:

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

Regex101
Fiddle

基本上,我已将这两个案例分开,并使前瞻仅在.:之后适用。

是的,不幸的是,JS并不支持外观。

对于更麻烦的I love pizza.2 more pizzas please!案例,您需要切换到匹配而非分割:

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

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

Regex101

在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>";
&#13;
<div id="demo"></div>
&#13;
&#13;
&#13;