2013-06-28 141 views
-1

我有一个行项目称为正则表达式所需的正则表达式

付款 - 谢谢 - $ 50.00。

我想这个值作为分裂

付款 - 谢谢你为关键

和值

- $ 50,00。

我写的正则表达式如下

Pattern.compile("([a-zA-Z \\-? a-zA-Z]+)(-?\\$[0-9|,]*\\.[0-9][0-9])"); 

,但我拿到钥匙作为支付 - 谢谢你 - 和价值至$ 50 可以在任何一个请帮助我什么是错的正则表达式

+1

更好地解释自己在做什么。如果你的线路总是相同的,只需分割已知的索引。 –

+0

您在'YOU-'中匹配'-'的原因与您在'PAYMENT - THANK'之间匹配'-''的原因相同,因为您已经说过匹配第一个字符集中的'-'。 – Aiias

+0

描述变化alwyas,但它将被隔离 - – user2394281

回答

7

你得到这个的原因是因为第一个块有一个贪婪的正则表达式。第一组捕获-只是因为它被允许。

一两件事,将修复它是-后删除?,迫使-是在第二个正则表达式

Pattern.compile("([a-zA-Z \\-? a-zA-Z]+)(-\\$[0-9|,]*\\.[0-9][0-9])"); 

http://rubular.com/r/MDHPux502R


考虑的事实?是首先,我怀疑-是可选的,

使第一批非贪婪可以将+

Pattern.compile("([a-zA-Z \\-? a-zA-Z]+)(-?\\$[0-9|,]*\\.[0-9][0-9])"); 

http://rubular.com/r/In9M650QcB

0

我不知道你想在你的模式\\-?部分完成什么后添加?,但这应该工作:

Pattern.compile("([a-zA-Z -]*[a-zA-Z ])(-?\\$[0-9|,]*\\.[0-9][0-9])"); 
0

除非另有规定,在可能的情况下,数据往往会进入早期的领域。

你需要做的是指定的第一个字段的最后一个字符可能不是一个破折号:

Pattern.compile("([a-zA-Z -? a-zA-Z]+[^-])(-?\\$[0-9|,]*\\.[0-9][0-9])"); 
0

试试这个:

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

你的正则表达式是捕捉 - 中第一个字符组。

0

尝试了下:

public static void main(String[] args) { 
    Pattern pattern = Pattern.compile("([\\S ]*[^-])(-?\\$[\\d,]*\\.\\d{2}).*"); 

    String line = "PAYMENT - THANK YOU-$50.00."; 

    Matcher matcher = pattern.matcher(line); 
    String key = matcher.replaceAll("$1"); 
    String value = matcher.replaceAll("$2"); 

    System.out.println(key); 
    System.out.println(value); 
} 

输出:

PAYMENT - THANK YOU 
-$50.00 

和:

enter image description here