我这里列出了上一个问题(Searching for specific string pattern),但是还有其他一些问题。
以前,我认为我的文件命名约定仅是以下格式:
return reports.stream()
.map(report -> {
String oldReportId = report.getOldId();
Map<String, Set<EServiceReport>> eServiceReportsMapByBatchFile = // processing of batch files
...
// I don't know how and what to return here
}).collect(// I don't know what to do here);
或者具体地说,它是季度,后跟“-” 然后是年份。
但是,在进一步调查后,文件还有其他变体,例如:
"aaaaa-ttttt-eeee-q4-2015-file"
"aaaaaa-fffff-3333-q2-2012-file"
类似地,我想提取年和季度,但是我不确定是否有可以编写的通用代码可以一次提取所有内容,还是我必须编写几组代码并逐行运行它们。对R中的子功能不是很熟悉,如果有人可以将我指向一个包含详细说明和示例的网站,让我编写自己的代码以提取这些信息,我将不胜感激。
最终,代码应解析所有这些字符串,并输出如下内容: year = 2005 , quarter = q4 等。
答案 0 :(得分:1)
尝试使用regexpr
来显示比赛的位置,并使用regmatches
来返回比赛的位置,这很容易导致提取不正确的数据。对于四分之一,它将返回1-4之前或之后带有q的任何1-4实例。如果有任何其他信息可以使这些匹配项比我建议的更具体。
input=c("aaaaaa-f2q09-bbbbb",
"aaaaaa-f2q2008-bbbbb",
"aaaaaa-f4q-2008-fffff",
"f4q-aaaaa-eeeeee-2008",
"q2-aaaaaaaaa-eeeeeee-2005",
"aaaaaaaa-3q-2008-rrrrrrr")
quarter=regmatches(input, regexpr("[1-4]q|q[1-4]", input))
year = regmatches(input, regexpr("q\\d{4}|q\\d{2}|\\d{4}", input))
year = gsub("q","",year)
year = sub("\\b(\\d{2})\\b","20\\1", year)
年份匹配也存在很多问题,因为您可能会使用三种不同的格式“ q09”,“ q2008”,“ 2008”。因为该函数返回字符串中的第一个匹配项,所以需要q \ d {4}来拉回q2008示例。
我的sub
函数在此表示将正则表达式与20以及匹配的表达式本身进行匹配,\\1
返回括号中的内容(\\d{2})
测试并评论任何错误