【问题标题】:How to print items in Lookahead/Lookbehind only?如何仅在 Lookahead/Lookbehind 中打印项目?
【发布时间】:2012-08-27 15:54:00
【问题描述】:

我需要使用 PCRE 正则表达式在一行中提取电子邮件和邮政编码。该行可能包含任意顺序的其他字段。每个字段如果退出,只会出现一次。仅当 两个 字段都存在时,Regex 才会打印结果。

我写了这个正则表达式,但显示了整行

^(?=.*?[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b)(?=.*?\b[\d]{5}\b).*$

例子:

f1 f2 11061 f3 abc@mydom.com f4
打印 ==> 11061 abc@mydom.com

f1 f2 f4 f3 xyz@mydom.com 10018
打印 ==> xyz@mydom.com 10018

f2 f4 10048 f3
打印 ==> ( null )

有没有办法只打印匹配的模式?

【问题讨论】:

    标签: regex


    【解决方案1】:

    怎么样:

    (\d{5})|([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}) << only if the input contains BOTH
    

    已编辑:

    (?:(?<zip>\d{5}).*(?<email>[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}))|(?:(?<email>[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}).*(?<zip>\d{5}))
    

    组“zip”是 zip

    组“电子邮件”是电子邮件地址

    【讨论】:

    • 谢谢TheHe。但我需要正则表达式来打印结果,前提是两个项目都在行中。邮政编码也可能在电子邮件之后,反之亦然。
    • 不正确?有“|”-字符(逻辑或)...您在哪种语言中使用此正则表达式以及使用哪些修饰符?整个字符串与逐行?
    • 不正确。该正则表达式匹配“12345”。仅当电子邮件和邮政编码都存在时,我才需要打印。我使用 Expresso 和 Google Regex 测试人员进行验证。谢谢
    • Hi TheHe,如果我没有解释清楚,我很抱歉。当我使用您的正则表达式输入没有电子邮件的测试数据(例如“f1 12345 f2”)时,它会返回 12345。在这种情况下,正则表达式不应返回任何内容,因为电子邮件不存在。以下是示例: "f1 12345 f2 abc@mydom.com f3" 打印 12345 abc@mydom.com "f1 f2 xyz@mydom.com 54321 f3" 打印 xyz@mydom.com 54321 "f1 12345 f2" 不打印任何内容 ( null )
    • 糟糕...我刚看到你的新正则表达式,让我稍后测试,去开会。非常感谢TheHe
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多