在食品成分说明文本中查找“E号码”的正则表达式

3
我正在开发一个分析食品产品的项目。使用VB.net、C#编程,并使用MS SQL Server数据库。
现在,我需要在成分文本字段中找到“E数”出现的每个实例。 (E数是欧洲标准的食品添加剂编码系统,请参见Wikipedia here)。
E数的格式如下:
1. 大写字母“E”(1个字符)。 2. 可选[空格](0-1个字符)。 3. 在100到1600范围内的三位或四位数字(3-4个字符)。 4. 在“a”到“f”的小写字母范围内的可选小写字母(0-1个字符)。 共计4到7个字符长度。
* 数字通常用括号括起来和/或与成分名称紧密连接,然后(可能)不留任何空格或分隔符。
例如:E100,甲醛(E 240),E300b,E 1234a,(E1321)。
我需要返回文本中所有的E编号(格式如上)。它们可能有很多。
有什么想法吗?
-从未学习过RegExp,因此提出这个问题。

你已经非常清楚地描述了你的需求,但这不是一个请求别人为你编写代码的网站。请阅读提问的智慧 - Blackwood
2个回答

4
您可以使用正则表达式模式E ?\d{3,4}[a-f]?。请参见在线演示
  • E ? - 必须以 E 开头,后跟可选的空格(?使前面的空格是可选的)。
  • \d{3,4} - 接下来的三个或四个字符必须是数字。
  • [a-f]? - 最后一个字符可以选择任何介于 af 之间的字母。

您可以像这样搜索所有匹配项:

foreach (Match m in Regex.Matches(input, pattern))
    Console.WriteLine(m.Value);

2
很棒的解决方案,Doggart先生讲解得非常清晰!这应该是被采纳的答案!另外,你提到的被采纳的答案会失败,真是个好发现。 - Trevor
我会使用\s代替实际的空格。 - Jeroen
1
@Jeroen 我考虑过这个,但那会匹配任何空格字符。由于根据 OP 的规范只有一个空格(而不是制表符或换行符之类的),所以我选择了更严格的要求。 - Steven Doggart
@StevenDoggart 好的!我已经习惯了规范中使用“空格”并发现各种其他不可打印的内容,所以我已经养成了使用\s的习惯。 - Jeroen

0

一个可行的表达式:

(E)+(\s+)?(\d{4}|\d{3})+([a-f])?

捕获组 0: 确保至少有一个大写字母 E。

捕获组 1: 如果有空格,尽可能多地匹配空格。

捕获组 2: 要么是 4 位数,要么是 3 位数。

捕获组 3: 介于 a 和 f 之间的可选字母。

请尝试这段 C# 代码。

using System;
 using System.Text.RegularExpressions;
 namespace myapp
{
   class Class1
     {
       static void Main(string[] args)
         {
           String sourcestring = "source string to match with pattern";
           Regex re = new Regex(@"(E)(\s+)?(\d{4}|\d{3})+([a-f])?");
           MatchCollection mc = re.Matches(sourcestring);
           int mIdx=0;
           foreach (Match m in mc)
            {
             for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
               {
                 Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
               }
             mIdx++;
           }
         }
     }
}

非常感谢!工作得非常漂亮和快速! - JoNo
1
加号字符不应该在里面。例如,按照您当前的模式,它将匹配EE123123。 - Steven Doggart
谢谢史蒂文的评论。你说得对。我已经更新了我的正则表达式来仅匹配1个E。 - jspek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接