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”)代码>