假设我有这个字符串:
/folder1/folder2/match/folder3/match.app
我想提取以匹配条件结束的子字符串(“match
”),但特定字符不会跟踪(“ .
“)
结果应为:
/folder1/folder2/match
<案例1
如果“match.
”之前的“match
”后面跟着任何其他字符或者没有:
/folder1/folder2/match.app/folder3/match/folder4
结果应为:
/folder1/folder2/match.app/folder3/match
由于第一个“match
”后跟“.
”
如果有两场比赛:
/folder1/folder2/match/folder3/match/folder4
结果应为:
/folder1/folder2/match
我想保留第一个子字符串。
<案例3如果没有任何“match
”没有“.
”:
/folder1/folder2/match.app
结果应为:
False
当没有出现时,正则表达式应输出“False
”。
如果“match
”后跟“/
”或“其他”以外的任何其他字符:
/folder1/folder2/matcha/match/folder3
或
/folder1/folder2/matcha/match
结果应为:
/folder1/folder2/matcha/match
有什么想法吗?谢谢!
注意:我想在Applescript中使用这个正则表达式:
set strRegEx to ???
set strResult to find text strRegEx in strTextToSearch with regexp and string result
更新:已添加案例4
答案 0 :(得分:1)
对于大多数情况,与正则表达式(^.*?match(?!\.))
正则表达式一致的第一场比赛就足够了。
/folder1/folder2/match/folder3/match.app
匹配/folder1/folder2/match
/folder1/folder2/match.app/folder3/match/folder4
匹配/folder1/folder2/match.app/folder3/match
/folder1/folder2/match/folder3/match/folder4
匹配两者:
/folder1/folder2/match
/folder3/match
/folder1/folder2/match.app
与任何内容都不匹配。您是否会考虑在每种情况下使用特定的正则表达式?
编辑。如果您使用gm
选项并将^
添加到正则表达式的开头,则可以将String的正确部分作为唯一匹配。
答案 1 :(得分:1)
这是一个解决方案:
.*?match(?!\.)
Demo(注意:此演示中的^
仅添加为一起显示多个示例;您不应该需要它。)
说明:
.
- 匹配任何字符
*?
- 根据需要多次重复之前的模式,但尽可能少(“非贪婪”)。
match
- “匹配”一词的文字文字
(?!...)
负向前瞻;包含的模式不包含在结果中,不能匹配。
\.
字面意思“。” (\ \防止它被视为“任何字符”,如上所述)
修改强>
考虑到您现在添加的“案例4”,您可以将正则表达式更改为:
.*?match(?=\/|$)
说明:
(?=...)
是积极的预测。
\/
匹配文字“/”字符。
$
匹配该行的结尾。
\/|$
匹配上述 。
答案 2 :(得分:0)
我想你正在寻找这样的东西。
.*?match[^\.]
故障
.
所有字符为*?
0,直到无休止但不贪婪为match
字匹配
[^
未跟随以下列表
\.
一个点(\是为了将其作为点而不是所有字符进行读取。]
列表的末尾
如果你只阅读第一个找到的匹配,你只能获得第一场比赛。如果你读了所有的比赛你也得到folder3/match
作为结果
如果是3,则找不到匹配项