RegEx用于捕获除正斜杠

时间:2019-04-12 20:47:37

标签: regex regex-group

我有以下两个示例字符串:

"taxonomy": "abc/about_abc/bsc/archive/2009/presentations_dec"

"taxonomy": "about/archive/term"

"taxonomy": "_decommisioned/ntp-server.niehs.nih.gov/htdocs/results_status/resstatf"

我尝试使用以下RegEx:

"taxonomy": "(\w+[^\/])\/?"?

目标是获取每个字符串,并在正斜杠上将其分解为自己的单独行,因此term1/term2/term3等于

term1
term2
term3

我也不知道每行有多少个术语,这就是为什么它们像原来那样被分解。它可能是最小一个,最大是7。我的填充RegEx如下所示:

(    "taxonomy": "(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?")

如何调整捕获组以获取除正斜杠之外的所有内容?

1 个答案:

答案 0 :(得分:1)

如评论中所述,在第三个字符串中,该部分ntp-server.niehs.nih.gov\w不匹配

但是您可以通过使用否定的字符类和重复的模式(不匹配正斜杠,然后再匹配不反斜杠1倍以上)来匹配正斜杠,从而简化表达式。

然后,您可以将比赛分成正斜杠。

模式

"taxonomy": "\K[^/\n]+(?:/[^/\n]+)+(?=")

说明

  • "taxonomy":字面上匹配
  • "\K匹配双引号,然后忘记使用\K匹配的内容
  • [^/\n]+使用否定的字符类匹配1次以上而不是正斜杠
  • (?:/[^/\n]+)+重复模式以匹配/,然后匹配1次以上而不是/
  • (?=")肯定前面的断言是右边的双引号

Demo on regex101 | Php demo

例如,如果您在php中使用explode:

$pattern = '~"taxonomy": "\K[^/\n]+(?:/[^/\n]+)+(?=")~';

$strings = [
    '"taxonomy": "abc/about_abc/bsc/archive/2009/presentations_dec"',
    '"taxonomy": "about/archive/term"',
    '"taxonomy": "_decommisioned/ntp-server.niehs.nih.gov/htdocs/results_status/resstatf"'
];

foreach ($strings as $string) {
    preg_match($pattern, $string, $match);
    print_r(explode('/', $match[0]));

}

结果:

Array
(
    [0] => abc
    [1] => about_abc
    [2] => bsc
    [3] => archive
    [4] => 2009
    [5] => presentations_dec
)
Array
(
    [0] => about
    [1] => archive
    [2] => term
)
Array
(
    [0] => _decommisioned
    [1] => ntp-server.niehs.nih.gov
    [2] => htdocs
    [3] => results_status
    [4] => resstatf
)