我似乎无法理解如何做到这一点。我正在尝试提出一个正则表达式(对于.NET,如果它有所作为),它可以从包含句点缩写的文本块中提取句子。基本上,我想从一个特定的起始词开始,不要停在已定义的缩写列表上,并在结束时间结束。
可能有几个例子:
Blah blah blah. Died of disease at Annapolis Junction, Md., February 2, 1862. Blah blah blah.
将在1862年2月2日在马里兰州安纳波利斯交界处捕获“死于疾病”。 或
Blah blah blah. Died in General Hospital, Washington, D. C., September 17, 1862, of wounds received in action at Bull Run, Va., August 30, 1862. Blah Blah Blah.
将捕获“1862年9月17日在华盛顿特区总医院死于1862年8月30日在弗吉尼亚州Bull Run的伤口。”
使用
的简单表达式Died [^\.]*\.
当然只与第一期相符:“在马里兰州安纳波利斯交界处死于疾病。”
需要传递的列表缩写将来自受控词汇表,因此正则表达式不需要考虑所有可能的缩写,只需考虑列表中的缩写。即:Md。| D. C.成为| Va |。密歇根州
我知道以下内容不起作用,但它应该大致了解我想要实现的目标:
Died [^(Md\.|D\. C\.|Va\.|Mich\.)]*\.
非常感谢任何帮助!
-Matt
答案 0 :(得分:0)
我认为你不能使用正则表达式来跳过你不想匹配的事情列表。你最好寻找不同的模式。
这适用于您在此处显示的两个示例,但我不确定您的所有数据是否都是这样的:
Died.*[0-9]{4}\.
这基本上匹配“死亡”,然后是最多四个数字(一个日期),然后是一段时间。
答案 1 :(得分:0)
改编自here(Regex to match . (periods marking end of sentences) but not Mr. (as in Mr. Hopkins))
private IEnumerable<string> GetSentences(string longString)
{
var pattern = @"(?<!Md|D_C|Va|Mich|Md)\.";
// Filter D. C. -> Replace with D_C.
longString = longString.Replace("D. C.", "D_C.");
var regex = new Regex(pattern);
var matches = regex.Split(longString);
var sentences = new List<string>(matches.Length);
foreach (var match in matches)
{
var sentence = match.Replace("D_C.", "D. C.").Trim();
if(string.IsNullOrEmpty(sentence) == false)
{
sentences.Add(sentence);
}
}
return sentences;
}
D. C.
的解决方法是因为模式与此字符串不匹配,因此替换为D_C.
。
示例1
<强>输入强>
Blah blah blah. Died of disease at Annapolis Junction, Md., February 2, 1862. Blah blah blah.
的句强>
Blah blah blah
Died of disease at Annapolis Junction, Md., February 2, 1862
Blah blah blah
示例2
<强>输入强>
Blah blah blah. Died in General Hospital, Washington, D. C., September 17, 1862, of wounds received in action at Bull Run, Va., August 30, 1862. Blah Blah Blah.
的句强>
Blah blah blah
Died in General Hospital, Washington, D. C., September 17, 1862, of wounds received in action at Bull Run, Va., August 30, 1862
Blah blah blah