Regex 贪婪但不太贪婪的正则表达式:需要排除最后出现的可选字符

Regex 贪婪但不太贪婪的正则表达式:需要排除最后出现的可选字符,regex,Regex,(这肯定是一些琐碎的问题,已经回答了很多次了——但我无法制定正确的搜索查询,对不起!) 从文本中,如前缀start.then.123.some-more.text。所有其余的< /代码>我需要提取开始。然后,123。更多。文本< /代码> -即没有空格的字符串,中间有周期,可能有或没有尾随周期< /强>(并且尾随期应该强>不< /强>被包含)。我努力构建一个能够同时处理这两种情况的正则表达式: 前缀(开始[0-9a-zA-Z\.\-]+)\.*-只有在有尾随句点时才能正确工作, 前缀(开始[0-

(这肯定是一些琐碎的问题,已经回答了很多次了——但我无法制定正确的搜索查询,对不起!)

从文本中,如
前缀start.then.123.some-more.text。所有其余的< /代码>我需要提取<代码>开始。然后,123。更多。文本< /代码> -即没有空格的字符串,中间有周期,<强>可能有或没有尾随周期< /强>(并且尾随期应该<>强>不< /强>被包含)。我努力构建一个能够同时处理这两种情况的正则表达式:
前缀(开始[0-9a-zA-Z\.\-]+)\.*
-只有在有尾随句点时才能正确工作,
前缀(开始[0-9a-zA-Z\.-]+)\?。
-我认为在
\.
之后添加
将使其成为可选的-但它不


另外,我的环境是MS VBA脚本,我使用的是
CreateObject(“vbscript.regexp”)
——但我想这个问题也与其他正则表达式引擎有关。

如果不想包含“前缀”,可以使用:

(?<=prefix )\S*?(?=\.?\s)
这将在最后一个字母、数字或下划线处停止。如果希望能够捕获连字符作为最后一个字符,可以将上面的
\w
更改为
[\w-]


您可以匹配前缀,并使用捕获组首先匹配字符a-Za-z0-9

然后,您可以使用字符类在前面有
-
的组中重复前面的模式

prefix ([0-9a-zA-Z]+(?:[.-][0-9a-zA-Z]+)+)
部分地

  • 前缀
    按字面匹配
  • 捕获组1
    • [0-9a-zA-Z]+
      匹配所列字符的1+倍
    • (?:
      非捕获组
      • [.-][0-9a-zA-Z]+
        匹配
        -
        并再次匹配所列字符的1+倍
    • )+
      关闭组并重复1+次以匹配至少一个点或连字符
  • 关闭组

如果捕获组中的值应以
start
开头:

prefix (start(?:[.-][0-9a-zA-Z]+)+)

谢谢@jdaz!因此,如果不使用lookahead?P.s.就无法解决这个问题。至于“前缀”-奇怪的是,
vbscript.regexp
不支持lookahead(虽然支持lookahead),所以我用另一对括号括起来:
前缀(\s*?(?=\。?\s))
-这很管用
前缀(start\s*)\b
,非常感谢,我真的很感谢你的解释!(将jdaz答案标记为一个解决方案,因为它更简单,但您的答案也非常有用,并且非常有教育意义)
prefix (start(?:[.-][0-9a-zA-Z]+)+)