我有以下两个示例字符串:
"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+[^\/])?\/?")
如何调整捕获组以获取除正斜杠之外的所有内容?
答案 0 :(得分:1)
如评论中所述,在第三个字符串中,该部分ntp-server.niehs.nih.gov
与\w
不匹配
但是您可以通过使用否定的字符类和重复的模式(不匹配正斜杠,然后再匹配不反斜杠1倍以上)来匹配正斜杠,从而简化表达式。
然后,您可以将比赛分成正斜杠。
模式
"taxonomy": "\K[^/\n]+(?:/[^/\n]+)+(?=")
说明
"taxonomy":
字面上匹配"\K
匹配双引号,然后忘记使用\K
匹配的内容[^/\n]+
使用否定的字符类匹配1次以上而不是正斜杠(?:/[^/\n]+)+
重复模式以匹配/
,然后匹配1次以上而不是/
(?=")
肯定前面的断言是右边的双引号例如,如果您在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
)