C# 如何限制正则表达式匹配

C# 如何限制正则表达式匹配,c#,regex,C#,Regex,我正在为一家诊所做一个项目,它对一些实验室文档运行OCR,然后解析数据并自动将其输入实验室系统。原始数据是半结构化的,我可以通过一系列步骤按照我需要的顺序提取我需要的数据。我盯着它看的时间太长了,开始撞到墙了,如果能再看一眼,我会很感激的 过程如下所示: 首先通过原始文本,并使用符合标准规范和实验室文档特定边界的正则表达式进行提取,包括OCR读取的潜在工件 第二遍提取测试代码,不幸的是,这些代码在字符组成方面的变化要大得多。注意,由于文档的格式、文本的组成以及OCR工件,我还必须强制设置边界

我正在为一家诊所做一个项目,它对一些实验室文档运行OCR,然后解析数据并自动将其输入实验室系统。原始数据是半结构化的,我可以通过一系列步骤按照我需要的顺序提取我需要的数据。我盯着它看的时间太长了,开始撞到墙了,如果能再看一眼,我会很感激的

过程如下所示:

  • 首先通过原始文本,并使用符合标准规范和实验室文档特定边界的正则表达式进行提取,包括OCR读取的潜在工件
  • 第二遍提取测试代码,不幸的是,这些代码在字符组成方面的变化要大得多。注意,由于文档的格式、文本的组成以及OCR工件,我还必须强制设置边界
  • 在这些过程之后,我将数据组织在一个列表中,并以某种方式重新组织和分组。一切正常
我用来提取测试代码的正则表达式如下所示:


(?您需要锚定您的正则表达式,并利用经常出现的模式,例如管道
|
字符:

^[\W\s]*(?<ORDER>[A-Z0-9]{3,9})\s+.*?\|
^[\W\s]*(?[A-Z0-9]{3,9})\s+.*\|
如果您选择不命名,则所需数据将位于命名的捕获组
顺序中
$1


您可以使用线锚的起始点
^
来确保只获取第一个元素。使用此正则表达式,您需要确保在通话中包含

[见此处使用的正则表达式][2]

(?<=^[.•]?\s*)[A-Z0-9]{3,9}\b

(?在这里,别忘了打开多行选项:

var regex = new Regex(@"(?:^[•\s\.]*)(?<ORDER>[A-Z0-9]{3,9})", RegexOptions.Multiline);
var regex=new regex(@“(?:^[•\s\.]*)(?[A-Z0-9]{3,9})”,RegexOptions.Multiline);

哪种语言/regex引擎?您还可以以纯文本(而不仅仅是图像)发布文本吗所以我们很容易测试?你想匹配的东西总是在行首和第一个
之间吗?如果是,那就很简单了。如果不是,请描述更多关于这些序列可能出现在哪里以及哪些应该被拒绝的约束。每行只取第一组?还有,@ctwheels它的C和原始文本添加d@Integration您可以锚定它:
(?对于
THYCSCD J甲状腺级联配置文件
,是否要匹配
THYCSCD
?更明确地说,我想问的是
\s |
是否需要在第一段中匹配的东西后面。它不匹配
THYCSCD
。但是,我要补充的是,他需要选择第二组来获得订单,作为整个正则表达式也匹配周围的字符(第一组与整个匹配的字符串相同)。@Andrew我假设OP知道他们在用
做什么,但我已经添加了细节。@MonkeyZeus
[^ |]*
*?
快,因为它没有backtrack@ctwheels我建议在我的regex101链接上测试这个建议newlines@MonkeyZeus我编辑了我的评论,但一定是在你复制它之后;我输入了拼写错误,而不是
|
这个正则表达式将与
wbcstfjjj中的
WBCSTFJJF
匹配FK | WBC stool | BILL:Patient
这可能是不需要的行为,因为整个字符串不是有效的测试代码。源数据中没有提供类似的示例,也没有说它是不需要的。这只是你的假设。这似乎很有效。感谢你解释发生了什么。我现在更好地理解了。+1/answeredI在问题的末尾添加了其他信息。我应该在原始问题中特别添加这些信息。对此我深表歉意,并感谢您的任何想法。谢谢
var regex = new Regex(@"(?:^[•\s\.]*)(?<ORDER>[A-Z0-9]{3,9})", RegexOptions.Multiline);