正则表达式将字符串分成3部分

时间:2012-12-19 17:46:52

标签: java regex matcher

我有一个动态输入信息的示例,如下所示:

  

Xbox 360(黑色)精英控制台120GB(伊利诺伊州梅森城)200美元

     

$ 200 2013 North Trail Camper(RT 202.曼彻斯特,缅因州)$ 224 /月。

     

Snowmobile自行车拖车(Winthrop / Augusta)每月40美元

     

“伟大的圣诞礼物”XBox 360吉他英雄(Springfied)

我正在尝试在Android中使用Regex将字符串分成三部分:

  1. XXX()
  2. 之前的文字
  3. (XXX)中的文字
  4. 文字后()XXX
  5. 有时会出现价格,即()中位置之后的文字。

    我试过

    Pattern p = Pattern.compile("\(([^]*)\)");
    Matcher m = p.matcher(title);
    

    但我不能让匹配器在Android中工作。当我查看matcher.group(1)时,它总是返回空白。我现在设置它以寻找(或$和爆炸也给我单独的字符串。但这是不准确和低效。

    任何帮助都得到了帮助!

4 个答案:

答案 0 :(得分:4)

我怀疑你可以用正则表达式做到这一点,但不要这样做可能更简单。

    String input[] = {
            "Xbox 360 (black) Elite Console 120GB (Mason City Illinois ) $200",
            "$200 2013 North Trail Camper (RT 202. Manchester, Maine) $224/mo.",
            "Snowmobile Bike trailers (Winthrop / Augusta) $40 Monthly",
            "\"Great Xmas Gift\" XBox 360 Guitar Hero (Springfied)"
    };
    for (String s : input) {
        int lastClose = s.lastIndexOf(')');
        int lastOpen = s.lastIndexOf('(', lastClose);
        System.out.println(s.substring(0, lastOpen).trim() +
                "~" + s.substring(lastOpen + 1, lastClose).trim() +
                "~" + s.substring(lastClose + 1).trim());
    }

打印

Xbox 360 (black) Elite Console 120GB~Mason City Illinois~$200
$200 2013 North Trail Camper~RT 202. Manchester, Maine~$224/mo.
Snowmobile Bike trailers~Winthrop / Augusta~$40 Monthly
"Great Xmas Gift" XBox 360 Guitar Hero~Springfied~

答案 1 :(得分:1)

不确定是否需要使用正则表达式,但如果不这样做,为什么不使用String.split。然后,您可以使用"\\(|\\)"将字符串拆分为括号,然后从创建的字符串数组中获取各个部分。

答案 2 :(得分:1)

[编辑] 我不会为这个问题使用正则表达式;相反,我只是使用String#lastIndexOf(...)方法查找最后()个字符的边界,并从这些值返回子字符串:

public static String[] splitParens(String s) { 
  if (s == null) return null;
  int indexOfLastOpenParen = s.lastIndexOf('(');
  int indexOfLastCloseParen = s.lastIndexOf(')');
  return new String[] { 
    s.substring(0, indexOfLastOpenParen),
    s.substring(indexOfLastOpenParen + 1, indexOfLastCloseParen),
    s.substring(indexOfLastCloseParen + 1)
  };
} 
public static void main(String args[]) throws Exception { 
  String input[] = { 
    "Xbox 360 (black) Elite Console 120GB (Mason City Illinois ) $200",
    "$200 2013 North Trail Camper (RT 202. Manchester, Maine) $224/mo.",
    "Snowmobile Bike trailers (Winthrop / Augusta) $40 Monthly",
    "\"Great Xmas Gift\" XBox 360 Guitar Hero (Springfied)"
  };
  Pattern p = Pattern.compile("\\(([^\\)]+)\\)");
  for (String s : input) { 
    System.out.println(Arrays.asList(splitParens(s)));
  }
  // =>
  // [Xbox 360 (black) Elite Console 120GB , Mason City Illinois ,  $200]
  // [$200 2013 North Trail Camper , RT 202. Manchester, Maine,  $224/mo.]
  // [Snowmobile Bike trailers , Winthrop / Augusta,  $40 Monthly]
  // ["Great Xmas Gift" XBox 360 Guitar Hero , Springfied, ]
}

当然,需要进行更多错误检查(例如,如果没有()会怎样?)。

答案 3 :(得分:0)

如果您确定总会有3个组,则此表达式将起作用:

(。*)\((。*)\)(。*)

你可以在这里自己尝试一下:

http://www.regexplanet.com/cookbook/ahJzfnJlZ2V4cGxhbmV0LWhyZHNyDgsSBlJlY2lwZRiU8y0M/index.html