Php 正则表达式匹配编号后面不带连字符

Php 正则表达式匹配编号后面不带连字符,php,regex,Php,Regex,我和正则表达式一起工作了很多年,从来没有在编写正则表达式时遇到过这么多麻烦。我正在使用PHP7.2.2的preg_match()返回一个匹配数字数组进行解析,因此在正则表达式中使用paren 我试图匹配一个或多个数字,后面跟一个“x”,后面跟一个或多个数字,而整个字符串后面没有连字符。当$input为“18x18”或“18x18-”时,匹配项为18和1。当$input为“8x8”时,没有匹配项。我似乎在做一些根本错误的事情 <?php $input = "18x18";

我和正则表达式一起工作了很多年,从来没有在编写正则表达式时遇到过这么多麻烦。我正在使用PHP7.2.2的
preg_match()
返回一个匹配数字数组进行解析,因此在正则表达式中使用paren

我试图匹配一个或多个数字,后面跟一个“x”,后面跟一个或多个数字,而整个字符串后面没有连字符。当$input为“18x18”或“18x18-”时,匹配项为18和1。当$input为“8x8”时,没有匹配项。我似乎在做一些根本错误的事情

<?php
$input = "18x18";    
preg_match("/(\d+)x(\d+)[^-]/", $input, $matches);
之所以有paren,是因为我使用PHP的preg_match返回一个匹配数组。我知道什么时候应该转义连字符,我已经尝试了两种方法来确定,但是得到了相同的结果。为什么不匹配?

您可以使用

'~(\d+)x(\d++)(?!-)~'
它也可以不使用所有格量词编写,因为lookahead中的
\d
也会禁止部分匹配第二个数字块

或者,除了“前瞻”之外,您还可以使用单词边界:

'~\b(\d+)x(\d+)\b(?!-)~'
请参阅和

详细信息

  • (\d+)(\d+)(?!-)
    /
    (\d+)(![-\d])
    -匹配并捕获1个或多个数字到第1组,然后匹配
    x
    ,然后以占有方式匹配并捕获一个或多个数字到第2组,而不允许回溯到数字匹配模式,以及
    (?!-)
    负前瞻检查(确保当前位置后没有
    -
    )在
    \d++
    匹配它能匹配的所有数字后执行一次。如果
    \d+(?![-\d])
    ,首先匹配1+个数字,然后负前瞻确保当前位置右侧没有数字和
    -
  • \b(\d+)\x(\d+)\b(?)
    -首先匹配单词边界,然后匹配并捕获1个或多个数字到组1,然后匹配
    x
    ,然后匹配并捕获一个或多个数字到组2,然后断言有单词边界,然后才确保后面没有
    -
见a:

输出:

18x18: 18 - 18
18x18: 18 - 18
你可以用

'~(\d+)x(\d++)(?!-)~'
它也可以不使用所有格量词编写,因为lookahead中的
\d
也会禁止部分匹配第二个数字块

或者,除了“前瞻”之外,您还可以使用单词边界:

'~\b(\d+)x(\d+)\b(?!-)~'
请参阅和

详细信息

  • (\d+)(\d+)(?!-)
    /
    (\d+)(![-\d])
    -匹配并捕获1个或多个数字到第1组,然后匹配
    x
    ,然后以占有方式匹配并捕获一个或多个数字到第2组,而不允许回溯到数字匹配模式,以及
    (?!-)
    负前瞻检查(确保当前位置后没有
    -
    )在
    \d++
    匹配它能匹配的所有数字后执行一次。如果
    \d+(?![-\d])
    ,首先匹配1+个数字,然后负前瞻确保当前位置右侧没有数字和
    -
  • \b(\d+)\x(\d+)\b(?)
    -首先匹配单词边界,然后匹配并捕获1个或多个数字到组1,然后匹配
    x
    ,然后匹配并捕获一个或多个数字到组2,然后断言有单词边界,然后才确保后面没有
    -
见a:

输出:

18x18: 18 - 18
18x18: 18 - 18

你想这样做吗?PCRE正则表达式不应该与不支持所有格量词的Python
re
混淆,因此它不能作为重复项关闭。这个问题不是关于所有格量词的使用。它是关于匹配不后跟字符的内容。如图所示,单词边界解决方案如何满足这两个条件
python
php
。不,这并不总是足够的。单词边界根本不是一个解决方案,它是一个解决办法。
(\d+)\x(\d+)\b(?)
中的大小是
12x24size
,而
(\d+)\d+)(?!-)
12x24size
不是OP要求的一部分。要求应该来自OP而不是发布的答案。你想这样吗?PCRE正则表达式不应该与不支持所有格量词的Python
re
相混淆,因此它不能作为重复项关闭。这个问题不是关于所有格量词的使用。它是关于匹配不后跟字符的内容。如图所示,单词边界解决方案对于
python
php
都是足够的。不,它并不总是足够的。单词边界根本不是一个解决方案,它是一个解决方法。
(\d+)x(\d+)\b(?)
中的大小是
12x24size
,而
(\d+)x(\d++)(?!-)
12x24size
不是OP要求的一部分。要求应该来自OP,而不是发布的答案。此外,有关所有格量词的更多信息,请参阅(由于我自己感到困惑,我将此留在这里)@Zenoo我添加了一个不使用所有格量词的等效模式。我惊讶于这有多么复杂,但它工作得非常完美。如此简单的事情应该更容易完成。我以前从未使用过所有格量词或单词边界。我需要学习以了解它们的用法。谢谢!此外,请参阅关于所有格量词的更多信息(我把这个留在这里,因为我自己也很困惑)@Zenoo我添加了一个不使用所有格量词的等效模式。我惊讶于这有多么复杂,但它工作得非常完美。如此简单的事情应该更容易完成。我以前从未使用过所有格量词或单词边界。我需要学习了解它们的用法。谢谢!