2013-11-14 31 views
2

我想用正则表达式来检索标题:代码对。使用正则表达式来匹配模式

(.*?\(CPT-.*?\)|.*?\(ICD-.*?\)) 

数据:

耳聋双边(轻度)(ICD-389.18)的右手腕腱鞘囊肿(ICD-727.41)INTO左肩关节DEPO甲泼尼龙S/P INJECTION(CPT-20600)

我想捕捉:

  • 耳聋双边(轻度)(ICD-389.18)
  • 右手腕神经节囊肿(ICD-727.41)为左肩关节DEPO甲泼尼龙
  • S/P喷射(CPT-20600)

什么是使用正确的正则表达式?

+2

您的捕获示例#1和#2都包含'RIGHT WRIST',这是故意的吗? – jmstoker

+0

@jmstoker:不,我不认为,因为“听力损失”是“双边”,而不是位于“右手腕” –

+0

@jmstoker我同意*卡西米尔*。参见[ICD-389.18](http://www.icd9data.com/2012/Volume1/320-389/380-389/389/389.18.htm)和[ICD-727.41](http://www.icd9data。 COM/2012/VOLUME1/710-739/725-729/727/727.41。htm) –

回答

4

什么像这样的模式:

.*?\((CPT|ICD)-[A-Z0-9.]+\) 

这将匹配零个或多个任意字符,不贪婪,随后(后接CPTICD,后跟一个连字符,然后一个或多个大写拉丁字母,十进制数字或句点,后跟)

请注意,我选择了[A-Z0-9.]+,因为据我的理解,所有当前ICD-9 codes,ICD-10 codesCPT codes都符合该模式。

的C#代码看起来有点像这样:

var result = Regex.Matches(input, @".*?\((CPT|ICD)-[A-Z0-9.]+\)") 
        .Cast<Match>() 
        .Select(m => m.Value); 

如果你想避免任何周围的空白,你只是修剪结果字符串(m => m.Value.Trim()),或确保匹配的前缀与开始非空白字符通过把一个\S在前面,就像这样:

var result = Regex.Matches(input, @"\S.*?\((CPT|ICD)-[A-Z0-9.]+\)") 
        .Cast<Match>() 
        .Select(m => m.Value); 

或使用负向前查找,如果你需要处理像(ICD-100)(ICD-200)输入:

var result = Regex.Matches(input, @"(?!\s).*?\((CPT|ICD)-[A-Z0-9.]+\)") 
        .Cast<Match>() 
        .Select(m => m.Value); 

你可以看到一个工作demonstration here

+0

你的正则表达式在第二和第三场比赛前放置一个空格。通过在模式的末尾添加'[] *'(空格)可以将空间移动到最后。 '。*?\((CPT | ICD) - [A-Z0-9。] + \)[] *' – jmstoker

+0

@jmstoker这是一个很好的观点。但是如果OP不想捕捉周围的空白,他需要一些不同的东西。我提供了几个选择。 –

+0

+1 - 我认为它是在失控的错误文本和灵活性之间折腾起来的。 Erant文​​本不会返回部分结果,灵活性可能会返回太多,即:'\(ICD - [^)] * \)' – sln

1

可以使用split()方法:

string input = "SENSORINEURAL HEARING LOSS BILATERAL (MILD) (ICD-389.18) RIGHT WRIST GANGLION CYST (ICD-727.41) S/P INJECTION OF DEPO MEDROL INTO LEFT SHOULDER JOINT (CPT-20600)"; 
string pattern = @"(?<=\))\s*(?=[^\s(])"; 
string[] result = Regex.Split(input, pattern); 
0

考虑下面的正则表达式...

.*?\d\) 

祝您好运!