【问题标题】:writing Regular expression for test data(PCRE)为测试数据编写正则表达式(PCRE)
【发布时间】:2015-05-28 08:31:00
【问题描述】:

我正在尝试编写一个符合以下条件的正则表达式:

匹配第一个 '@' 和 ':' 之后的所有内容。但它不应该包括这两个字符。我已经粘贴了我的测试数据。我更喜欢使用http://regexpal.com/ 来测试我的正则表达式。 例如,如果测试字符串是 "pop3://abby@abby.com:43598743abby@173.201.192.199:110"

那么正则表达式应该匹配“abby.com”

pop3://abby@abby.com:43598743abby@173.201.192.199:110
pop3://abby@abby.com:abby243234@173.201.192.199:110
smtp://tania@abby.ca:abby3@69.49.109.86:25
pop3://tania@abby.ca:abbya13@69.49.109.86:110
pop3://abby@abby.com:abby9675@173.201.193.199:110
pop3://abby@abby.com:abby12345@173.201.193.199:110
smtp://abby:820211ly520@202.108.6.242:25
pop3://smartinez@abby.com:abby123@64.26.60.221:110

【问题讨论】:

  • 我打算写一个Py脚本。但我主要关心的是首先使用正则表达式过滤掉一个大文本文件。 Notepad++ 等工具支持正则表达式搜索,因此如果我有正确的正则表达式,我将很容易进行搜索和排序。
  • 您能否详细解释一下match everything after the first '@' and first ':' . But it should not include these two characters
  • 糟糕。我想我在这个问题上犯了一个小错误。这是我的想法:让我们考虑示例数据集的第一行:“pop3://abby@supremefill.com:ash9675@173.201.192.199:110”。我想匹配 "supremefill.com" 。第一个 '@' 和下一个 ':' 之后的任何内容。
  • 假设第一行,你只想要supremefill.com 吗?介于@:
  • 你明白了,弗兰克。我修改了我的问题。抱歉弄错了。

标签: regex pcre


【解决方案1】:

我会使用lookbehind assertion:

(?<=@)[^:]+

它匹配前面有@ 的非':' 字符序列。 @ 不包含在匹配中。

https://regex101.com/r/pZ6xA5/1

【讨论】:

    【解决方案2】:

    我会简单地使用:

    /@([^:]+):/
    

    它匹配@:之间的字符串,结果在第1组中。

    【讨论】:

    • OP 不想要 @ 和 :
    • 是的,需要避免@:
    • @S.Krishna:这些角色不包含在第 1 组中。您尝试过吗?
    • @S.Krishna 这些角色不包括在第 1 组中!你知道什么是捕获组吗?如果没有,请学习!
    • @hek2mgl,我不会,我会的!
    【解决方案3】:

    如果我理解得很好,当用户名一个电子邮件地址时,您想提取电子邮件地址的域。更清楚地说,第一行可以分为以下几部分:

    pop3://abby@supremefill.com:ash9675@173.201.192.199:110
    
    [scheme] => pop3
    [host]   => 173.201.192.199
    [port]   => 110
    [user]   => abby@supremefill.com
    [pass]   => ash9675
    

    所以用户名是abby@supremefill.com,这个电子邮件地址的域是supremefill.com

    请注意,smtp://liangyuan820211:820211ly520@202.108.6.242:25 行的用户名不是电子邮件地址:liangyuan820211,则此行不得返回任何结果。

    提取域的一种有效方法是将模式锚定在行的开头(以快速丢弃可能尝试模式的无用位置),并且默认情况下,notepad++ 中的正则表达式引擎设置为多行模式 (在这种模式下^ 代表start of the line。要丢弃直到域名的所有开头的行,您可以使用\K

    ^[^@:]+:[^@:]+@\K[^:]+
    

    demo

    【讨论】:

    • 看起来这里唯一的 正确 答案 - OP 真的想要那个。
    【解决方案4】:

    你可以试试([a-z])*?\.([a-z])*

    Demo

    【讨论】:

    • 是的,这完全匹配。我只是稍微修改了一下 ([a-z])*?\.([a-z]){2,3}。这将选择 2 或 3 个长度的 TLD。谢谢
    • 这匹配foo.bar。这与问题有什么关系?前面的@怎么处理,后面的:怎么处理?
    【解决方案5】:
    (?<=@)([^:\d]+):
    

    更多detail

    【讨论】:

    • 为什么是捕获组?为什么没有数字? (域名中允许使用数字。为什么要在末尾添加:
    • 它与给出的示例不匹配:smtp://liangyuan820211:820211ly520@202.108.6.242:25
    • 再看看他的问题For example if the test string is "pop3://abby@supremefill.com:ash9675@173.201.192.199:110" Then the regex should match "supremefill.com"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    相关资源
    最近更新 更多