【问题标题】:Building a pattern to extract data out of a string构建模式以从字符串中提取数据
【发布时间】:2012-11-08 09:51:02
【问题描述】:

我有以下形式的字符串:

"abc" 1 2 1 13 
"efgh" 2 5 

基本上,引号中的字符串后跟由空格字符分隔的数字。 我需要从行中提取字符串和数字。

例如,对于第一行,我想要

  • abc 存储在 String 变量中(即不带引号)和
  • 要存储[1,2,1,13]int 数组。

我试图创建一个可以做到这一点的模式,但我有点困惑。

Pattern P = Pattern.compile("\A\".+\"(\s\d+)+");

现在不知道如何进行。我意识到用这种模式我会提取整条线?也许多种模式会有所帮助?

Pattern P1 = Pattern.compile("\A\".+\"");
Pattern P2 = Pattern.compile("(\s\d+)+");

同样,虽然不太确定如何将字符串和整数排除在外。任何帮助表示赞赏!

【问题讨论】:

  • 您确定字符串部分不会包含任何数字条目吗?
  • 你为什么不在空间上分割?
  • 是的,字符串部分不会包含任何数字。
  • 是的,我可以在空间上进行拆分,但是如何去掉引号?
  • 你正在路上。提示:我使用RegexPlanet 来测试我的RegExes

标签: java regex pattern-matching


【解决方案1】:

我宁愿只在空间上拆分字符串,而不是构建复杂的正则表达式,并将其与PatternMatcher 类一起使用。

类似这样的:-

String str = "\"abc\" 1 2 1 13 ";
String[] arrr = str.split("\\s");
System.out.println(Arrays.toString(arrr));

输出:-

["abc", 1, 2, 1, 13]

更清楚地表明您的意图,即您想要做什么。

然后,您可以从字符串数组中获取stringinteger 部分。您需要对整数元素执行Integer.parseInt()


如果您的字符串中可能包含空格,那么在这种情况下,您需要一个Regex。更好的是@m.buettner'sanswer中的那个

【讨论】:

  • 好的。空格分割比构建一个长的正则表达式更有意义。您能否确认我的 Pattern P1 是否适合从引号中提取字符串?
  • @krandiash .. 是的,它适用于您的示例。你试过了吗?
  • 不,我还没有。对正则表达式的事情有点困惑。感谢您的帮助!
  • @krandiash.. 那你可以试试。但恕我直言,Regex 更适合更复杂的匹配而不是这个。如果你真的想学Regex,那就找复杂的问题吧。
  • 请注意,虽然这非常好和简单,但如果您的字符串也可能包含空格,则会导致问题。 (我相信这就是您在上一条评论中所指的,@RohitJain)
【解决方案2】:

使用捕获组一次性获取两个部分,然后在空格处拆分数字。

Pattern pattern = Pattern.compile("\"([^\"]*)\"\\s*([\\d\\s]*)");

Matcher m = pattern .matcher(input);
while (m.find()) {
    String str = m.group(1);
    String[] numbers = m.group(2).split("\\s");
    // process both of them       
}

正则表达式中的每组括号稍后将对应一个group(从左到右计算左括号,从1开始)。

【讨论】:

    【解决方案3】:

    请试试这个,它也会将 String 和 int 分开

            String s = "\"abc\" 1 2 1 13 ";
    
            s = s.replace("\"", "");
            String sarray[] = s.split(" ");
    
            int i[] = new int[10];
            String si[] = new String[10];
            int siflag = 0;
            int iflag = 0;
            for (String st : sarray) {
                try {
                    int ii = Integer.parseInt(st)
                    i[iflag++] = ii;
                } catch (NumberFormatException e) {
                    si[siflag++] = st;
                }
            }
    

    【讨论】:

    • 相当通用的解决方案。但您应该在 try 块中使用int ii = Integer.parseInt(st)
    【解决方案4】:
    StringTokenizer st = new StringTokenizer(str,"\" ");
    String token = null;
    String strComponent = null;
    int num[] = new int[10]; // can change length dynamically by using ArrayList
    int i = 0;
    int numTemp = -1;
    while(st.hasMoreTokens()){
        token = st.nextToken();
    
        try{
            numTemp  = Integer.parseInt(token);
            num[i++] = numTemp ;
        }catch(NumberFormatException nfe){
            strComponent = token.toString();
        }
    

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 2017-09-10
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 2012-06-15
      • 2011-10-08
      • 1970-01-01
      • 2019-05-21
      相关资源
      最近更新 更多