匹配不跟随小数点(".")的数字的正则表达式

9

我有一个字符串

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

条件-数字8746253的长度可能是任意的
- 数字后面也可以紧跟着行末结束符。

我想要匹配出不跟在句点“.”后面的8746253
我已经尝试了以下方法:

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

这种方式确实可以得到我想要的数字,但是如果有句点“.”,它仍然会匹配,因为[.^]将匹配数字的最后一位(例如,在以下示例中的3

字符串2(不包括引号) ->“地球距离#8746253.Kms,非常遥远”

我只想匹配与字符串1类型相匹配的字符串,而不是字符串2类型的字符串。


你需要匹配整行还是只有数字?你的模式中有 .* ,所以有点不清楚。 - Wiktor Stribiżew
然后,我想只分组出数字。 - manoj
1
好的,当我阅读你的问题时,我添加了所有可能出现在我的脑海中的解决方案。 - Wiktor Stribiżew
明显且兼容的修复:#(\d+)(?:[^.\d]|$) - bobble bubble
2个回答

6
为了匹配 # 后面任意数量的不跟着句点的数字,请使用
(?<=#)\d++(?!\.)
++是一种具有所有权的量词,它使正则表达式引擎仅在最后匹配的数字之后检查前瞻(?!\.),并且如果在数字块的最后一个数字之后有句点,则不会回溯。 因此,如果数字块中的最后一个数字之后有句点,则整个匹配将失败。
请参见正则表达式演示 要匹配整行并将数字放入捕获组#1:
.*#(\d++)(?!\.).*

请查看此正则表达式演示,或者不使用前瞻符号的版本:

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

请查看另一个演示。在这个最新版本中,数字块只能后跟一个可选序列,该序列由一个不是.、CR和LF的字符组成,后跟0个或多个除换行符以外的任何字符((?:[^.\r\n].*)?),然后是字符串的结尾($)。


1
像往常一样,您的解决方案完美无缺。我有一个问题@Wiktor Stribiżew,\d++是什么意思?为什么要用双加号,一个加号不够吗? - Youcef LAIDANI
2
@YCF_L:++ 是一种“贪婪”量词,当数字后面有点时,它会阻止正则表达式引擎重新匹配 \d+ 模式。使用 \d+(?!\.) 匹配 123. 时,数字 3 将无法匹配成功,但正则表达式引擎知道仍可以重试 \d+ 模式以查找不以 . 结尾的数字序列,并且它找到了 12(因为 3 不是 .)。当使用 ++ 时,正则表达式引擎被禁止这样回溯 - Wiktor Stribiżew
@atiqkhaled 你的意思是 (?<=#) 吗?这是一个正向前瞻,用于检查当前位置左侧是否紧接着一个 # 符号,如果没有则匹配失败。 - Wiktor Stribiżew
++ 'The Thing' :) 对我来说是一个改变游戏规则的东西。谢谢 @WiktorStribiżew - manoj
1
@TornikeShavishvili 有两个很棒的网站:http://regular-expressions.info 和 http://rexegg.com。没有一个地方提供所有正则表达式风格的完整文档,你需要查找每个你感兴趣的正则表达式库的官方文档。 - Wiktor Stribiżew
显示剩余3条评论

1
这句话的意思是“这个功能像你所描述的那样工作”,其中保留了HTML标签。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接