1

我有这个字符串:

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”类似的描述,在这种情况下是“INCOME REINVEST”,“INCOME REINVEST”“INCOME REINVEST”

数组中的数量恰好是:“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

4 回答 4

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
于 2013-11-12T11:15:44.033 回答
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]
于 2013-11-12T15:10:59.133 回答
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
}

演示

正则表达式细分:

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

([\\w ]+)- 描述 - 1+ 单词字符和空格。

(\\d+(\\.\\d+)?)(使用 4 次) - 金额、价格、费用、份额 - 1+ 数字可能后跟一个.和至少 1 个数字。

(\\d+(,\\d{3})*(\\.\\d+)?),- 1+ 个数字,后面可能是 a和 3 个数字的序列,后面可能是一个.和至少 1 个数字。

于 2013-11-12T11:08:10.330 回答
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);
}

输出:

2013 年 4 月 30 日
24.66
12.34
1.998


.+?\\$: non-greedy 以确保我们不采取'$'--basically 跳过所有内容,直到'$'
((?:(?:\\d+|\\d+,\\d+)\\.\\d+\\s\\$?){3}使用捕获组来获取三个感兴趣的数字,但使用其中一个,'$'通过.replace() You can do this with .replace(),但表达式会相当长。
(?:\\d+|\\d+,\\d+)表示“分组,但不捕获”一个数字或 #,#
\\.\\d+\\s\\$?表示 a'.'后跟一个 #,后跟空格和一个可选'$'

这是关于正则表达式的一般教程。这是关于捕获组的部分。
祝你好运!

于 2013-11-12T11:12:20.587 回答