【问题标题】:Why regex [a-z]* does not mach anything in the string `The`?为什么正则表达式 [a-z]* 不匹配字符串 `The` 中的任何内容?
【发布时间】:2016-01-05 22:30:05
【问题描述】:

这似乎是一个基本的东西,但我无法理解它。

字符串:The

为什么正则表达式 [a-z]+ 匹配 he 但正则表达式 [a-z]* 根本不匹配任何内容?我看到它的方式是因为量词* 匹配零次或多次,它应该与前面示例中的+ 相同,即he。为什么量词+ 能够处理大写“T”之后的字符串,而量词* 却不能?

编辑: 关于正则表达式工具,我只是使用了以下在线资源: http://regexr.com/https://regex101.com/

【问题讨论】:

  • 我的猜测:[a-z]* 有两个匹配项:T 之前的空字符串,其余的是 he。你只会看到第一场比赛。
  • @tobias_k 是的,你可以看到T之前的空匹配(用竖线表示)here
  • 在 Java 中,使用 whilematcher.find() 来获取所有匹配项。经验法则是避免使用可能匹配空字符串的未锚定模式。
  • 顺便说一句——[a-z] 是不好的做法;改用[[:lower:]];您在非英语地区的用户(前者可能有问题)会感谢您。

标签: regex


【解决方案1】:

很难从你的问题中得知,但我的猜测是:[a-z]*多个 匹配:T 之前的一个空字符串,其余的,即he。您可能只看到第一场比赛。

对于[a-z]+,第一个(也是唯一一个)匹配项是he

根据您使用的语言/工具,可能有不同的函数用于获取第一个匹配项或获取所有匹配项。下面是一个 Python 示例:

>>> re.search("[a-z]*", "The").group()
''
>>> re.findall("[a-z]*", "The")
['', 'he', '']

【讨论】:

  • 这是正确的。但是由于我们不知道 OP 使用的是什么语言或工具,因此指出在某些语言和工具(如 JavaScript)中,您必须传递一个全局标志以发现多个匹配项也可能会有所帮助。例如:'The'.match(/[a-z]*/) 返回[""],而'The'.match(/[a-z]*/g) 返回["", "he", ""]
  • @gfullam 我认为 “根据您使用的语言/工具,可能有不同的函数用于获取第一个匹配项或获取所有匹配项。”
  • @JamesThorpe 是的,我只是觉得值得分享另一个常用语言的例子。
  • @gfullam,感谢您向我介绍“g”标志。确实是有多个匹配,第一个是空字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2022-07-06
  • 2013-08-02
  • 1970-01-01
相关资源
最近更新 更多