在“示例”表中,我有一列“ col1”,其中包含以下字符串
some example text here x2.0.3-a abc
some other example text 1.5 abc
another example text 0.1.4 mnp
some other example text abc
another example text mnp
现在我需要关注
.
之前的零件添加到另一列“ col1” .
添加到另一列“ col2” 所以输出应该像这样
col1 col2
some example text here x2.0.3-a
some other example text 1.5
another example text 0.1.4
some other example text
another example text
col1中字符串的某些属性是
abc
或mnp
结尾x2.0.3-a
或0.1.4
是属性。这些属性可能并不总是存在于col1字符串中。但是,如果退出,则它始终存在于结束字符串abc
或mnp
之前。所以我的问题是如何分离属性并将其添加到col2中?
我想到的一个想法是,尝试使用*.* abc/mnp
或*.*.* abc/mnp
找到的东西.
任何东西.
空间abc/mnp
或任何东西{{1 }}任何.
任何空格.
。我不确定我是否解释正确。
答案 0 :(得分:0)
据我了解,您希望将您的专栏分为三栏。您应该更好地解释第二列的范围和语义,以便确保正则表达式与之匹配。
我与您提供的数据并行构建了一个正则表达式,因此它可能与以后的传入行不匹配。正则表达式在这里:https://regex101.com/r/seLgca/2/它的作用是捕获三个主要组:
(.+?)\s?([a-z]?\d(?:\.\d){1,2}(?:-[a-z])?)?\s(abc|mnp)
让正则表达式分成几个部分:
以相反的顺序开始,第五部分只是匹配abc或mnp。第四部分期待一个空间。第三部分与第二列(如果存在)匹配,请注意,该部分用于您提供的内容,因此您可以修改此部分以更好地适合您的数据。第二部分期望一个空格(如果存在),这是因为行包含空的第二列。第一部分是其余部分。
据我所知,在Oracle中,我们使用正则表达式具有搜索和子字符串功能。因此,您将需要一种编程语言来捕获这些组。
我为此目的编写了一个Java方法:
static List<String> getGroups(String content, String regex){
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
List<String> groupsMatched = new ArrayList<String>();
if(matcher.find()){
for(int i=0; i<matcher.groupCount(); i++)
groupsMatched.add(matcher.group(i));
return groupsMatched;
}else
return null;
}
因此,如果我用您提供的代码行像这样调用方法:
for(String content : listOfContent){
List<String> groupsMatched = getGroups(content, regex);
if(groupsMatched != null)
System.out.println(groupsMatched.get(1) + "\t" + groupsMatched.get(2) + "\t" + groupsMatched.get(3) );
}
这是我所拥有的:
some example text here x2.0.3-a abc
some other example text 1.5 abc
another example text 0.1.4 mnp
some other example text null abc
another example text null mnp
希望这会有所帮助。
干杯