在R中是否存在模式匹配和捕获功能,因为perl

时间:2017-02-14 14:41:40

标签: r regex pattern-matching

我有一个文本文件,我正在尝试提取模式。在perl中,我使用$ 1进行匹配,如What does $1 mean in Perl?

我想知道R是否有类似的功能。这是我的意思

的样本
a=readLines('xxx.txt')
"{1:F21CRESUS33XLIQ9590112170}{2:O1030747170228BNPAGB22XCIT95901121701702280629U}{3:{103:GLBH}}{4"
 [914] ":20:PK836J9GD2HI7SWQ"                                                                            
 [915] ":23B:CRED"                                                                                       
 [916] ":32A:170214USD2154,252"                                                                          
 [917] "50:ABNYUS33XXXX"                                                                                 
 [918] "/1Jose Lugo"                                                                                     
 [919] "/2931 Corte De Luna"                                                                             
 [920] "/3 Seattle"                                                                                      
 [921] "/498104, United States"                                                                          
 [922] "59F:BPAHCUHHXXXX"                                                                                
 [923] "/1 Jossef   Goldberg"                                                                            
 [924] "/21220 Bradford Way"                                                                             
 [925] "/3 Seattle"                                                                                      
 [926] "/498104, United States"                                                                          
 [927] ":71A:OUR"                                                                                        
 [928] "-}"                                                                                              
 [929] "{1:L01BARCGB21X05G7115765182}{2:O1030946170226ABBYGB2LXXXX71157651821702261046S}{3:{103:WJHX}}{4"
 [930] ":20:YZDSKFJNXV4BE3MP"                                                                            
 [931] ":23B:CRED"                                                                                       
 [932] ":32A:170214USD63362,31"                                                                          
 [933] "50:ABBYGB2LXXXX"                                                                                 
 [934] "/1Jossef Goldberg"                                                                               
 [935] "/21220 Bradford Way"                                                                             
 [936] "/3 Seattle"   

我想要做的是测试一个条件,如果该行有一个特定字符,然后搜索该行以查看它是否包含另一个模式,并将$拉出来(如perl中所示)。

在伪代码中:

pattern1='^{1:'
pattern2='CU'
if (!is.null(line)){
  if(grep(pattern1, line)){
    if(grep(pattern2,line)){ print(substr(line,a,b), plus some other patters if they match the regex)
    }                       
  }
}

我也想知道如何让它开始阅读

1 个答案:

答案 0 :(得分:2)

首先,我建议加入\n

x <- paste0(a, collapse = "\n")

然后你可以用

抓住你的比赛
regmatches(x, gregexpr("(?sm:^{1.*?CU)(?-s:.*)", x, perl=TRUE))

(?sm:^{1.*?CU)(?-s:.*)是匹配的正则表达式模式:

  • (?sm:^{1.*?CU) - 行的开头(^将匹配行开头位置,?m启用此行为),然后{1文字字符序列,然后{{1} }将匹配任何0+字符(因为.*?使(?s)匹配包括换行符的任何符号)尽可能少(因为.是一个惰性量词)直到第一个{ {1}}
  • *? - CU将与该行的其余部分匹配((?-s:.*)组关闭之前由.*启用的DOTALL修饰符。)