匹配正则表达式,直到找到带引号或不带引号的冒号
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')。我猜的解决方案是向后搜索,因为我们要捕获的文件名是 always 在 last 冒号之后。
如果您的“语法”严格,这将有效:
(\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+ 个单词字符
)
关闭分支重置组
$
字符串结束
我正在寻找一个正则表达式来实现以下目标:
当我的输入是root:Folder1:fname
我想得到fname
并且当输入字符串为root:Folder1:'fname'
时再次得到fname
(无引号!).
对于前者 [^:?]*$
似乎完成了工作,但我找不到一个正则表达式来匹配这两种情况。
是否可以使用单个正则表达式来完成?试图用条件正则表达式实现它,但我做不到。
欢迎任何其他 tip/solution。
谢谢。
编辑:路径的格式不固定,引号可能出现在其他地方(例如 root:'Folder with spaces1':fname 或 root:'Folder with spaces1':'fname')。我猜的解决方案是向后搜索,因为我们要捕获的文件名是 always 在 last 冒号之后。
如果您的“语法”严格,这将有效:
(\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+ 个单词字符
)
关闭分支重置组$
字符串结束