sql:用于特定模式分离的正则表达式



在表"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

现在我需要以下东西

  1. .之前的部分添加到另一列"col1">
  2. 将零件.添加到另一列"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中字符串的一些属性是

  1. col1中的字符串总是以abcmnp结尾
  2. x2.0.3-a0.1.4这样的数字是属性。这些属性可能并不总是存在于col1字符串中。但是如果它退出,那么它总是存在于结束字符串abcmnp之前
  3. 在属性之前和属性之后总是有一个空格,即结束字符串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)

让我们将正则表达式分解为几个部分:

  1. (.+?(
  2. \s
  3. ([a-z]?\d(?:.\d({1,2}(?:-[a-z](?(
  4. \s
  5. (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

希望这能有所帮助。

干杯,

最新更新