Java中需要正则表达式

Java中需要正则表达式,java,regex,Java,Regex,我有一个行项目叫做 付款-谢谢-50.00美元 我想将此值拆分为 付款-谢谢你的钥匙 和价值作为 -50美元 我写正则表达式如下 Pattern.compile("([a-zA-Z \\-? a-zA-Z]+)(-?\\$[0-9|,]*\\.[0-9][0-9])"); 但是我得到了钥匙作为付款-谢谢-价值50.00美元 谁能帮我一下正则表达式出了什么问题吗?为什么会这样,是因为第一个块有一个贪婪的正则表达式。第一组捕获-,仅仅是因为它被允许 解决这个问题的一件事是删除-之后的?,强制-位于

我有一个行项目叫做

付款-谢谢-50.00美元

我想将此值拆分为

付款-谢谢你的钥匙

和价值作为

-50美元

我写正则表达式如下

Pattern.compile("([a-zA-Z \\-? a-zA-Z]+)(-?\\$[0-9|,]*\\.[0-9][0-9])");
但是我得到了钥匙作为付款-谢谢-价值50.00美元
谁能帮我一下正则表达式出了什么问题吗?为什么会这样,是因为第一个块有一个贪婪的正则表达式。第一组捕获
-
,仅仅是因为它被允许

解决这个问题的一件事是删除
-
之后的
,强制
-
位于第二个正则表达式中

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


考虑到
首先存在的事实,我怀疑
-
是可选的

要使第一组非贪婪,您可以在
+

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

我不确定您想用模式中的
\\-?
部分实现什么,但这应该是可行的:

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

除非另有规定,否则在可能的情况下,数据倾向于放在前面的字段中

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

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

"([a-zA-Z -]+)(-?\\$[0-9|,]*\\.[0-9][0-9])"
您的正则表达式正在捕获第一个字符组中的-。请尝试下一个:

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
以及:


更好地解释你在做什么。如果你的线路总是一样的,只需在已知索引处拆分即可。您在
you-
中匹配
-
的原因与在
支付-感谢
之间匹配
-
的原因相同,这是因为您在第一个字符集中说过要匹配
-
。描述各不相同,但将通过-So子字符串删除使用(-)是否有任何理由不简单地在“付款-谢谢”上分开。而完全跳过注册码?