正则表达式在食品成分文本中查找“E 数字”
Posted
技术标签:
【中文标题】正则表达式在食品成分文本中查找“E 数字”【英文标题】:Regexp to find "E numbers" in ingredients-texts of food 【发布时间】:2016-05-03 18:11:44 【问题描述】:我正在开展一个分析食品的项目。使用 VB.net、C# 和 MS SQL Server DB 进行编程。
我现在需要在成分文本字段中找到每个出现的“E 数字”。 (E 编号是食品添加剂的欧洲标准编码系统,参见 Wikipedia here)。
E 号码具有以下格式:
-
大写字母“E”(1 个字符)。
可选的 [空格](0 - 1 个字符)。
100 到 1600(3 - 4 个字符)范围内的三位或四位数字。
“a”到“f”(0 - 1 个字符)范围内的可选 smallCAP 字母。
使其总共有 4 到 7 个字符的长度。
*该数字通常用括号括起来和/或立即与成分名称连接,然后(可能)在其前后不留任何空格或分隔符。
示例:E100、甲醛(E 240)、E300b、E 1234a、(E1321)。
我需要返回文本中的所有 E 数字(如上述格式)。可能有很多。 有什么想法吗?
-从来没有好好学习过正则表达式,所以这个问题。
【问题讨论】:
您已经非常清楚地描述了您的需求,但这不是一个请别人为您编写代码的网站。请阅读How to ask 【参考方案1】:您可以使用正则表达式模式E ?\d3,4[a-f]?
请参阅online demo。
E ?
- 必须以 E 开头,后跟可选空格(?
使前面的空格可选)。
\d3,4
- 接下来的三四个字符必须是数字
[a-f]?
- 最后一个字符可以是 a 和 f 之间的任意字母
您可以像这样搜索所有匹配项:
foreach (Match m in Regex.Matches(input, pattern))
Console.WriteLine(m.Value);
【讨论】:
很好的解决方案,干净,我们会解释 Doggart 先生!这应该是公认的答案!也很好地抓住了接受的答案,因为它会像你提到的那样失败。 我会使用\s
而不是实际空间@
@Jeroen 我考虑过,但这将匹配任何空白字符。由于根据 OP 的规范只是一个空格(而不是制表符或换行符等),因此我选择了更严格的要求。
@StevenDoggart 够公平的!我已经习惯了规范说space
并找到各种其他不可打印的东西,我只是养成了使用\s
的习惯【参考方案2】:
应该起作用的表达式:
(E)+(\s+)?(\d4|\d3)+([a-f])?
Capture Group 0:确保至少有 1 个 Capital E
捕获组 1:如果有空格,则尽可能多的空格
捕获组 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+)?(\d4|\d3)+([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++;
【讨论】:
感谢一百万!运行起来既漂亮又快速! 加号字符不应该在那里。例如,您的模式当前的方式,它将匹配 EE123123 感谢史蒂文的评论。你说的对。我将我的 RegEx 更新为仅匹配 1 个 E。以上是关于正则表达式在食品成分文本中查找“E 数字”的主要内容,如果未能解决你的问题,请参考以下文章