正则表达式,用于在字符串的常规模式之后捕获字符串

时间:2019-02-15 19:42:10

标签: regex

我需要有关正则表达式的帮助。

我们有以下字符串:

$ VAR = [1550181700,'“ xyz(gmail.com)”','嗨,请稍候,主机名:kmkkmk.abc.com,工作名称:dat-inh-ndw-q9n580_prd106.f,工作名称:dat-inh-rdm-q9n717_jdapfrdly.b,职位名称:dat-inh-rdm-q9n717_jdapfrdly.b,谨记,DSG团队']

在上面的字符串中,我需要捕获“ Job Name:”之后和下一个COMMA(,)之前的任何内容 这意味着我必须获取包含以下内容的字符串列表: [dat-inh-ndw-q9n580_prd106.f,dat-inh-rdm-q9n717_jdapfrdly.b,dat-inh-rdm-q9n717_jdapfrdly.b]

注意:我们不知道上面的字符串中“作业名称:”可能会出现多少次。

3 个答案:

答案 0 :(得分:0)

尝试使用正则表达式:Job Name: (?<job>[^,]*)

答案 1 :(得分:0)

(?>Job Name: )([^,]*)

捕获以下3个字符串:

dat-inh-ndw-q9n580_prd106.f
dat-inh-rdm-q9n717_jdapfrdly.b
dat-inh-rdm-q9n717_jdapfrdly.b

答案 2 :(得分:0)

嗯,这取决于您的基础架构。基本上,您的Regex看起来会像这样(假定使用.NET语法):

arr_delay == -15

这将捕获字符串“ JobName:”,后跟任意数量的空格。然后,我们有一个捕获组,可以捕获任意数量的非逗号字符([^,] *)。使用此功能,您可以启动匹配过程,该过程将为您提供第一个捕获组中所需的所有字符串。

这就是基础结构的来源。您是否需要.NET上下文,JavaScript,PHP或其他内容?这些命令将根据使用的技术而有所不同。

更新1:(Perl代码)

"Job Name:\\s*([^,]*)"

这将为您提供@jobNames数组中所需的所有名称。但是,如果仅需要将正则表达式用作函数的参数,则可能需要对其进行一些更改。

更新2 :(使用后置断言)

您可能实际上正在寻找的是所谓的零宽度后向声明。它定义要匹配的模式,但不包括在结果中。然后,正则表达式将如下所示:

$s = "$VAR = [1550181700, '\"xyz (gmail.com)\" ', 'Hi Team,Please ON HOLD,HostName: kmkkmk.abc.com,Job Name: dat-inh-ndw-q9n580_prd106.f,Job Name: dat-inh-rdm-q9n717_jdapfrdly.b,Job Name: dat-inh-rdm-q9n717_jdapfrdly.b,regards,DSG Team']";

@jobNames = [];
while($s =~ /Job Name:\s*([^,]*)/gi) {
    push @jobNames, $1;
}

/(?<=Job Name: )[^,]*/ 构造告诉正则表达式仅匹配以下模式(如果在其前面加上括号中定义的内容,在您的情况下为“作业名称:”)。但是,这不应包含在结果中。因此,只有模式的其余部分才是结果的一部分。

注意:您可能已经注意到,我在冒号后用常规空格替换了(?<=...)构造。这是因为使用\ s *构造时,我的在线perl游乐场给我一个“在正则表达式中未实现的可变长度后视”错误。但是,它可能会在您实施perl时起作用。如果确定的话,在冒号后面总会有一个空格,您可以继续使用单个空格。