Java 正则表达式-在不同字符串中提取

Java 正则表达式-在不同字符串中提取,java,regex,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 我想提取

我有这个字符串:

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”

我不需要对应于1008.369、1010.250和1012.141的最后一部分“Owned”

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

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]
}
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=新字符串[]{m.group()};
对于(int count=0;count

正则表达式细分:

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

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

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

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);
}
(\\d+(,\\d{3})*(\\.\\d+)
-1+个数字,后面可能是一个
和3个数字的序列,后面可能是一个
和至少一个以上的数字

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


+?\\$
:非贪婪以确保我们不会接受
“$”
——基本上跳过所有内容,直到
“$”

((?:(?:\\d+\\\d+,\\d+\\\.\\d+\\s\\$?){3}
使用捕获组获取感兴趣的三个数字,但是使用
“$”中的一个可以通过
.replace()
删除,您可以使用
.replace()
执行此操作,但表达式将相当长。
(?:\\d+\\d+,\\d+)
表示“分组,但不要捕获”数字或#,#
\\.\\d+\\s\\$?
表示一个
'。
后跟一个#,后跟空格和一个可选的
'$'


这里是关于的一般教程。这里是关于的部分。
祝您好运!

这应该与您需要的零件相匹配:

(\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

这将为您提供所需的内容,并且它还将在您的输入字符串上运行任意数量的类似记录

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());    
}
}

不,我对正则表达式不太适应。不太喜欢分组。所以如果你能告诉你每个值的位置,那就太好了。现在你可以把每个m.group(x)放在相关数组中的值。这不适用于逗号,也会捕获各种数字中的垃圾,而不是实际价格。我试图尽可能多地给出解释。希望能有所帮助。祝你好运!这看起来不错,但这不会打印出我的日期。为什么?也不会打印说明。2013年4月30日收入再投资24.66 12.34 1.998我怎样才能得到这些?我用一个空格隔开,以便进一步处理阵列。谢谢:)@rahul888抱歉,我不知道你也想要打印日期。修复!
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]