regex-以不同的字符串提取

时间:2013-11-12 10:39:55

标签: java regex

我有这个字符串:

Date Description Amount Price Charge Shares Owned
04/30/13 INCOME REINVEST 0.0245 $24.66 $12.34 1.998 1,008.369
05/31/13 INCOME REINVEST 0.0228 $22.99 $12.22 1.881 1,010.250
06/28/13 INCOME REINVEST 0.0224 $22.63 $11.97 1.891 1,012.141

我想提取一个字符串中的日期说“matchedDate”类似的描述,在这种情况下是“收入重新开始”,“收入重新开始”“收入重新开始”

数组中的金额恰好是:“0.0245”,“0.0228”,“0.0224”

数组中的价格:“24.66”,“22.99”,“22.63”

在阵列中充电:“12.34”,“12.22”,“11.97”

阵列中的股票:“1.998”,“1.881”,“1.891”

我不需要最后一部分“拥有”,对应于1,008.369,1,010.250和1,012.141

到目前为止,我能够通过以下方式成功提取日期:

String regex="[0-9]{2}/[0-9]{2}/[0-9]{2}";
Pattern dateMatch = Pattern.compile(regex);
Matcher m = dateMatch.matcher(regString);
while (m.find()) {
String[] matchedDate=new String[] {m.group()};
for(int count=0;count<matchedDate.length;count++){
sysout(matchedDate[count]
}

regString是我想要匹配的字符串,即我在第一个块中解释的表。

我不需要$符号,所以我们可以将数字存储在整数数组中。我认为我们必须确定某种空间和美元的模式才能做到这一点。

任何帮助将不胜感激

4 个答案:

答案 0 :(得分:0)

String regString = "04/30/13 INCOME REINVEST 0.0245 $24.66 $12.34 1.998 1,008.36";
String regex="([0-9]{2}/[0-9]{2}/[0-9]{2})\\s*([\\w ]+)\\s*(\\d+(\\.\\d+)?)\\s*\\$(\\d+(\\.\\d+)?)\\s*\\$(\\d+(\\.\\d+)?)\\s*(\\d+(\\.\\d+)?)\\s*(\\d+(,\\d{3})*(\\.\\d+)?)";
Pattern match = Pattern.compile(regex);

Matcher m = match.matcher(regString);
while (m.find()) {
        System.out.println(m.group(1)); //04/30/13
        System.out.println(m.group(2)); //INCOME REINVEST
        System.out.println(m.group(3)); //0.0245
        System.out.println(m.group(5)); //24.66
        System.out.println(m.group(7)); //12.34
        System.out.println(m.group(9)); //1.998
        System.out.println(m.group(11)); //1,008.86
}

Demo

正则表达式细分:

([0-9]{2}/[0-9]{2}/[0-9]{2}) - 您的日期正则表达式。

([\\w ]+) - 说明 - 1个字符和空格。

(\\d+(\\.\\d+)?)(使用4次) - 金额,价格,费用,股票 - 1+号码可能后跟.且至少还有1个号码。

(\\d+(,\\d{3})*(\\.\\d+)?) - 1+号码,可能是,和3个号码的序列,其后可能是.和至少1个号码。

答案 1 :(得分:0)

String r = "([0-9]{2}/[0-9]{2}/[0-9]{2}).+?\\$((?:(?:\\d+|\\d+,\\d+)\\.\\d+\\s\\$?){3})";
String list = "04/30/13 INCOME REINVEST 0.0245 $24.66 $12.34 1.998 1,008.369"; 

Matcher m = Pattern.compile(r).matcher(list);

while (m.find()) 
{
    String myData = m.group(1) + " " + m.group(2).replace("$", "");
    String[] data = myData.split(" ");

    for(String s : data)
        System.out.println(s);
}

输出:

  

13年4月30日
  24.66
  12.34
  1.998


.+?\\$:非贪婪,以确保我们不接受'$' - 基本上跳过所有内容,直到'$'
((?:(?:\\d+|\\d+,\\d+)\\.\\d+\\s\\$?){3}使用捕获组来获取感兴趣的三个数字,但使用'$'之一,通过.replace()删除您可以使用.replace()执行此操作,但是表达会很长。
(?:\\d+|\\d+,\\d+)说“分组,但不要捕获”数字或#,#
\\.\\d+\\s\\$?表示'.'后跟#,后跟空格和可选'$'

以下是Regular Expressions的一般教程。这是关于capturing groups的部分。祝你好运!

答案 2 :(得分:0)

这应符合您需要的部分:

(\d{1,2}/\d{1,2}/\d{1,2}).+?([\d.]+)\s\$(\S+)\s\$(\S+)\s(\S+)

说明:

(\d{1,2}/\d{1,2}/\d{1,2}) - capture date
.+? - match anything up to next number
([\d.]+)\s - capture Amount but match space following it
$(\S+)\s - capture Price but match space following it
$(\S+)\s - capture Charge but match space following it
(\S+) - capture Shares

答案 3 :(得分:0)

这应该可以为您提供所需的内容,并且还可以为输入字符串中的任意数量的类似记录运行...

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

public class Test {

private static Pattern PATTERN = Pattern.compile("([0-9]{2}/[0-9]{2}/[0-9]{2})\\s+([a-zA-Z]+\\s[a-zA-Z]+)\\s+(\\d{1}\\.\\d{0,4})\\s+\\$(\\d{1,2}\\.\\d{0,2})\\s+\\$(\\d{1,2}\\.\\d{0,2})\\s+(\\d{1,2}\\.\\d{0,3})\\s+");

public static void main(String a[] ) {      

  String regString = "04/30/13 INCOME REINVEST 0.0245 $24.66 $12.34 1.998 1,008.369 " +
        "05/31/13 INCOME REINVEST 0.0228 $22.99 $12.22 1.881 1,010.250 " +
        "06/28/13 INCOME REINVEST 0.0224 $22.63 $11.97 1.891 1,012.141 ";

  ArrayList<String> date = new ArrayList<String>();
  ArrayList<String> desc = new ArrayList<String>();
  ArrayList<String> amt = new ArrayList<String>();
  ArrayList<String> price = new ArrayList<String>();
  ArrayList<String> charge = new ArrayList<String>();
  ArrayList<String> share = new ArrayList<String>();

  Matcher m = PATTERN.matcher(regString);     
  while(m.find()) {
      date.add(m.group(1));
      desc.add(m.group(2));
      amt.add(m.group(3));
      price.add(m.group(4));
      charge.add(m.group(5));
      share.add(m.group(6));    
  }

  System.out.println("DATE : " + date.toString());
  System.out.println("DESC : " + desc.toString());
  System.out.println("AMOUNT : " + amt.toString());
  System.out.println("PRICE : " + price.toString());
  System.out.println("CHARGE : " + charge.toString());
  System.out.println("SHARES : " + share.toString());    
}
}

以上程序的输出如下,

DATE : [04/30/13, 05/31/13, 06/28/13]
DESC : [INCOME REINVEST, INCOME REINVEST, INCOME REINVEST]
AMOUNT : [0.0245, 0.0228, 0.0224]
PRICE : [24.66, 22.99, 22.63]
CHARGE : [12.34, 12.22, 11.97]
SHARES : [1.998, 1.881, 1.891]