【问题标题】:Regex help with splitting string正则表达式帮助拆分字符串
【发布时间】:2009-12-19 20:32:53
【问题描述】:

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

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+- 不会出现,除非作为分隔符。

我将如何为此编写正则表达式?

【问题讨论】:

  • "有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题。 ——杰米·扎温斯基
  • 我知道我可以拆分这个 - 我想知道是否可以使用正则表达式来做到这一点。您的评论似乎另有说明。
  • '有些人在遇到正则表达式时会想“我知道,我会使用我记得的朗朗上口的引语”。现在他们没有在讨论中添加任何内容。' --Tomalak
  • @Shoko:不清楚您认为正则表达式是什么。正则表达式不是工具,它们只是描述模式的一种方式,它们被工具(如类似拆分的函数)使用来做事。
  • @Kemp,说得好。我应该让自己更清楚:我想知道是否可以使用带有正则表达式的 match 方法来查找组。

标签: regex split


【解决方案1】:

您不必为此编写一个正则表达式,只需将您想要的字符串作为分隔符进行拆分,您就会得到想要的字段。

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

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

【讨论】:

  • 在某些语言中,唯一的 split(...) 方法采用正则表达式(不是纯字符串)。以 Java 为例。
  • 纯字符串是恰好没有元字符的正则表达式
  • String.split("-\+gdl\+-") 在 Java 中应该可以正常工作,你只需要正确地转义它。
【解决方案2】:

简而言之,你需要的正则表达式是这样的:

-\+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);
        }
    }
}

【讨论】:

  • 虽然有点冗长,String regex = "-\\+gdl\\+-"; Pattern p = Pattern.compile(regex); String[] tokens = p.split(text); 这三行可以简单地写成:String[] tokens = text.split("-\\+gdl\\+-");
【解决方案3】:

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

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

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

你会得到空匹配。

【讨论】:

  • 谢谢,肯普。我不知道 $ 可以作为正则表达式的一部分单独存在。
【解决方案4】:

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

但是,您甚至不需要正则表达式。许多语言库将具有在“+gdl+”上拆分的功能。你用的是什么语言?

【讨论】:

  • 正如我在上面对 Andreas 的评论中所说的,我知道我可以拆分它。我想知道是否可以使用正则表达式。你是说不可能吗?
【解决方案5】:

我不确定你在寻找什么语言,但是在 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 部分只是将相同的内容应用于数组中的每个项目,因此我可以演示这如何应用于我们的所有示例。

【讨论】:

    【解决方案6】:

    我不确定您使用的是哪种编程语言。如果您使用的是高级编程语言,如 java、python,它很容易,正如大多数人所指定的那样,您会找到一个 split 函数。

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

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

    $ for i in ``echo $str | sed 's/-+gdl+-/ /g';回声 $i;完成

    kev-+kvs+-one

    greg-+kvs+-二

    les-+kvs+-三

    kev-+kvs+-one

    greg-+kvs+-二

    les-+kvs+-threekev-+kvs+-one

    greg-+kvs+-二

    les-+kvs+-三

    或者在 Perl 中你可以做些不同的事情

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多