从路径中提取子字符串。确保提取的子字符串后面没有字符

时间:2016-10-19 14:18:13

标签: regex string path applescript

假设我有这个字符串:

/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”后跟“.

<案例2

如果有两场比赛:

/folder1/folder2/match/folder3/match/folder4

结果应为:

 /folder1/folder2/match

我想保留第一个子字符串。

<案例3

如果没有任何“match”没有“.”:

/folder1/folder2/match.app

结果应为:

False

当没有出现时,正则表达式应输出“False”。

<案例4

如果“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

3 个答案:

答案 0 :(得分:1)

对于大多数情况,与正则表达式(^.*?match(?!\.))正则表达式一致的第一场比赛就足够了。

Regex101.com

上查看
  • /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(?=\/|$)

Demo

说明:

  

(?=...)积极的预测。

     

\/匹配文字“/”字符。

     

$匹配该行的结尾。

     

\/|$匹配上述

答案 2 :(得分:0)

我想你正在寻找这样的东西。

.*?match[^\.]
  

故障   .所有字符为*? 0,直到无休止但不贪婪为match字匹配
[^未跟随以下列表
\.一个点(\是为了将其作为点而不是所有字符进行读取。]列表的末尾

如果你只阅读第一个找到的匹配,你只能获得第一场比赛。如果你读了所有的比赛你也得到folder3/match作为结果

如果是3,则找不到匹配项