正则表达式为^ | 在C#中

我正在研究HL7消息,我需要一个正则表达式。 这不起作用:

HL7 message=MSH|^~\&|DATACAPTOR|123|123|20100816171948|ORU^R01|081617194802900|P|2.3|8859/1 

我的正则表达式是:

 MSH|^~\&|DATACAPTOR|\d{3}|\d{3}|(\d{4}\d{2}\d{2}\d{2}\d{2}\d{2})|ORU\\^R01|\d{20}|P|2.3|8859/1 

任何人都可以建议特殊字符的正则表达式? 我正在使用此代码:

 strRegex = "\\vMSH|^~\\&|DATACAPTOR|\\d{3}|\\d{3}| (\\d{4}\\d{2}\\d{2}\\d{2}\\d{2}\\d{2})|ORU\\^R01|\\d{20}|P|2.3|8859/1"; Regex rx = new Regex(strRegex, RegexOptions.Compiled | RegexOptions.IgnoreCase ); 

|^\都是正则表达式中的特殊字符,因此您必须使用\来转义它们。 记住\也是常规字符串文字中的转义字符,所以你也必须逃避它:

 var strRegex = "\\vMSH\\|\\^~\\\\&\\|DATACAPTOR\\|… 

但是使用逐字字符串文字( @"…" )通常要容易得多:

 var strRegex = @"\vMSH\|\^~\\&\|DATACAPTOR\|… 

最后,请注意(\d{4}\d{2}\d{2}\d{2}\d{2}\d{2})可以简化为(\d{14})

但是,对于这样的结构,使用Split方法可能更容易。

 var segment = "MSH|^~\&|DATACAPTOR…"; var fields = segment.Split('|'); var timestamp = fields[5]; 

警告:HL7消息可能使用不同的控制字符 – 从MSH段中的第4个字符开始作为字段分隔符(在这种情况下, |^~\&是控制字符)。 如果您不控制输入并且这些控制字符可能会发生变化,最好先解析控制字符。

对我来说,你的问题描述了两个不同的问

问题1)“..我需要一个正则表达式..这不起作用..我的正则表达式是什么……有人建议(更好)正则表达式..?”

这是你问题的重要部分。

正如@pswg已经指出的那样,必须转义正则表达式中的一些特殊字符。 页面Microsoft Developer Network:正则表达式中的字符转义会告诉您哪些字符是特殊的以及如何转义它们。

为了轻松测试你的正则表达式是否识别语法,你可能会发现一些有用的交互式正则表达式测试工具,例如Regex Hero或The Regulator

问题2)“我正在处理HL7消息……这不起作用..我的正则表达式是什么……有人建议(更好)正则表达式..?”

这是你问题的重要部分。

MSH|^~\&|DATACAPTOR|123|123|20100816171948|ORU^R01|081617194802900|P|2.3|8859/1

您的问题中显示的示例已经是无效的HL7消息片段 。 它类似于HL7,但它可能已被某些文本预处理代码损坏。 HL7 v2消息不使用可以使用文本工具操作的文本协议进行传输。 该协议是二进制的,但同时具有部分可读性,因此可由人类控制而无需任何特殊工具。 但它是二进制协议,必须这样处理。 Regex是一个处理文本字符串而不是二进制字符串的工具。 虽然看起来有可能通过一个新时代的正则表达式单行程来超越一些20世纪古老的协议,但这并不是一个好方法。 我试图解释为什么不在你的问题的评论部分。

片段的基本解码是:

 MSH-0:MSH
 MSH-1:|
 MSH-2:^〜\&
 MSH-3:DATACAPTOR
 MSH-4:123
 MSH-5:123
 MSH-6 :! 失踪 !
 MSH-7:20100816171948
 MSH-8 :! 失踪 !
 MSH-9:ORU ^ R01
 MSH-10:081617194802900
 MSH-11:P
 MSH-12:2.3
 MSH-13 :! 失踪 !
 MSH-14 :! 失踪 !
 MSH-15 :! 失踪 !
 MSH-16 :! 失踪 !
 MSH-17 :! 失踪 !
 MSH-18:8859/1

! missing ! ! missing ! 碎片真的不见了。 在正常的MSH段中,它们应该位于相应的位置,只有默认的空值。

通过阅读Health Level Seven,Version 2.3.1©1999 – Chapter 2.24.1 MSH – message header segment,我们可以看到

该消息是在4年前的2010年创建的,可能是由Capsule Tech,Inc。的DataCaptor™创建的,并按照Health Level Seven,Version 2.3©1997定义的规则进行格式化,这些规则是17岁,已经多次更新标准并且应该是由维基百科中列出的一个国家/地区使用:ISO / IEC 8859-1

从你的问题我看不到更多,但无论你想要做什么以及无论出于何种原因你将要处理的任何数据,你开始的代码片段已经是错误的,一般来说HL7正则表达式解析方法很奇怪,如果您正在研究在医疗行业的任何地方使用的严肃软件,请考虑编写或使用经过严格测试的解析器,例如NHapi库使用的解析器http://sourceforge.net/p/nhapi/code/头/株/ NHapi20 / NHapi.Base /分析器/ PipeParser.cs