在表"example"中,我有一列"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中字符串的一些属性是
- col1中的字符串总是以
abc
或mnp
结尾 - 像
x2.0.3-a
或0.1.4
这样的数字是属性。这些属性可能并不总是存在于col1字符串中。但是如果它退出,那么它总是存在于结束字符串abc
或mnp
之前 - 在属性之前和属性之后总是有一个空格,即结束字符串abc/mnp和属性之间的另一个空格
所以我的问题是如何将属性分离并添加到col2中?我脑海中浮现的一个想法是,试图找到具有*.* abc/mnp
或*.*.* abc/mnp
的东西,即任何.
任何.
空间abc/mnp
或任何.
任何.
任何空间abc/mnp
。我不确定我是否解释得当。
据我所知,您希望将您的列拆分为3列。您应该更好地解释您的第二列的范围和语义,这样您就可以确保正则表达式定期与其匹配
我构建了一个与您提供的数据并行的regex,因此它可能与未来的传入行不匹配。Regex在这里:https://regex101.com/r/seLgca/2/它所做的是,它捕获了三个主要组:
(.+?)s?([a-z]?d(?:.d){1,2}(?:-[a-z])?)?s(abc|mnp)
让我们将正则表达式分解为几个部分:
- (.+?(
- \s
- ([a-z]?\d(?:.\d({1,2}(?:-[a-z](?(
- \s
- (abc|mnp(
以相反的顺序开始,第五部分简单地匹配abc或mnp。第四部分期待一个空间。第三部分匹配您的第二列(如果存在(,请注意,这部分是您提供的内容,因此您可以修改这部分以更好地适应您的数据。第二部分需要一个空格,如果它存在的话,这是因为行包含空的第二列。第一部分为其余部分。
据我所知,在Oracle中,我们有使用regex的搜索和子字符串函数。因此,您需要一种编程语言来捕获这些组。
我为此写了一个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
希望这能有所帮助。
干杯,