我试图写一个正则表达式将一个句子分成单词。我的第一个想法是分裂空格或标点,然后我意识到我不想分割一个带小数的数字,如" 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", ""]
}
基本上,我需要一个正则表达式,它会在[\s\.,:;?!+=\/\\]+
上拆分我的查询,但如果[\.,:/]
被数字包裹,则不要拆分。请帮忙!
答案 0 :(得分:3)
这是我的看法:
[\s,;?!+=/\\]+|[.:](?!\d)\s*
基本上,我已将这两个案例分开,并使前瞻仅在.
或:
之后适用。
是的,不幸的是,JS并不支持外观。
对于更麻烦的I love pizza.2 more pizzas please!
案例,您需要切换到匹配而非分割:
(?:\d[.:]\d|[^\s.:,;?!+=/\\])+
如果它位于两位数之间,则不会将.
或:
计为分隔符。
在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;