【问题标题】:Regex that matches 2 patterns at once or SED in Applescript that matches both一次匹配 2 个模式的正则表达式或同时匹配两者的 Applescript 中的 SED
【发布时间】:2025-11-26 03:25:01
【问题描述】:

我有 2 种类型的字符串用户输入,我正在尝试使用 1 个正则表达式来匹配它们。 到目前为止,我一直在使用 2 个正则表达式来执行此操作,但我想将它们组合成一个匹配两个字符串的 .. 如果可能的话。 我要找的匹配是:617251, 617076, 985922, 147721

第一个用户输入(字符串):

JEANS
Blue-Denim
6607020201
617076
HOSEKNLA
Oliv
6909020002
985922
ROCKWBKU
Rot
6919020006
147721
BLAZER
rot

我将这个与(?<!\d)\d{6}(?!\d)匹配

第二个用户输入(字符串):

a Ecru  617 251 64  I   b Lagune    617 076 64
c Gelb  985 922 64  I   d Weiß  147 721 64
asdasfas

我将这个匹配为:(\d){3} (\d){3},但无法删除匹配结果的space而不替换。

如果这不可能,我的另一个想法是在 AppleScript 中使用 SED 来清除两种类型的字符串以匹配所需的结果。

【问题讨论】:

    标签: regex sed applescript


    【解决方案1】:

    由于环视适用于第一个模式,您可以使用 2 个捕获组,其中第二个组与可选空格匹配。

    (?<!\d)(\d{3}) ?(\d{3})(?!\d)
    

    部分

    • (?&lt;!\d) 否定后向,断言不是直接向左的数字
    • (\d{3}) 捕获组 1,匹配 3 个数字
    • &lt;code&gt; ?(\d{3}) 匹配可选空格并捕获组 2 中的 3 位数字
    • (?!\d) 负前瞻,断言不是直接向右的数字

    Regex demo

    【讨论】:

    • 如果我必须再次将两个字符串匹配在一起,但第二个字符串没有这样的空格,Regex 将如何变化:a Ecru 61725164 I b Lagune 61707664 c Gelb 98592264 I d Weiß 14772164 asdasfas。感谢你们对我的帮助。真服了!
    • @OutOfTouch 你是这个意思吗? regex101.com/r/0s2udE/1
    • 不幸的是,不完全是。第二个正则表达式正确匹配 a Ecru 617251 64 I b Lagune 617076 64 c Gelb 985922 64 I d Weiß 147721 @ 987654334@ 没有空格时..但第一个字符串错误匹配JEANS Blue-Denim 660702 0201 617076 HOSEKNLA Oliv 690902 @ 987654338@985922ROCKWBKU Rot。从第一个字符串开始,它应该只匹配 617076 985922 并跳过 6 位以上的数字。
    • @OutOfTouch 如果第二个模式具有正确的匹配项,除了大于 6 位的上限值,您可以选择匹配 2 位 regex101.com/r/J8IJxM/1
    • @OutOfTouch Of 你可以声明你要匹配的时候不跟4位数字(?&lt;!\d)(\d{3}) ?(\d{3})(?!\d{4})regex101.com/r/7oDXUw/1
    【解决方案2】:

    对于匹配,您应该考虑使用grep 而不是sed

    这是一个在 OSX 上工作的grep。请注意使用\&lt;\&gt; 作为字边界,因为从您的示例数据中可以明显看出,您实际上并不需要lookbehind 和lookahead 断言。

    grep -oE '\<[0-9]{3} ?[0-9]{3}\>' file
    
    617076
    985922
    147721
    617 251
    617 076
    985 922
    147 721
    

    在 OSX 上等效的 sed 是这样的:

    sed -nE '/[[:<:]][0-9]{3} ?[0-9]{3}[[:>:]]/p' file
    

    【讨论】:

    • 我一直这样使用它:set FinalString to do shell script "echo " &amp; quoted form of RawStringResult &amp; " | grep -oE '[0-9]{3} ?[0-9]{3}'" 并且对于第一个用户输入字符串:JEANS Blue-Denim 6607020201 617076 HOSEKNLA Oliv 它匹配 660702617076 .它不应与 660702 匹配,因为它是超过 6 位数字的一部分。考虑到第二个字符串 .. 它工作正常。谢谢!
    • 但我建议grep -oE '\&lt;[0-9]{3} ?[0-9]{3}\&gt;' that uses word boundaries then it won't match 660702`
    • 是的。现在可以了。对不起..我以错误的方式理解您的评论。感谢你们对我的帮助。我将深入研究 sed 和 grep。必须详细了解这种语言的工作原理。