我想在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
这不是我的意思。
答案 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 demo和regex 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>