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]+)+)