Regexp在食材的成分 - 文本中找到“E数字”

时间:2016-01-27 00:05:47

标签: c# regex vb.net

我正在开展一个分析食品的项目。在VB.net,C#中编​​程并使用MS SQL Server DB。

我现在需要在成分文本字段中找到每个“E编号”。 (E数字是欧洲标准的食品添加剂编码系统,se Wikipedia here)。

E号码具有以下格式:

  1. 大写字母“E”(1个字符)。
  2. 可选[空格](0 - 1个字符)。
  3. 三位或四位数字,范围为100到1600(3 - 4个字符)。
  4. “a”到“f”(0 - 1个字符)范围内的可选smallCAP字母 使其总长度为4到7个字符。
  5. *数字通常括在括号中和/或立即与成分名称连接,然后(可能)在其之前或之后不留任何空格或分隔符。

    示例:E100,甲醛(E 240),E300b,E 1234a,(E1321)。

    我需要返回文本中的所有E编号(如上格式)。可能会有很多 有什么想法吗?

    - 无论如何正确地学习RegExp,因此问题。

2 个答案:

答案 0 :(得分:3)

您可以使用正则表达式模式E ?\d{3,4}[a-f]?请参阅online demo

  • E ? - 必须以E开头,后跟可选空格(?使前面的空格可选)。
  • \d{3,4} - 接下来的三个或四个字符必须是数字
  • [a-f]? - 最后一个字符可以选择是 a f 之间的任何字母

您可以搜索所有匹配项:

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

答案 1 :(得分:0)

应该有效的表达式:

(E)+(\ S +)(\ d {4} | \ d {3})?+([A-F])

捕获组0 :确保至少有1个Capital 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++;
           }
         }
     }
}