Php 如何使用正则表达式以随机顺序匹配所需字符?

Php 如何使用正则表达式以随机顺序匹配所需字符?,php,regex,Php,Regex,我需要匹配包含@、#和其中任何数字的文本。只要字符在文本中,它们就可以处于随机位置。鉴于这一投入: abc@#d9 a9b#c@d @@abc#9 abc9d@@ a#b#c@d 正则表达式应该匹配前3行。目前我的正则表达式是: /@.*?#.*?[0-9]/ 这不起作用,因为它只能按顺序匹配三个字符。如何以随机顺序匹配这三个字符?使用单独的表达式确保@和#存在。完成后,删除它们并匹配其余字符/数字 找到了一个丑陋的正则表达式,如果你真的必须使用它: /(?=.*@)(?=...#)(?=.

我需要匹配包含
@
#
和其中任何数字的文本。只要字符在文本中,它们就可以处于随机位置。鉴于这一投入:

abc@#d9
a9b#c@d
@@abc#9
abc9d@@
a#b#c@d
正则表达式应该匹配前3行。目前我的正则表达式是:

/@.*?#.*?[0-9]/

这不起作用,因为它只能按顺序匹配三个字符。如何以随机顺序匹配这三个字符?

使用单独的表达式确保@和#存在。完成后,删除它们并匹配其余字符/数字

找到了一个丑陋的正则表达式,如果你真的必须使用它:

/(?=.*@)(?=...#)(?=.[0-9])。/

正则表达式基本上使用的是他们所称的
lookahead

上面链接中的一个简单例子是尝试匹配
q
,然后是
u
,通过执行
q(?=u)
,这就是为什么它被称为
lookahead
,它会发现
q
,然后是
u

让我们举一个有效的例子:
a9b#c@d

第一个前瞻是
(?=.*@)
,它表示:匹配任何内容,后跟
@
。确实如此,这是字符串
a9b#c
,然后由于必须放弃来自前瞻的匹配,引擎返回到字符串的开头,这是一个
a
。然后是

(?=.*.#)
,它表示:匹配任何后跟
.
的内容,然后在
a9b
中找到它。等等。使用前瞻和
(a)(b)(c)
之间的区别基本上是后退

从上面的链接:

让我们再看一看里面,以确保您理解 前瞻的含义。让我们应用q(?=u)i退出。我有 使前瞻为正,并在其后放置一个标记。再说一遍,q 匹配q和u匹配u同样,来自前瞻的匹配必须是 丢弃,因此引擎从字符串中的i后退到u。这个 向前看是成功的,所以引擎继续使用i。但我不能 匹配你。所以这次比赛失败了。所有剩余的尝试都将失败 同样,因为字符串中没有更多的q


它很难看,因为它很难维护。。。括号内基本上有3个不同的子正则表达式。

决定我最好写下以下内容作为答案:

$text = "a9b#c@d";
$themAll = "#@";
$themAny = "0123456789";
echo (strspn($themAll, $text)==strlen($themAll) && strpbrk($text, $themAny));

对于维护和一些(有限的)扩展,这应该是很容易的,尤其是当
$themAll
列表较长时。

为这个正则表达式添加一些解释会更好。我需要“this ught regex”中关于“ught”部分的解释,因为“this ught regex”为简化任务付出了太多的努力。是这样吗?您的解决方案是什么?+1,因为它更清晰、更易于编写和维护。或者,简单的字符串操作也可以做到这一点。如果不是[0-9],你可以很容易地使用字符串函数,这样使用会有点麻烦,但即使使用字符串函数,也不需要用任何东西替换任何东西——搜索已经足够好了。例如:
echo(strspn(“#@,”@@abc#9”)==2和strpbrk(“@@abc#9”,“0123456789”)