2016-01-27 1 views
3

Я работаю над проектом анализа пищевых продуктов. Программирование на VB.net, C# и использование базы данных MS SQL Server.Regexp найти «E numbers» в ингредиентах-текстах продуктов

Теперь мне нужно найти каждое появление «E-чисел» в текстовом поле components. (E номера - европейская стандартная кодирующая система для пищевых добавок, se Wikipedia here).

числа E имеет следующий формат (ы):

  1. заглавная буква "E" (1 символ).
  2. Опционально [пробел] (0 - 1 символ).
  3. Трех- или четырехзначное число в диапазоне от 100 до 1600 (3 - 4 символа).
  4. Необязательная маленькая буква CAP в диапазоне от «a» до «f» (0 - 1 символ).
    Выполнение этой задачи в сумме от 4 до 7 символов.

* Номер часто заключен в круглые скобки и/или сразу же соединен с именем ингредиента, а затем (возможно) не оставляет места или разделителя до или после него.

Примеры: E100, формальдегид (E 240), E300b, E 1234a, (E1321).

Мне нужно вернуть все E-номера (как формат выше), который находится в тексте. Их может быть много.
Любые идеи?

-Необходимо изучать RegExp должным образом, следовательно, вопрос.

+0

Вы очень четко описали свои требования, но это не сайт для того, чтобы попросить кого-нибудь написать код для вас. Пожалуйста, прочитайте [Как спросить] (http://stackoverflow.com/help/how-to-ask) – Blackwood

ответ

3

Вы можете использовать шаблон регулярного выражения E ?\d{3,4}[a-f]? См online demo.

  • E ? - должно начинаться с Е с последующими дополнительным пространством (? делает предыдущее пространство по желанию).
  • \d{3,4} - Следующие три или четыре символа должны быть цифрами
  • [a-f]? - последний символ необязательно может быть любой буквой между и е

Вы можете найти все матчи как это:

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

Большое спасибо, просто и аккуратно, и делает эту работу! – JoNo

+2

Отличное решение, чистое, и мы объясним мистера Доггарта! Это должен быть принятый ответ! Также приятно поймать принятый ответ, поскольку он будет терпеть неудачу, как вы упомянули. – Codexer

+0

Вместо фактического пространства я бы использовал '\ s' – Jeroen

0

Выражение, которое должно работать:

(Е) + (\ S +), (\ d {4} | \ д {3}) + ([а-е])?

Capture Group 0: Делает, что существует, по крайней мере, 1 Capital E

Capture Group 1: Как много пространства, как это возможно, если есть пробелы

Capture Group 2: Либо 4 или 3-значное число

Capture Group 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++; 
      } 
     } 
    } 
} 
+0

Спасибо, миллион! Работает красиво и быстро! – JoNo

+1

Символы плюса не должны быть там. Например, как ваш шаблон в настоящее время, он будет соответствовать EE123123 –

+0

Большой плюс для всего кода. – JoNo