PHP正则表达式捕获较大的匹配,忽略较小的匹配
这是我的密码:PHP正则表达式捕获较大的匹配,忽略较小的匹配,php,regex,preg-match,Php,Regex,Preg Match,这是我的密码: <?php $sentence = "{To|Preposition}{talk|Verb}{here|Place}."; $pattern = "/{(.*)\|(.*)}/"; preg_match($pattern, $sentence, $match_arr); $match = $match_arr[0]; $a = $match_arr[1]; $b = $match_arr[2]; echo "
<?php
$sentence = "{To|Preposition}{talk|Verb}{here|Place}.";
$pattern = "/{(.*)\|(.*)}/";
preg_match($pattern, $sentence, $match_arr);
$match = $match_arr[0];
$a = $match_arr[1];
$b = $match_arr[2];
echo "$match<br /><br />$a<br /><br />$b";
?>
但我希望它是这样的:
{To|Preposition}
To
Preposition
因此,基本上,它不是捕获第一个匹配,而是捕获整个句子(从技术上讲,这是一个更大的匹配)。如何更改模式以实际捕获第一个较小的匹配以获得所需的结果
谢谢。您需要对所有子组使用ungreedy匹配
“/{(.*)\\|(.*)}/U”代码>
这将使模式匹配尽可能少的字符,以满足模式。您得到的结果是因为模式/{(.*.\\\\.(.*)}/
从开始大括号一直匹配到结束大括号。您需要对所有子组使用一个ungreedy匹配
“/{(.*)\\|(.*)}/U”代码>
这将使模式匹配尽可能少的字符,以满足模式。你得到了你得到的结果,因为模式/{(.*\\\\\\.(.*)}/
从左大括号一直匹配到右大括号。将(.*)
更改为([^ |]*)
然后它将匹配除之外的所有字符
然后它将匹配除之外的所有字符。您需要按照*
的?
进行匹配
它将输出以下内容
{To|Preposition}
To
Preposition
请参见您需要按照*
和?
进行匹配
它将输出以下内容
{To|Preposition}
To
Preposition
请参见Ungreedy将无法解决输入中包含{something | something | something}@WizKid的情况。我相信这超出了问题的范围。非常感谢:D工作得非常好!请,请不要使用U
修饰符-它的唯一目的是混淆。当你需要一个懒散/不灵活/不情愿的量词时,只需附加一个:?
,例如*?
(如@hwnd的答案)。此外,对于这个应用程序,最好使用一个更精确的表达式:'/\{([^{}}}]*)\\\\}([^{}]*)\}/'
,它更快、更准确,并且根本不需要点。(事实上,我很想否决这个答案——为了鼓励使用U
),我做了一些关于U修饰符的研究。虽然我找不到任何好的文章详细说明好的实践可能是什么样的,但我确实明白您的观点,?
可能比使用U修饰符更容易访问。我对你的评论投了赞成票,因为它鼓励我重新思考我的答案,思考两种解决方案之间的利弊,但我不欣赏这种敌对态度。你似乎对RegEx非常了解(我检查了你的个人资料),所以你有很多东西要分享-但请以告知和教学为目标,而不是排斥。如果输入包含{something | something | something}@WizKid,Ungreedy将无法解决这个问题,我相信这超出了问题的范围。非常感谢:D工作得很好!请,请不要使用U
修饰符-它的唯一目的是混淆。当你需要一个懒散/不灵活/不情愿的量词时,只需附加一个:?
,例如*?
(如@hwnd的答案)。此外,对于这个应用程序,最好使用一个更精确的表达式:'/\{([^{}}}]*)\\\\}([^{}]*)\}/'
,它更快、更准确,并且根本不需要点。(事实上,我很想否决这个答案——为了鼓励使用U
),我做了一些关于U修饰符的研究。虽然我找不到任何好的文章详细说明好的实践可能是什么样的,但我确实明白您的观点,?
可能比使用U修饰符更容易访问。我对你的评论投了赞成票,因为它鼓励我重新思考我的答案,思考两种解决方案之间的利弊,但我不欣赏这种敌对态度。你似乎对正则表达式非常了解(我检查了你的个人资料),所以你有很多东西要分享——但请以告知和教学为目标,而不是排斥。如果输入包含{something | something | something},Ungreedy将无法解决问题,因为OP的具体需要。如果输入包含{something | something | something}它将满足OP的特定需求。为什么它不起作用?它确保最后一项中没有|字符。您是对的,实际上文本}
停止第二个捕获组,否则第二个捕获组将匹配:“介词}{talk”。但在这种情况下,最好选择[^}]
最后一组。为什么不起作用?它确保最后一个项目中没有|字符。您是对的,实际上文本}
停止第二个捕获组,否则第二个捕获组将匹配:“介词}{talk”。但在这种情况下,最好为最后一个组选择[^ |}]
。
{To|Preposition}
To
Preposition