Regex 用于捕获除正斜杠以外的每个字符的正则表达式
我有以下两个示例字符串:Regex 用于捕获除正斜杠以外的每个字符的正则表达式,regex,regex-group,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" 我已尝试使用以下正则表达式: "taxonomy": "(\w+[^\/])\/?"? 目标是获取这些字
"taxonomy": "abc/about_abc/bsc/archive/2009/presentations_dec"
"taxonomy": "about/archive/term"
"taxonomy": "_decommisioned/ntp-server.niehs.nih.gov/htdocs/results_status/resstatf"
我已尝试使用以下正则表达式:
"taxonomy": "(\w+[^\/])\/?"?
目标是获取这些字符串中的每一个,并将它们分解到正斜杠上各自独立的行上,因此term1/term2/term3
等于
term1
term2
term3
我也不知道每行有多少个术语,这就是为什么它们会像现在这样分开。可以是最少一个,最多7个。我的填充正则表达式如下所示:
( "taxonomy": "(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?(\w+[^\/])?\/?")
如何调整我的捕获组以获得除前斜杠以外的所有内容?如注释中所述,在第三个字符串中,这部分
ntp server.niehs.nih.gov
与\w
但是,您可以通过不匹配正斜杠来简化表达式,方法是使用求反字符类和重复模式来匹配正斜杠,然后再使用1+倍的非正斜杠
然后你可以用正斜杠分割你的比赛
图案
"taxonomy": "\K[^/\n]+(?:/[^/\n]+)+(?=")
解释
逐字匹配“分类法”:
匹配双引号,然后忘记使用“\K
\K
使用否定字符类匹配1+次非正斜杠[^/\n]+
重复模式以匹配(?:/[^/\n]+)+
,然后1+次不是/
/
正面向前看以断言右侧是双引号(?=”)
$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
)
如果你什么都想要,那为什么还要费心于
\w+
?只需执行[^\/]+
,这就是第三个输入中的问题。。。它有一个点和连字符,不能满足\w
的要求。我的代码有错误。您的意思是[^\/\n],跳过正斜杠吗?我使用的是PCRE regex find replace engine如果模式的分隔符是/
,则必须像\/
一样转义正斜杠。在我的示例中,分隔符是~
,因此不必转义它。