为了账号安全,请及时绑定邮箱和手机立即绑定

匹配正则表达式的随机字符串

/ 猿问

匹配正则表达式的随机字符串

largeQ 2019-10-11 14:38:56

您将如何创建与某个正则表达式匹配的随机字母数字字符串?

这是专门用于创建满足常规密码要求的初始密码。


查看完整描述

3 回答

?
慕容708150

韦尔普,只是在沉思,但总的来说,生成与正则表达式匹配的随机输入对我来说是可行的,因为它对随机性的定义足够宽松,对正则表达式的定义足够严格。我在考虑经典的形式定义,该定义只允许()| *和字母字符。

正则表达式可以映射到称为有限自动机的形式机。这样的机器是有向图,具有一个称为最终状态的特定节点,一个称为初始状态的节点以及每个边缘上的字母组成的字母。如果可以从初始状态开始并遍历图形中遍历每个字符标记的一条边并在最终状态结束,则正则表达式会接受一个单词。

可以构建图形,然后从最终状态开始,然后向后遍历随机边,以跟踪路径。在标准构造中,图中的每个节点都可以从初始状态到达,因此您不必担心会犯不可恢复的错误并需要回溯。如果达到初始状态,请停止并读取前进的路径。那是您正则表达式的匹配项。

但是,对于何时或是否达到初始状态并没有特别的保证。人们将必须弄清楚所生成的字符串在何种意义上是“随机的”,以及您首先希望从该语言中获取随机元素的含义。

不过,也许这是思考该问题的起点!

既然我已经写了出来,在我看来,重复解析选择以简化正则表达式模式可能会更简单,直到剩下一个简单的字符串为止。查找模式中的第一个非字母字符。如果是*,请复制前几项并删除*。如果是|,则选择保留或删除其余项目。对于左括号,请执行相同的操作,但要查看匹配的右括号后面的字符。如果先将正则表达式解析为树表示形式,这样会使paren分组结构更易于使用,这可能会更容易。

对于担心确定正则表达式是否实际匹配任何东西的人来说,这等同于停止问题:不,常规语言的行为非常好。您可以判断是否有两个正则表达式描述了同一组接受的字符串。您基本上是在上面制造机器,然后遵循一种算法来产生规范的最小等效机器。对两个正则表达式执行此操作,然后检查生成的最小机器数量是否相等,这很简单。


查看完整回答
反对 回复 2019-10-11
?
UYOU

Perl中的String :: Random将根据正则表达式的子集生成一个随机字符串:


#!/usr/bin/perl


use strict;

use warnings;


use String::Random qw/random_regex/;


print random_regex('[A-Za-z]{3}[0-9][A-Z]{2}[!@#$%^&*]'), "\n";


查看完整回答
反对 回复 2019-10-11
?
喵喔喔

如果您有特定的问题,则可能要记住特定的正则表达式。我将采用该正则表达式,用简单的人类术语弄清楚它的含义,然后从那里开始工作。


我怀疑可以创建一个通用的正则表达式随机匹配生成器,但是它可能比仅处理一个特定案例要花更多的工作-即使该案例每年更改几次。


(实际上,从最一般的意义上讲,可能无法生成随机匹配-我有一个模糊的记忆,即“任何字符串都与此正则表达式匹配的问题”是变相的暂停问题。使用非常精简的正则表达式语言不过,您可能会有更多的运气。)


查看完整回答
反对 回复 2019-10-11

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信