我有这个字符串:
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是我想要匹配的字符串,即我在第一个块中解释的表。
我不需要$符号,所以我们可以将数字存储在整数数组中。我认为我们必须确定某种空间和美元的模式才能做到这一点。
任何帮助将不胜感激
答案 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
}
正则表达式细分:
([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]