正则表达式匹配一个数字后跟一个点(“。”)

时间:2017-08-07 09:48:55

标签: java regex eclipse

我有一个字符串

  

string 1 (不包括引号) - > “我的车号是# 8746253 ,实际上很酷”

条件 - 编号8746253,可以是任何长度和
            - 号码也可以紧跟一个行尾。

我想分组 8746253 ,后面不应该跟一个点“。” 我试过了,

  

*#(\ d +)[^。]。*

这肯定会得到我的数字,但即使有一个点也会匹配,因为[。^]会匹配数字的最后一位数(例如, 3 以下情况)

  

string 2 (不包括引号) - > “地球是# 8746253.Kms ,这是非常远的”

我想仅匹配 字符串1 类型,而不是 字符串2 类型。

2 个答案:

答案 0 :(得分:5)

要匹配#之后未跟上点的任意位数,请使用

(?<=#)\d++(?!\.)

++是一个占有量词,它会使正则表达式引擎仅在最后一个匹配的数字后检查前瞻(?!\.),如果之后有一个点,则不会回溯。因此,如果数字块中的最后一位数后面有一个dit,则整个匹配将失败。

请参阅regex demo

匹配整行并将数字放入捕获组#1:

.*#(\d++)(?!\.).*

this regex demo。或者没有前瞻的版本:

^.*#(\d++)(?:[^.\r\n].*)?$

another demo。在最后一个版本中,数字块后面只能跟一个可选序列的char不是.,CR和LF后跟除了换行符之外的任何0+字符((?:[^.\r\n].*)?)然后是字符串结尾($)。

答案 1 :(得分:1)

这就像你描述的那样

public class MyRegex{   
    public static void main(String[] args) {
        Pattern patern = Pattern.compile("#(\\d++)[^\\.]");
        Matcher matcher1 = patern.matcher("my car number is #8746253 which is actually cool");
        if(matcher1.find()){
            System.out.println(matcher1.group(1));
        }
        Matcher matcher2 = patern.matcher("earth is #8746253.Kms away, which is very far");
        if(matcher2.find()){
            System.out.println(matcher1.group(1));
        }else{
            System.out.println("No match found");
        }
    }
}

输出:

> 8746253 
> No match found