R中的正则表达式排序

时间:2017-05-15 20:25:12

标签: r regex

我想在R中使用gregexpr创建一个正则表达式模式,以匹配以下类型的文本:

(SOME TEXT)R10043:(SOME TEXT)
(SOME TEXT)R34123:(SOME TEXT)R34254:(OTHER TEXT)
(SOME TEXT)R23123:(SOME TEXT)R34321:(MORE TEXT)

到目前为止,我已经尝试了这个'[R] [0-9] [0-9] [0-9] [0-9] < em> [0-9] [:]',但它不能正常工作。对于本文:

"\n\t\tperson.setRule( \"R10001:N\" );\n\t\tperson.setMessages( 
\"R10001:M0008:Bad customer.\" );"

使用的结果是:

[[1]]
[1]  35  44  81  89 166 174
attr(,"match.length")
[1] 7 7 7 5 7 5

这不是我的意思。

1 个答案:

答案 0 :(得分:1)

您的模式由可选的子模式组成,并且可以匹配空字符串。 [R]*[0-9]*匹配 0或更多出现的量化子模式。只有:是强制性的,因为它之后没有?*

您可以使用以下代码获取“代码”:

txt <- "(SOME TEXT)R10043:(SOME TEXT)(SOME TEXT)R34123:(SOME TEXT)R34254:(OTHER TEXT)(SOME TEXT)R23123:(SOME TEXT)R34321:(MORE TEXT)"
unlist(regmatches(txt, gregexpr("R\\d{5}:", txt)))
## => [1] "R10043:" "R34123:" "R34254:" "R23123:" "R34321:"

请参阅the R demoregex demo

<强>详情:

  • R - 一封信R
  • \d{5} - 五位数
  • : - 冒号。

现在,如果您的代码“重叠”,即。如果您需要提取M0008(并且通常从这些字符串中省略:),请使用PCRE正则表达式:

unlist(regmatches(txt, gregexpr("[RM]\\d{4,5}(?=:)", txt, perl=TRUE)))
## => [1] "R10001" "R10001" "M0008" 

请参阅R demo

(?=:)正向前瞻,仅检查文本是否与当前位置右侧的模式匹配,并且不会将匹配的文本添加到匹配项中。< / p>