最佳实践;从文本中以编程方式检测关键字

本文关键字:编程 方式 检测 关键字 文本 最佳 | 更新日期: 2023-09-27 18:17:56

我正试图从基于关键字的字符串(电子邮件)中提取数字。这里有几个困难;

  • 我们在系统中寻找的数字总是8个字符,但是发送方可能忽略了预处理"0",而不是发送01234567,他们将发送给我们1234567。
  • 还有其他数字可以匹配为有效数字,如电话号码,并且在我们的系统中已知,因此我们决定检测预处理关键字,如"casenumber:"和其他变体。
  • 最后但并非最不重要的是,发送者可以发送"casenumber: 1234567",但他也可以发送"casenumbers: 1234567, 7654321"或任何变体。(除号;或者,或者。或:etc)

示例文本:

Hi!
Hereby I would like to confirm that I will be present at the meeting about casenumber: 1234567 and 7654321.
Can you confirm that you have received this email?
Kind regards,
Random person

我尝试使用的是一个正则表达式匹配,搜索关键字列表,包括"casenumber:",然后添加所有可能的解决方案,但这只适用于1个casenumber,第二个或第三个等等将找不到。

代码语言:c#

当前代码:

 Regex.Matches(checkString, keyword + @"[ +;:,.'r'n't]*[BL0123456789][0-9]+", RegexOptions.IgnoreCase )

这是我当前的正则表达式,它使用正则表达式。一般在全局上进行匹配和检查。当文本中有"casenumber: 12345678 and casenumber: 87654321"时,它会匹配,但当它被逗号分隔时,它就不匹配了。

最佳实践;从文本中以编程方式检测关键字

此正则表达式:

(^| |.|;|:|,)[Cc]asenumbers? ?: ?[0-9]{7,8} ?(([;:,'.]|and) ?[0-9]{7,8})*

我认为会抓住你所有的情况,只是在一些函数中使用它(阅读c#文档),找到所有匹配的情况。它会注意一些错别字,比如缺空格。我强烈建议您尝试找出更多的可能性,以便您的用户可以将这些大小写数字放入此正则表达式中并进行匹配。

我已经测试了你的原始RegEx的变化,并已适应它与分隔符,甚至牛津逗号工作:

Regex.Matches(checkstring, keyword + @"([ +;:,.'r'n't]*[BL0123456789][0-9]+(([ -_=*&/+;:,.'r'n't]|en)+[BL0123456789][0-9]+)*)", RegexOptions.IgnoreCase);

我将首先尝试选择数字的完整序列,然后在提取的字符串中匹配单个数字。

应该对序列的结构做一些假设,但由于我们讨论的是人类自由编写的电子邮件,我们可能无法构建一个100%适用的表达式。

知道序列以"casenumber"开始是有用的,但不知道它在哪里结束可能是一个问题:在换行或句号处停止对您的示例来说是可行的,但不适合:

我将出席关于案例编号:1234567的会议,如果您有其他问题请致电9876543与我联系。

如果没有已知的序列结束符,我们可以尝试识别分隔符:根据您的规范,它们可以变化,但我们可以假设一个case编号列表在两个数字之间不会超过一个单词(正如我所说的,不完美,但在大多数情况下应该工作)。

例如,你可以使用这个正则表达式:casenumber (' s * [^ ' s ' d] + ' s * ' d {7 8}) +

这样,我们匹配casenumber(复数形式也由表达式的其余部分匹配),然后是一个非数字/7-8位数的交替序列,它们之间可能有空格。

你应该在你的数据上尝试这个表达式,并使它适应你的需求(我重复一遍:你不会有一个保证完美的解决方案,但你可以使它在你的数据上尽可能地工作)。

一旦您提取了序列,一个简单的正则表达式,如'd+将能够从中提取数字。