我有一个看起来像"A = 1.23; B = 2.345; C = 3.567"的字符串
我只对"C = 3.567"感兴趣
到目前为止我所拥有的是:
Matcher m = Pattern.compile("C=\\d+.\\d+").matcher("A=1.23;B=2.345;C=3.567");
while(m.find()){
double d = Double.parseDouble(m.group());
System.out.println(d);
}
Run Code Online (Sandbox Code Playgroud)
问题是它显示3与567分开
输出:
3.0
567.0
我想知道如何包含小数,所以它输出"3.567"
编辑:我还想匹配C,如果它没有小数点:所以我想捕获3567以及3.567
因为C =也被内置到模式中,如何在解析双精度之前将其删除?
Bri*_*ian 36
我可能在这一部分上错了,但是它将两者分开的原因是因为group()只匹配最后匹配的子序列,这是每次调用find()所匹配的任何子序列. 谢谢Mark Heers.
但是,您可以通过将所需的整个部分放在"捕获组"中来解决此问题,这可以通过将其放在括号中来完成.这使得您可以将正则表达式的匹配部分组合到一个子字符串中.您的模式将如下所示:
Pattern.compile("C=(\\d+\\.\\d+)")
Run Code Online (Sandbox Code Playgroud)
对于解析3567或3.567,您的模式将 C=(\\d+(\\.\\d+)?) 与组1表示整数.另外,请注意,由于您特别想要匹配句点,因此您希望转义.(句点)字符,以使其不被解释为"任意字符"标记.但是,对于这个输入,没关系
那么,要获得3.567,你会打电话给m.group(1)抓取第一个(从1开始)指定组.这意味着您的Double.parseDouble调用基本上会成为Double.parseDouble("3.567")
至于从你的模式中取出C =,因为我不熟悉RegExp,我可能会建议你在分号上拆分你的输入字符串,然后检查每个分裂是否包含C; 然后你可以应用模式(使用捕获组)从你的匹配器获得3.567.
编辑对于gawi评论中更一般(也可能更有用!)的案例,请使用以下内容(来自http://www.regular-expressions.info/floatingpoint.html)
Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?")
Run Code Online (Sandbox Code Playgroud)
这支持可选符号,可选整数或可选小数部分,以及可选的正/负指数.在需要的位置插入捕获组以单独挑选部件.作为一个整体的指数在它自己的组中,使它作为一个整体是可选的.
您的正则表达式仅匹配数字字符.要同样匹配小数点,您还需要:
Pattern.compile("\\d+\\.\\d+")
Run Code Online (Sandbox Code Playgroud)
将.被转义,因为当非转义这将匹配任何字符.
注意:这将只匹配带小数点的数字,这是您的示例中的小数点.
| 归档时间: |
|
| 查看次数: |
50939 次 |
| 最近记录: |