正则表达式帮助分割字符串

时间:2009-12-19 20:32:54

标签: regex split

我需要能够解析这些字符串:

kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three

-+gdl+-kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three

kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three-+gdl+-

并且在所有三个案例中都认可这三个群体:

kev-+kvs+-one

greg-+kvs+-two

les-+kvs+-three

换句话说,它应该使用字符串 - + gdl + - 来分割字符串。

假设序列 - + gdl + - 除了作为分隔符外不会发生。

我该怎么写正则表达式?

7 个答案:

答案 0 :(得分:1)

你不必编写一个正则表达式只是用你想要的字符串作为分隔符的分割,你将得到想要的字段。

一个例子,但我不知道你使用什么语言

 "kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three".split("-+gdl+-")

答案 1 :(得分:1)

简而言之,您需要的正则表达式是:

-\+gdl\+-

以下Java代码可以执行此操作,打印出令牌和令牌本身的数量:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Regex {
    public static void main(String[] args) {
        String text = "kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three";
        String regex = "-\\+gdl\\+-";
        Pattern p = Pattern.compile(regex);
        String[] tokens = p.split(text);
        System.out.println("Found " + tokens.length + " tokens");
        for (String token: tokens) {
            System.out.println("Found " + token);
        }
    }
}

答案 2 :(得分:0)

大多数正则表达式库都具有拆分功能。您只需使用参数+ gdl +调用此函数,它将返回一个数组。细节因语言而异。

但是,你甚至不需要正则表达式。许多语言库都具有拆分“+ gdl +”的功能。你用的是哪种语言?

答案 3 :(得分:0)

您可以使用正则表达式解决此问题,只需使用-+gdl+-作为拆分模式。需要转义的内容取决于您的正则表达式风格。

评论后编辑:您可以通过匹配进行编辑,但会增加不必要的复杂性。它还取决于语言,例如PHP

preg_match_all('/(.*?)(?:-\+gdl\+-|$)/', $string, $match);

你会得到空的比赛。

答案 4 :(得分:0)

我不确定你在寻找什么语言,但在Ruby中你可以使用[String#split] 1(你不需要正则表达式,一个简单的字符串参数会做):

>> strings = ["kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three",
              "-+gdl+-kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three",
              "kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three-+gdl+-"]
>> split = strings.map {|s| s.split "-+gdl+-"}
=> [["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"], 
    ["", "kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"], 
    ["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"]]

请注意,这确实存在在字符串的开头或中间引入空字段的问题。如果您不想要任何空字段,那么您可能必须在之后过滤掉这些字段:

>> split.map {|a| a.reject {|s| s == ""}}
=> [["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"], 
    ["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"], 
    ["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"]]

如果你不熟悉ruby,map部分只是对数组中的每个项应用相同的东西,所以我可以演示这是如何适用于我们所有的例子。

答案 5 :(得分:0)

我不确定您使用的是哪种编程语言。如果您使用的是高级编程语言,例如java,python,它很容易,就像大多数指定的那样,你会发现一个split函数。

如果您使用命令行,如bash提示符,我会使用sed

  

$ str =“kev- + kvs + -one- + gdl + -greg- + kvs + -two- + gdl ...”

     <$>我在``echo $ str |中的$ sed's / - + gdl + - / / g';回声$ i;完成

     

kev- + KVS + - 酮

     

greg- + KVS + - 两个

     

les- + KVS +三防

     

kev- + KVS + - 酮

     

greg- + KVS + - 两个

     

les- + KVS + -threekev- + KVS + - 酮

     

greg- + KVS + - 两个

     

les- + KVS +三防

或者在Perl中你可以略微区别

  

$ echo $ str | perl -pe's /(.*?)-+ gdl + - / $ 1 \ n / g'

答案 6 :(得分:-1)

.*?\-\+gdl\+\-.*?