【问题标题】:Difference Between '?' and '*' in regular expressions“?”之间的区别和 '*' 在正则表达式中
【发布时间】:2013-12-17 01:48:03
【问题描述】:

我正在学习正则表达式以在 lex 程序中使用它们。我在正则表达式中看到here

'*' matches 0 or more occurances of pattern
'?' matches 0 or 1 occurance of the pattern

对此我有点困惑。我的意思是:

  • 如果我们可以通过 '*' 匹配 0 个或多个,那么为什么要使用 '?' 元字符?
  • 我们将 Float 定义为:FL [0-9]*"."[0-9]+
  • 我们可以将其定义为:FL [0-9]?"."[0-9]+ 用于 0.999 或 .999 等数字(即,小数点 . 前只有一位数字)?
  • 谁能解释一下?提前谢谢你:)。

    【问题讨论】:

      标签: regex lex flex-lexer


      【解决方案1】:

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

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

      例如,考虑以下文本:"________starts with whitespace"

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

      相比之下,如果我只匹配(比如)"+44 20 1234 5678" 中的可选单个 +,我会使用\+?(文字+?之后)。这只会匹配单个 + 或不匹配,它不会匹配 多个 + 字符。

      【讨论】:

      • 感谢您的快速回复。 FL [0-9]?"."[0-9]+ 会为寻找花车工作吗?
      • @VedantTerkar:我不知道您使用的正则表达式的具体方言,所以这些引号对我来说看起来很奇怪。但这可能不正确,因为如果我没看错,它会 not 匹配 23.5 因为您只允许在 . 之前有一个 单个 数字.所以你可能想要*而不是?,所以你匹配.之前的任意位数。
      • 我在 Windows 7 上使用 flex 和 DevCPP,FL [0-9]*"."[0-9]+ 适合我。但如果我只想接受. 之前的一位数字,就像你说的那样。那么FL [0-9]?"."[0-9]+能解决这个问题吗?
      • @VedantTerkar:对,[0-9]? 的意思是“零或一位,但不是两位或更多”。 [0-9]* 表示“零个或多个数字(没有限制,可以是 42 个)”。请注意,如果数字介于 01 之间(0.5 不是 .5),则某些语言要求在 . 之前使用前导 0 编写浮点数,其他语言不需要,我不不知道您要验证哪种类型。
      猜你喜欢
      • 2012-06-01
      • 2013-09-18
      • 2016-11-18
      • 2012-02-22
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      相关资源
      最近更新 更多