如何使用Regex正确拆分/解析此String

时间:2015-08-05 18:33:24

标签: java regex string split

我对正则表达式缺乏经验并且使用JAVA生锈,所以在这里一些帮助将不胜感激。

所以我在表格中有一个字符串:

cats|1|short hair and long hair

cats|2|black, blue

dogs|1|cats are better than dogs

where语句可以是字符,数字和空格的任意组合。 我想解析这个字符串,以便将每行的第一个和最后一个语句保存在一个单独的字符串数组中。

例如,如果我有一个字符串:

Array one = [cats], [cats], [dogs]

Array two = [short hair and long hair],[black, blue],[cats are better than dogs]

    Matcher m = Pattern.compile("(\\.+)|\\d+|=(\\.+)").matcher(str);

        while(m.find()) {
          String key = m.group(1);
          String value = m.group(2);
          System.out.printf("key=%s, value=%s\n", key, value);
        }

我希望能够将字符串解析为两个数组。

#foot_content {height:50vh;}

如果我的输出正确但没有运气,我会继续将键和值添加到单独的数组中。对此有任何帮助将非常感激。

5 个答案:

答案 0 :(得分:2)

以下是RegEx的解决方案:

public class ParseString {
    public static void main(String[] args) {
        String data = "cats|1|short hair and long hair\n"+
                      "cats|2|black, blue\n"+
                      "dogs|1|cats are better than dogs";
        List<String> result1 = new ArrayList<>();
        List<String> result2 = new ArrayList<>();
        Pattern pattern = Pattern.compile("(.+)\\|\\d+\\|(.+)");

        Matcher m = pattern.matcher(data);
        while (m.find()) {
           String key = m.group(1);
           String value = m.group(2);
           result1.add(key);
           result2.add(value);
           System.out.printf("key=%s, value=%s\n", key, value);
        }
    }
}

这是一个很棒的网站,可以帮助您使用正则表达式http://txt2re.com/表达式。在第一步中输入一些示例文本。选择您感兴趣的部分2.在步骤3中选择一种语言。然后复制,粘贴并按摩它吐出的代码。

答案 1 :(得分:0)

双重拆分应该有效:

class ParseString
{  
  public static void main(String[] args)
  {  
    String s = "cats|1|short hair and long hair\ncats|2|black, blue\ndogs|1|cats are better than dogs";
    String[] sa1 = s.split("\n");
    for (int i = 0; i < sa1.length; i++)
    {  
      String[] sa2 = sa1[i].split("\\|");
      System.out.printf("key=%s, value=%s\n", sa2[0], sa2[2]);
    } // end for i
  } // end main
} // end class ParseString

输出:

key=cats, value=short hair and long hair
key=cats, value=black, blue
key=dogs, value=cats are better than dogs

答案 2 :(得分:0)

主要问题是您需要转义|而不是.。你的正则表达式=做了什么?我稍微概括了正则表达式,但您可以将.*替换为\\d+以使其与您相同。

Matcher m = Pattern.compile("^(.+?)\\|.*\\|(.+)$", Pattern.MULTILINE).matcher(str);

以下是严格版本:"^([^|]+)\\|\\d+\\|([^|]+)$"(也使用MULTILINE)

使用split(在线上)确实比某些人说的更容易,但是像这样:

String[] parts = str.split("\\|\\d+\\|");

如果parts.length不是两个,那么您知道它不是合法的。

如果您的输入始终是这样的格式,那么您可以使用此单一语句来获取偶数索引中左侧部分右侧部分奇数索引(0: line1-left ,1: line1-right ,2: line2-left ,3 : line2-right ,4: line3-left ...),因此您将获得两倍于行数的数组。

String[] parts = str.split("\\|\\d+\\||\\n+");

答案 3 :(得分:0)

我同意你应该使用split的其他答案,但我提供了一个使用Pattern.split的答案,因为它使用正则表达式。

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.Pattern;

/* Name of the class has to be "Main" only if the class is public. */
class MatchExample
{
    public static void main (String[] args) {
        String[] data = {
            "cats|1|short hair and long hair",
            "cats|2|black, blue",
            "dogs|1|cats are better than dogs"
        };
        Pattern p = Pattern.compile("\\|\\d+\\|");
        for(String line: data){

            String[] elements = p.split(line);
            System.out.println(elements[0] + " // " + elements[1]);

        }
    }
}

请注意,模式将匹配两个|之间的一个或多个数字。我看到你在分组中做了什么。

答案 4 :(得分:0)

不需要复杂的正则表达式模式,您可以使用字符串的拆分方法(here)简单地拆分由demiliter 标记创建的字符串Java的。

工作示例

>> foo = "[0,5,3,2,20,10] - a"
=> "[0,5,3,2,20,10] - a"
>> a = eval foo
=> []
>>