【问题标题】:Extract substring from path. Make sure the extracted substring isn't followed by a character从路径中提取子字符串。确保提取的子字符串后面没有字符
【发布时间】:2016-10-19 14:18:13
【问题描述】:

假设我有这个字符串:

/folder1/folder2/match/folder3/match.app

我想提取一个匹配条件(“match”)结尾但后面没有特定字符(“@987654323 @")

结果应该是:

/folder1/folder2/match

案例一

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

【问题讨论】:

  • 您要在哪里添加代码,是否有任何 javascript 或 .htaccess 或任何语言文件?
  • 在applescript中:设置strResult以使用正则表达式和字符串结果在strTextToSearch中查找文本strRegEx
  • /(?<=\/match)(?!\.)(.*)/ 应该在 php PCRE 中完成。我不确定applescript中使用的是什么引擎。
  • 没有匹配项时如何获得“False”?
  • 下面的答案都可以被applescript很好地解释(除了“转义”字符是“\\”而不仅仅是“\”)

标签: regex string path applescript


【解决方案1】:

这是一种解决方案:

.*?match(?!\.)

Demo(注意:添加此演示中的^ 只是为了同时显示多个示例;您不需要它。)

解释:

. - 匹配任何字符

*? - 尽可能多地重复前一个模式,但尽可能少(“非贪婪”)。

match - 单词“匹配”的文字文本

(?!...) 负前瞻;包含的模式不包含在结果中,并且无法匹配。

\. 文字“。” (\ 防止它被视为“任何字符”,如上)


编辑:

考虑到您现在添加的“案例 4”,您或许可以将正则表达式更改为:

.*?match(?=\/|$)

Demo

解释:

(?=...) 是一个积极的前瞻。

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

$ 匹配行尾。

\/|$ 匹配上述任何一个

【讨论】:

  • 几乎完美!我忘记了一个条件。更新了我的问题。另外,如果没有任何发现,我可以得到自定义输出(“False”)吗?
  • 我已经更新了“案例 4”的答案。我不完全确定你想用这个"False" 变量实现什么;我需要了解更多有关您如何使用它的背景信息...我以前也从未使用过applescript,因此其他人可能比我有更好的主意:)
  • 现在真的很完美!关于“False”..我认为如果条件匹配或不匹配,我的applescript代码中没有if..else,我可以输出自定义文本:)
  • 什么时候strResult 在你的代码中是相等的,当这种情况发生时? NULL,或类似的? (正如我所说,我不知道 applescript...) - 你能不能不做类似if strResult == NULL .... 的事情?
  • 这正是我要做的。好吧,非常感谢您所做的一切!你明白了!
【解决方案2】:

在大多数情况下,与 Regex (^.*?match(?!\.)) regex 匹配的第一个匹配就足够了。

查看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 选项并将^ 添加到正则表达式的开头,您可以获得字符串的正确部分作为唯一匹配项。

【讨论】:

    【解决方案3】:

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

    .*?match[^\.]
    

    细分
    .所有字符
    *? 0直到无穷次但不贪心
    match单词匹配
    [^后面没有以下列表
    @ 987654327@ 一个点(\ 是为了将其转义为一个点而不是所有字符。
    ] 列表末尾

    如果您只读取了第一个找到的匹配项,那么对于您的案例 2,您只会获得第一个匹配项。如果你阅读了所有匹配项,你也会得到 folder3/match 作为结果

    如果 3 你找不到匹配项

    【讨论】:

    • 这似乎差不多了。但是,我在子字符串的末尾收到一个额外的“/”。另外,我可以强迫它只给我第一次出现(在案例2中)。如果没有任何发现,我能否获得自定义输出(“False”)?
    • 如果它始终位于行首,您可以使用^.*?match(?!\.) 前面的 ^ 使其位于行首。没有点你需要消极的前瞻。 demo
    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 2016-04-04
    • 2018-09-29
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多