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



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

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

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.,:;?!+=/\]+上拆分我的查询,但如果[.,:/]被数字包装,则不会拆分。请帮忙!

以下是我对它的看法:

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

正则表达式101
小提琴

基本上我已经将两种情况分开,并使前瞻仅在.:后适用。

是的,不幸的是,JS不支持回溯。

对于更麻烦的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>

最新更新