2013-07-01 44 views
2

我有以下值的字符串:正则表达式来处理动态字符串值

应付总额-STATEMENT $ 240.05911费用$ 10.00FRANCHISE税$ .172VSALES TAX $ .53LOCAL-TAX $ .23SERVICE DISCOUNT- $ 50.00支付 - 谢谢 - $ 100.00HBO + STARLET $ 100.00

我需要将此字符串分割为键/值对。

TOTAL DUE-STATEMENT $240.05 
911 Fee $10.00 
FRANCHISE TAX $.17 
2VSALES TAX $.53 
LOCAL-TAX $.23 
SERVICE DISCOUNT -$50.00 
PAYMENT - THANK YOU -$100.00 
HBO+STARLET $100.00 

我的字符串值,将永远充满活力和描述是动态的,除了911 Fee 我写了一个正则表达式如下。

([911 a-zA-Z |911 a-zA-Z|a-zA-Z |a-zA-Z \\-? a-zA-Z|! ?|+? ]+)(-?\\$[0-9|,]*\\.[0-9][0-9]) 

我正确得到键/值对,除了描述包含数字和字母以及特殊字符。我的输出如下:

TOTAL DUE-STATEMENT $240.05 
911 Fee $10.00 
FRANCHISE TAX $.17 
SALES TAX $.53 ** Which is wrong**(Expected is 2VSALES TAX as key) 
LOCAL-TAX $.23 
SERVICE DISCOUNT -$50.00 
PAYMENT - THANK YOU- $100.00 "-" is coming as key (Expected is PAYMENT - THANK YOU) 
STARLET $100.00 **- Which is wrong** (Expected is HBO+STARLET) 

有人可以帮助我,我需要改变这个正则表达式吗?

+0

这是一个很好的问题。它有一个明确的目标,示例文本涵盖了请求者可以找到的所有边缘案例,期望的输出以及我的+1投票。 –

回答

0

考虑到总有两位小数

你的正则表达式可以简化为

.+?[$]\d*[.]\d{2} 

您需要比赛与上述正则表达式模式不拆

Matcher m =Pattern.compile(regex).matcher(input); 
while(m.find()) 
{ 
m.group(); 
} 
+0

您会错过有时出现在$之前的负号。 – dda

+0

@dda **否** ..它不会... – Anirudha

+0

@dda此RegEx将匹配OP要分离的行。唯一的问题是OP在'$'之前有希望的输出包含空格,这是不容易的。 –

2

例子: http://regexr.com?35dsq

使用此正则表达式

/([-]{0,1}\$\d*\.\d\d)/g 

它发现一个$后跟任意数量的数字,则.然后2位数字。

然后在你更换使用

\1\n 
+0

您会错过有时出现在$之前的负号。 – dda

+0

@dda谢谢你。现在应该修复。 –

+1

为什么投票反对?在这个例子中,输入与预期的输出完全匹配。 –

-1

这应做到:

^(.+) (-?\$\d*\.\d\d)$ 

正则表达式下半年的美元金额,包括可选的匹配 - 的迹象。第一部分除了分隔空间以外的所有其他部分。

+0

哎呀..你正在使用'^','$'..这会工作吗? – Anirudha

+0

适用于由OP提供的文本 - 单独的行。 – dda

+0

nup .. it won; t work – Anirudha

0

当你的价格格式是已知的,搜索它,以及之间的一切就是描述:

String in = "TOTAL DUE-STATEMENT$240.05911 Fee$10.00FRANCHISE TAX$.172VSALES TAX$.53LOCAL-TAX$.23SERVICE DISCOUNT-$50.00PAYMENT - THANK YOU-$100.00HBO+STARLET$100.00"; 
    Pattern price = Pattern.compile("-?\\$\\d*\\.\\d{2}"); 
    Matcher matcher = price.matcher(in); 
    int offset = 0; 
    while (matcher.find(offset)) { 
     String description = in.substring(offset, matcher.start()); 
     String value = matcher.group(); 
     System.out.println(description + " " + value); 
     offset = matcher.end(); 
    } 
0
class Main { 
    public static void main(String[] args) { 
     String test = "TOTAL DUE-STATEMENT$240.05911 Fee$10.00FRANCHISE TAX$.172VSALES TAX$.53LOCAL-TAX$.23SERVICE DISCOUNT-$50.00PAYMENT - THANK YOU-$100.00HBO+STARLET$100.00"; 
     java.util.regex.Pattern p = java.util.regex.Pattern.compile("(?<KEY>.+?(?=-?\\$[\\d,]*\\.\\d{2}))(?<VAL>-?\\$[\\d,]*\\.\\d{2})"); 
     java.util.regex.Matcher m = p.matcher(test); 
     while(m.find()) { 
      System.out.println(m.group("KEY") + " : " + m.group("VAL")); 
     } 
    } 
} 

你只需要为重点的非贪婪匹配+?然后向前看VALUE,总是以点为单位结束,并以美分为2位。

1

说明

这个正则表达式解决方案假定钱列有时有-的前缀,但始终包含$后跟零个或多个数字,一个点,正好2位。其余的字符是名字的一部分。

([^$]*?)(-?\$\d*\.\d{2})

enter image description here

每个捕捉组1将具有名称,和捕获组2将具有货币价值。

例子:

工作例如:http://www.rubular.com/r/9ODCQXyFoZ

示例文字

TOTAL DUE-STATEMENT$240.05911 Fee$10.00FRANCHISE TAX$.172VSALES TAX$.53LOCAL-TAX$.23SERVICE DISCOUNT-$50.00PAYMENT - THANK YOU-$100.00HBO+STARLET$100.00 

Java代码的

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 
class Module1{ 
    public static void main(String[] asd){ 
    String sourcestring = "source string to match with pattern"; 
    Pattern re = Pattern.compile("([^$]*?)(-?\\$\\d*\\.\\d{2})",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
    Matcher m = re.matcher(sourcestring); 
    int mIdx = 0; 
    while (m.find()){ 
     for(int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++){ 
     System.out.println("[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx)); 
     } 
     mIdx++; 
    } 
    } 
} 

捕获组

$matches Array: 
(
    [0] => Array 
     (
      [0] => TOTAL DUE-STATEMENT$240.05 
      [1] => 911 Fee$10.00 
      [2] => FRANCHISE TAX$.17 
      [3] => 2VSALES TAX$.53 
      [4] => LOCAL-TAX$.23 
      [5] => SERVICE DISCOUNT-$50.00 
      [6] => PAYMENT - THANK YOU-$100.00 
      [7] => HBO+STARLET$100.00 
     ) 

    [1] => Array 
     (
      [0] => TOTAL DUE-STATEMENT 
      [1] => 911 Fee 
      [2] => FRANCHISE TAX 
      [3] => 2VSALES TAX 
      [4] => LOCAL-TAX 
      [5] => SERVICE DISCOUNT 
      [6] => PAYMENT - THANK YOU 
      [7] => HBO+STARLET 
     ) 

    [2] => Array 
     (
      [0] => $240.05 
      [1] => $10.00 
      [2] => $.17 
      [3] => $.53 
      [4] => $.23 
      [5] => -$50.00 
      [6] => -$100.00 
      [7] => $100.00 
     ) 

) 
相关问题