脚本逻辑:匹配模式

时间:2014-04-04 14:12:06

标签: ruby regex

我试图找出正则表达式/脚本逻辑来解析这样的东西;

RAW DATA
 {CLNDSDB=MedGen:OMIM:SNOMED_CT;CLNDSDBID=C0432243:271640:254100000}


Here, the value is; 
     MedGen = C0432243
     OMIM = 271640
     SNOMED_CT = 254100000 

Result: 271640

我正在设想一个复杂的if-else循环来获得结果。只是想知道是否有任何简单的方法来获得相同的结果。非常感谢您的回答。

2 个答案:

答案 0 :(得分:2)

也许是这样的:(假设总有三个字段)

(?<=[=:])(?<key>[^:;]+)(?=[:=;](?:[^:;=]+[=;:]){3}(?<val>[^:]+))

我们的想法是在前瞻断言中捕获字段值,以免干扰重叠的子字符串。

但是,使用连续拆分可能更简洁。

答案 1 :(得分:0)

很难从问题中判断输入字符串是两行还是一行:

str = 'RAW DATA
 {CLNDSDB=MedGen:OMIM:SNOMED_CT;CLNDSDBID=C0432243:271640:254100000}
'

str = '{CLNDSDB=MedGen:OMIM:SNOMED_CT;CLNDSDBID=C0432243:271640:254100000}'

但是,在任何一种情况下我都会使用一个简单的模式:

str = '{CLNDSDB=MedGen:OMIM:SNOMED_CT;CLNDSDBID=C0432243:271640:254100000}'
medgen, omim, snomed_ct = str.match(/(\w+):(\w+):(\w+)}/).captures

medgen # => "C0432243"
omim # => "271640"
snomed_ct # => "254100000"

这是the pattern at Rubular

  

我正在设想一个复杂的if-else循环来获得结果。

好吧,不要这样做。大多数编程解决方案都非常简单,所以从简单开始。随着您的学习,您的编程工具箱将随着您熟悉新的工作方式而增长,并且您会发现某些工具对某些任务更有用。不过,总是从“简单”开始,让基础工作,然后仔细添加处理角落案件。

在这种情况下,使用正则表达式时,在字符串中查找可用于定位目标文本的地标非常重要。在这种情况下,尾随的“}”是可用的,因此我编写了三个简单的捕获来查找由\w分隔的:个字符串。