我正在尝试确定我正在处理的解析应用程序的句子结束。正则表达式并不是我的强项,可以使用一些帮助。
这是我正在使用的一个例句(单词数组):
Hi! What's up? I know I owe you $1.50. Sorry.I swear I'll give it to
you later...
我的代码在段落上运行.Split(),然后将这些单词作为数组传递进行解析。然而,正则表达式似乎没有检测到我用来确定一个句子已经结束的值("。","!"," ?&#34)。此外,我的代码中没有一些标准 - 我希望能够确定期间和金钱之间的差异。并且,优雅地处理无空间句末期。
这是一些代码。有人可以建议模式为什么不匹配?
foreach (var word in words)
{
string pat = @"(?sx-m)[^\r\n].*?(?:(?:\.|\?|!|\:)\s)";
Regex r = new Regex(pat, RegexOptions.IgnoreCase);
Match m = r.Match(word);
while (m.Success)
sentanceNum++;
}
Per Vera的评论,这是我的最终代码块:
int sentenceNum = 1;
// Regex for sentence terminators
string pat = @"(?:.*?([.?!:]))*";
// Regex for money (not a sentance terminator)
// Regex borrowed from online code example.
string money =
@"^\-?\(?\$?\s*\-?\s*\(?(((\d{1,3}((\,\d{3})*|\d*))?(\.\d{1,4})?)|((\d{1,3}((\,\d{3})*|\d*))(\.\d{0,4})?))\)?$";
Regex d = new Regex(money, RegexOptions.IgnoreCase);
Regex r = new Regex(pat, RegexOptions.IgnoreCase);
Match m = d.Match(word);
// if it isn't money, increment sentanceNum. Increment
// will only happen if 'pat' var matches, otherwise, increment by 0.
if (!m.Success)
sentanceNum = sentanceNum + r.Match(word).Groups[1].Captures.Count;