如何确定字符串中何时出现标点符号(?!;。)或“ <”字符。我不想使用数组或比较任何字母,但尝试使用字符串方法解决它。像这样:
var text = corpus.substr(0, corpus.indexOf(".");
好吧,如果我明确指定字符(例如点字符),它就可以正常工作。解析的问题在于,如果循环中有一个较长的文本,我将不知道句子的结尾如何,无论是问号还是感叹号。我尝试了以下操作,但无效:
var text = corpus.substr(0, corpus.indexOf(corpus.search("."));
我想遍历一个长字符串,并使用找到的每个标点符号将其用作句子结尾字符。
你知道我该如何解决我的问题?
答案 0 :(得分:0)
使用正则表达式:
var text = corpus.split(/[(?!;.)<]/g);
答案 1 :(得分:0)
您可以从RegExp开始,对每个字符进行加权,然后本质上比较ASCII码。拆分是另一种方式(仅在上方发布)。
RegExp解决方案
function getTextUpToPunc( text ) {
const regExp = /^.+(\!|\?|\.)/mg;
for (let match; (match = regExp.exec( text )) !== null;) {
console.log(match);
}
}
getTextUpToPunc(
"what a chunky funky monkey! this is really someting else"
)
这里的主要优点是,您无需遍历整个字符串并通过执行regExp.exec( text )
来控制迭代。
先前发布的split
解决方案可以使用,但split将遍历整个字符串。通常,这不是问题,但是如果您的字符串是成千上万个字符,并且您执行了大量此操作,那么考虑性能就很有意义。
如果此函数可以多次运行,则性能的一个小改进就是可以记住RegExp的创建:
const regExp = /^.+(\!|\?|\.)/mg;
变成这样
function getTextUpToPunc( text ) {
if( !this._regExp ) this._regExp = /^.+(\!|\?|\.)/mg;;
const regExp = this._regExp;
for (let match; (match = regExp.exec( text )) !== null;) {
console.log(match);
}
}