Php 条件子模式匹配的问题
如果我尝试此代码:Php 条件子模式匹配的问题,php,regex,preg-match,Php,Regex,Preg Match,如果我尝试此代码: <?php $greets1="hello jack"; $greets2="hi john"; preg_match('/(hello )((?(?=jack)j))/',$greets1,$result); ?> 它在$result[1]和$result[2]中都不写入任何内容。为什么呢 还有:如何在前瞻中写入空格字符?我试过很多方法: preg_match('/(hello)((?(?= jack)j))/',$greets1,$result);
<?php
$greets1="hello jack"; $greets2="hi john";
preg_match('/(hello )((?(?=jack)j))/',$greets1,$result);
?>
它在$result[1]
和$result[2]
中都不写入任何内容。为什么呢
还有:如何在前瞻中写入空格字符?我试过很多方法:
preg_match('/(hello)((?(?= jack)j))/',$greets1,$result);
preg_match('/(hello)((?(?=\ jack)j))/',$greets1,$result);
preg_match('/(hello)((?(?=\\\ jack)j))/',$greets1,$result);
这些都没用
它在$result[1]和$result[2]中都不写入任何内容。为什么呢
因为没有比赛,比赛失败了。您可以看到正则表达式引擎尝试匹配hello
,后跟一个空格,它成功了,然后它找到了条件并检查了can I matchjack
,是的,我可以,因此条件为真,现在我应该尝试匹配那里的,但引擎无法匹配,整个匹配尝试失败
如何在前瞻中写入空格字符
就像你在第一行所做的那样,这没有什么问题。问题在于,前瞻不会导致正则表达式从输入字符串中读取任何字符,因此在匹配hello
后,正则表达式的位置是:
hello jack
^
就在空格之前,然后是条件和前瞻,前瞻尝试匹配一个空格,后跟jack
,它成功了,但正则表达式实际上并不使用输入字符串中的任何字符,现在我们来看:
hello jack
^
您可以看到正则表达式仍然存在,它刚刚确认了前瞻性,现在尝试匹配j
,但是现在有一个空格,所以它失败了,所以如果您将正则表达式更改为以下内容,它将工作:
preg_match('/(hello)((?(?= jack) j))/',$greets1,$result);
^ notice the space here
正如@Hamza在他的评论中所说的,这里不需要条件,如果您只想匹配j
,如果它是jack
的一部分,那么您可以单独使用如下前瞻:
preg_match('/(hello)( j(?=ack\b))/',$greets1,$result);
它在$result[1]和$result[2]中都不写入任何内容。为什么呢
因为没有比赛,比赛失败了。您可以看到正则表达式引擎尝试匹配hello
,后跟一个空格,它成功了,然后它找到了条件并检查了can I matchjack
,是的,我可以,因此条件为真,现在我应该尝试匹配那里的,但引擎无法匹配,整个匹配尝试失败
如何在前瞻中写入空格字符
就像你在第一行所做的那样,这没有什么问题。问题在于,前瞻不会导致正则表达式从输入字符串中读取任何字符,因此在匹配hello
后,正则表达式的位置是:
hello jack
^
就在空格之前,然后是条件和前瞻,前瞻尝试匹配一个空格,后跟jack
,它成功了,但正则表达式实际上并不使用输入字符串中的任何字符,现在我们来看:
hello jack
^
您可以看到正则表达式仍然存在,它刚刚确认了前瞻性,现在尝试匹配j
,但是现在有一个空格,所以它失败了,所以如果您将正则表达式更改为以下内容,它将工作:
preg_match('/(hello)((?(?= jack) j))/',$greets1,$result);
^ notice the space here
正如@Hamza在他的评论中所说的,这里不需要条件,如果您只想匹配j
,如果它是jack
的一部分,那么您可以单独使用如下前瞻:
preg_match('/(hello)( j(?=ack\b))/',$greets1,$result);
什么是预期匹配?如果没有正确使用条件模式,则不需要使用条件模式。那么为什么不使用/(hello)(j)(?=ack)/
?另外,你说的也没有意义,你基本上是说如果有“杰克”,那么匹配“那里”
如果你确定有“杰克”,你会怎么匹配“那里”。所以基本上这就是它失败的原因。@user176795否,因为您要求正则表达式匹配“there”。但是没有“那里”。让我们进一步解释一下,您得到了(你好)((?(=杰克)在那里))
。第一个很简单,它只是将“hello”分组到第1组中。现在让我们进一步了解,(?(=杰克)那里)
:如果有杰克,那么匹配“那里”。在我们的示例中,有jack,所以我们的正则表达式基本上变成“(hello)(there)”。现在尝试将“hello jack”与/(hello)(那里)/
匹配。不可能\有主意了吗?关于空间。第一个可能有效,但您忘记在j
前面添加空格。否则,您将检查是否存在“jack,但随后您将尝试立即匹配
j',而不首先占用该空间。所以:/(hello)((?(?=jack)j))/
或者为了提高可读性,/(hello)((?(?=[]jack)[]j))/
(也可以在自由间隔模式下工作)和关于“如果一个子模式失败,数组将无效”:如果一个子模式失败(在某些方面不是可选的),那么匹配将失败,而你一开始就找不到对手。无匹配->无子匹配。子匹配只是成功匹配的副产品。预期的匹配是什么?如果没有正确使用条件模式,则无需使用条件模式。那么为什么不使用/(hello)(j)(?=ack)/
?另外,你说的也没有意义,你基本上是说如果有“杰克”,那么匹配“那里”
如果你确定有“杰克”,你会怎么匹配“那里”。所以基本上这就是它失败的原因。@user176795否,因为您要求正则表达式匹配“there”。但是没有“那里”。让我们进一步解释一下,您得到了(你好)((?(=杰克)在那里))
。第一个很简单,它只是将“hello”分组到第1组中。现在让我们进一步了解,(?(=杰克)那里)
:如果有杰克,那么匹配“那里”。在我们的示例中,有jack,所以我们的正则表达式基本上变成“(hello)(there)”。现在尝试将“hello jack”与/(hello)(那里)/
匹配。不可能\有主意了吗?关于空间。第一个可能有效,但您忘记在j
前面添加空格。否则,您将检查是否存在“jack,但随后您将尝试立即匹配
j',而不首先占用该空间。所以: