这个正则表达式:
var text = "Mr. Smith bought cheapsite.com for 1.5 million dollars, i.e. he paid a lot for it. Did he mind? Adam Jones Jr. thinks he didn't. In any case, this isn't true... Well, with a probability of .9 it isn't."
// break string up in to sentences based on punctation and quotation marks
var tokens = text.match(/(?<=\s+|^)[\"\'\‘\“\'\"\[\(\{\⟨](.*?[.?!])(\s[.?!])*[\"\'\’\”\'\"\]\)\}\⟩](?=\s+|$)|(?<=\s+|^)\S(.*?[.?!])(\s[.?!])*(?=\s+|$)/g);
由于不支持 lookbehind assertions ((?<= ) and (?<! ))
,在 IOS Safari 上会中断。我可以使用用于句子标记化的等效(或类似)正则表达式吗?最好它不应该因为这里引用的其他 iOS safari 兼容性问题而中断:(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#assertions) ECMAScript (ECMA-262) 该规范中“RegExp”的定义。
这是正则表达式的一个版本,您可以使用它,而无需使用任何后行断言将输入分解为句子:
/(?:\s|^)(?:["'‘“'"\[({⟨].*?[.?!](?:\s[.?!])*["'’”'"\])}⟩]|\S.*?[.?!](?:\s[.?!])*)(?=\s|$)/gm
请记住,您的正则表达式可能会在句子中出现以点结尾的单词(例如
Jr., Sr. Mr.
等)以及类似的情况时中断。
问题在
?<=
。如果你以某种方式替换它们,就我而言?!
,可能没问题。