匹配正则表达式,直到找到带引号或不带引号的冒号

regex to match until a colon is found with or without quotes present

我正在寻找一个正则表达式来实现以下目标:

当我的输入是root:Folder1:fname我想得到fname

并且当输入字符串为root:Folder1:'fname'时再次得到fname(无引号!).

对于前者 [^:?]*$ 似乎完成了工作,但我找不到一个正则表达式来匹配这两种情况。

是否可以使用单个正则表达式来完成?试图用条件正则表达式实现它,但我做不到。

欢迎任何其他 tip/solution。

谢谢。

编辑:路径的格式不固定,引号可能出现在其他地方(例如 root:'Folder with spaces1':fname 或 root:'Folder with spaces1':'fname')。我猜的解决方案是向后搜索,因为我们要捕获的文件名是 alwayslast 冒号之后。

如果您的“语法”严格,这将有效:

(\w+:)*'?(\w+)'?

  • 首先我们重复任何单词:从 0 次到无限次
  • 然后我们使用单引号(如果存在)
  • 然后我们记录最后一个词
  • 然后我们消耗最后一个报价如果它存在

在此处观看正则表达式调试器: https://regex101.com/r/SjoWYP/1

如果要强制使用成对引号,则需要捕获第一个引号。

(\w+:)*('?)(\w+)$

第三对括号内的表达式将作为第三个捕获组可用(</code> 或 <code>match.group(3) 或您有什么)。

如果您的正则表达式方言允许非分组括号,您可以将其重新表述为

(?:\w+:)*('?)(\w+)$

and/or 也可能扩展引号组以允许单引号或双引号 (['"]?pro '?)。那么当然最后一组将是 </code> 而不是 <code>.

当您标记 pcre 时,您还可以使用分支重置组来获取单引号之间或不在单引号之间的组 1。

^.*:(?|'(\w+)'|(\w+))$
  • ^ 字符串开头
  • .*:匹配到最后:
  • (?|分支重置组
    • '(\w+)' 在单引号之间捕获 1+ 个单词字符 | 或者 (\w+) 捕获 1+ 个单词字符
  • )关闭分支重置组
  • $ 字符串结束

Regex demo