sql:用于某些模式分隔的正则表达式

时间:2018-07-24 21:07:53

标签: sql regex oracle

在“示例”表中,我有一列“ 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或任何东西{{1 }}任何.任何空格.。我不确定我是否解释正确。

1 个答案:

答案 0 :(得分:0)

据我了解,您希望将您的专栏分为三栏。您应该更好地解释第二列的范围和语义,以便确保正则表达式与之匹配。

我与您提供的数据并行构建了一个正则表达式,因此它可能与以后的传入行不匹配。正则表达式在这里: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中,我们使用正则表达式具有搜索和子字符串功能。因此,您将需要一种编程语言来捕获这些组。

我为此目的编写了一个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

希望这会有所帮助。

干杯