我正在尝试编写一个正则表达式来将句子拆分为单词。我的第一个想法是在空格或标点符号上拆分,然后我意识到我不想拆分像"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>