最佳实践;以编程方式检测文字

时间:2016-11-15 13:57:14

标签: c# .net regex

我正在尝试根据关键字从字符串(电子邮件)中提取数字。 这里有几个困难;

  • 我们在系统中寻找的数字总是8个字符,但发件人可能会忽略预处理" 0"而不是发送01234567他们将发送给我们1234567。
  • 还有其他数字可以匹配为有效数字,如Phonenumbers,并且在我们的系统中已知,因此我们决定检测预处理关键字,如" casenumber:"和其他变种。
  • 最后但并非最不重要的是,发件人可以发送" casenumber:1234567"但他也可以发送" casenumbers:1234567,7654321"或其任何变体。 (devider; or,or。或: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个案例编号,第二个或第三个等等将无法找到。

使用的代码语言:C#

当前代码:

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

这是我现在的正则表达式,它使用Regex.Matches并检查全局。当文本具有" casenumber:12345678和casenumber:87654321"但不是当它的逗号分开时。

3 个答案:

答案 0 :(得分:1)

这个正则表达式:

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

我认为会抓住你所有的情况,只需在一些找到所有匹配案例的函数中使用它(阅读C#docs)。它会像丢失空格一样关注一些错别字。我强烈建议尝试找出更多可能的用户可以将这些案例编号放在这个正则表达式中。

答案 1 :(得分:0)

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

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

知道序列以" casenumber"开头。是有用的,但不知道它的结束可能是一个问题:停止在linebreak或完全停止将适用于您的示例,但不适用于:

  

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

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

例如,您可以使用此正则表达式: casenumber(\s*[^\s\d]+\s*\d{7,8})+

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

您应该在数据上尝试使用此表达式并根据您的需求进行调整(我重申:您不会获得有保证的完美解决方案,但您可以使其尽可能地在您的数据上运行)。

提取序列后,像\d+这样的简单正则表达式就可以从中提取数字。

答案 2 :(得分:0)

我已经测试了我原来的RegEx的变体,并使其适应分频器,甚至牛津逗号:

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