正则表达式中'?'和'*'的区别

5
我正在学习正则表达式,并计划在lex程序中使用它们。我在这里看到:这里,在正则表达式中:
'*'匹配模式的0个或多个出现
'?' 匹配模式的0个或1个出现
因此,我有些困惑:
  • 如果我们可以通过'*'匹配0个或多个,那么为什么要使用'?'元字符?
  • 我们将浮点数定义为:FL [0-9]*"。"[0-9]+
  • 我们是否可以将其定义为:FL [0-9]?"。"[0-9]+ 以匹配类似于0.999或.999等(即,在小数点之前只有一位数字的数字)?
  • 请问有谁能解释一下吗?谢谢!
    1个回答

    10

    如果您想匹配0、1、2、3、4、5、6或更多次出现,请使用*

    如果您 只想 匹配0或1次出现,请使用?

    例如,考虑这个文本:"________以空格开头"

    如果我想匹配该文本开头的所有下划线,但不想要求它们必须在那里(它们是可选的),我将使用_*

    相反,如果我想在(比如)"+44 20 1234 5678"中仅匹配一个可选的单个+,我会使用\+?(字面意义上的+后跟?)。这只会匹配单个+或什么都不匹配,而不会匹配多个+字符。


    感谢您的快速回复。FL [0-9]?"。"[0-9]+ 可以用于查找浮点数吗? - Vedant Terkar
    1
    @VedantTerkar:我不知道你使用的正则表达式方言,所以那些引号对我来说看起来很奇怪。但这可能是不正确的,因为如果我读得正确,它将不会匹配23.5,因为你只允许在.之前有一个单独的数字。所以你可能想要在那里使用*而不是?,这样你就可以匹配.之前的任意数量的数字。 - T.J. Crowder
    我在Windows 7上使用Flex和DevCPP,FL [0-9]*"."[0-9]+ 对我有效。但是,如果我只想接受 . 前面的一个数字,就像你说的那样。那么,FL [0-9]?"."[0-9]+ 可以解决这个问题吗? - Vedant Terkar
    @VedantTerkar: 正确,[0-9]? 意味着“零个或一个数字,但不是两个或更多”。 [0-9]* 意味着“零个或多个数字(没有限制,可能有42个)”。请注意,某些语言要求如果数字在0和1之间,则浮点数必须在.之前带有前导00.5而不是.5),而其他语言则不需要。我不知道您要验证哪种类型的数字。 - T.J. Crowder

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