js校验密码复杂度的正则表达式

本文介绍了三种不同的密码强度验证规则,包括必须包含大小写字母、数字和特殊字符的组合,长度限制在8到30个字符之间。通过正则表达式实现密码强度检查,确保账户安全性。

1、密码中必须包含大小字母、数字、特称字符,至少8个字符,最多30个字符

1 var regex = new RegExp('(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^a-zA-Z0-9]).{8,30}');
2  
3 if (!regex.test('88888aaa')) {
4    alert("密码强度不够。密码中必须包含字母、数字、特殊字符,且长度大于8,小于30");
5 }

 

 

2、密码中必须包含字母、数字、特称字符,至少8个字符,最多30个字符。

var regex = new RegExp('(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{8,30}');

 

 

3、密码中必须包含字母、数字,至少8个字符,最多30个字符。

var regex = new RegExp('(?=.*[0-9])(?=.*[a-zA-Z]).{8,30}');

 

转载于:https://www.cnblogs.com/zrlhss/p/11596044.html

<think>嗯,用户想要生成一个校验经度的正则表达式。首先,我需要回忆一下经度的有效范围。经度的范围是从-180度到+180度,包括这两个值。所以正则表达式需要能够覆盖这个范围内的所有可能值,同时排除无效的输入。 接下来,我需要考虑不同的表示方式。比如,经度可以是整数,也可以包含小数部分。小数部分可能有小数点后跟多位数字,比如123.456。另外,用户可能会输入正数、负数,或者以0开头的数字,比如-0.123或者0.567。还要考虑到前面可能有符号,也可能没有符号,比如东经可以用正数表示,西经用负数,但有时候用户可能直接输入180这样的正值。 然后,我需要处理边界情况。比如,-180.0和180.0都是有效的,但超过这个范围的,比如-180.1或者180.1就不行。另外,像180.0000这样的情况是否允许?可能应该允许,只要整数部分是180,小数部分可以是零或多个数字,但不超过范围。不过要注意,像180.0是有效的,而180.0001就无效了。 接下来,考虑正则表达式的结构。可能分为几个部分:符号部分、整数部分、小数部分。符号部分是可选的,可以是正号或负号。整数部分应该在0到180之间,但需要根据符号的情况调整。比如,如果符号是负号,整数部分最大是180,但如果是正号或者没有符号,整数部分不能超过180。或者,更准确地说,整个数值必须在-180到180之间。 不过,直接处理整个数值的范围在正则表达式中可能比较复杂,因为要同时考虑符号和数值的组合。因此,可能需要将正则表达式分为两种情况:一种是负数的情况,另一种是非负数的情况。 对于负数的情况,经度可以是从-180到0(不包括0),但必须注意-0.0这样的形式是否允许。通常,-0.0可能被视为有效,但实际应用中可能需要处理这种情况,不过正则表达式可能不需要特别处理,因为数值上是0。但需要确保负数的情况中,整数部分不超过180,比如-180.0是允许的,但-180.1不允许。 对于非负数的情况,经度从0到180,包括180.0。这时候,整数部分不能超过180,而且当整数部分是180时,小数部分必须为0,否则超过180就会无效。比如,180.0是有效的,但180.5无效。 所以,可能需要将正则表达式分为两部分:负数的和非负数的。 负数的情况:以负号开头,然后整数部分可以是0到180,但如果是180的话,小数部分必须为0。或者更准确地说,负数部分的绝对值不能超过180,且小数部分如果有的话,整体数值不能超过-180到180的范围。 或者,另一种思路是,将整个数值分为两种情况: 1. 当符号为负时,数值范围是-180到0(包括-180,不包括0) 2. 当没有符号或符号为正时,数值范围是0到180(包括两者) 这样,正则表达式可以拆分为两个部分: 负数的部分: - 必须以负号开头 - 整数部分可以是0到179,或者180后面必须没有小数部分(即180.0是不允许的,因为-180.0是允许的,但-180.0实际上是允许的,所以这里可能需要调整) 或者,更准确地说,负数部分的范围是-180 <= value <= 0。因此: 负数部分可以是: - -180(后面可以有可选的.0或更多0的小数部分) - 或者 -179到-0之间的数,可以有小数部分 同样,非负数部分可以是: - 0到179.999... 或者 180.0... 所以,可能需要将正则表达式拆分为: ^[-+]?(180(\.0+)?|(1[0-7][0-9]|[0-9]{1,2})(\.[0-9]+)?)$ 不过这可能不太准确,因为需要考虑符号和数值的组合。或者,分开处理负数和正数的情况: 对于负数: ^-(180(\.0+)?|1[0-7][0-9](\.[0-9]+)?|[0-9]{1,2}(\.[0-9]+)?)$ 对于非负数: ^\+?(180(\.0+)?|1[0-7][0-9](\.[0-9]+)?|[0-9]{1,2}(\.[0-9]+)?)$ 不过这样可能有问题,因为当符号是正号时,数值不能超过180。比如,+180.0是允许的,但+180.1不允许。所以需要确保当整数部分是180时,小数部分必须为0。 因此,整个正则表达式可以分为两个部分:允许负号、可选正号或无符号,然后数值部分需要满足: 如果是负数: - 整数部分必须小于等于180,并且整体值不超过-180到0的范围 或者更简单地说,负数部分必须满足:-(180(.0+)? | (0到179.999...)) 可能更有效的方式是分开处理: 整个正则表达式可以分为: ^[-+]?(?:180(?:\.0+)?|(?:1[0-7][0-9]|[0-9]{1,2})(?:\.\d+)?)$ 但这样会有问题,因为例如180.5会匹配,但实际应该无效。所以需要确保当整数部分是180时,小数部分只能是0。 因此,正确的处理应该是: 当整数部分是180时,小数部分必须为0或者没有(即允许180或180.0,不允许180.1) 同样,当整数部分小于180时,小数部分可以有任意数字。 因此,可以将正则表达式拆分为两种情况: 1. 允许180或180.0(后面可以有多个零) 2. 允许0到179.999...的数值,包括小数 所以,正则表达式可能是: ^[-+]?(180(\.0+)?|((1[0-7][0-9])|([0-9]{1,2}))(\.\d+)?)$ 但这样仍然有问题,因为对于负数的情况,比如-180.5,这个表达式也会匹配,因为整数部分是180,小数部分是.5,但此时整体数值是-180.5,超过了-180的范围,应该无效。 所以,这里的问题在于,正则表达式无法直接处理数值的范围,只能处理格式。因此,可能需要将正则表达式分为两部分: 对于负数的情况: - 必须以-开头 - 数值部分必须是0到180,包括180,但整体数值是负数,所以实际范围是-180到0(不包括0) 但如何限制这一点呢? 可能更准确的方式是将正则表达式拆分为: 对于负数: ^-( 180(\.0+)? # 允许-180.0等 | # 或 (1[0-7][0-9]|[0-9]{1,2})(\.\d+)? # 0到179.999... )$ 对于非负数(包括正号或没有符号): ^\+?( 180(\.0+)? # 允许+180.0等 | # 或 (1[0-7][0-9]|[0-9]{1,2})(\.\d+)? # 0到179.999... )$ 然后将这两部分用|组合起来,形成完整的正则表达式: ^[-+]?(180(\.0+)?|((1[0-7][0-9]|[0-9]{1,2})(\.\d+)?))$ 或者: ^([-+]?(180(\.0+)?|((1[0-7][0-9]|[0-9]{1,2})(\.\d+)?)))$ 但这样依然无法正确限制负数的情况。例如,-180.1会匹配,因为整数部分是180,小数部分是.1,导致整体数值是-180.1,超过了下限-180,但正则表达式无法检测到这一点。 因此,这似乎是一个问题:正则表达式只能检查格式,而无法直接判断数值范围。因此,必须通过正则表达式的结构来确保数值不会超过范围。 因此,正确的方式是,对于负数部分: - 如果整数部分是180,则小数部分必须为0(即只能-180或-180.0...) - 如果整数部分小于180,则可以有任意小数部分,但整体数值必须大于等于-180 但如何用正则表达式实现这一点呢? 可能的解决方案是: 对于负数: ^-( 180(\.0+)? # 允许-180, -180.0等 | # 或者 (1[0-7][0-9]|[1-9][0-9]|[0-9])(\.\d+)? # 0到179.999... )$ 这样,负数部分只能是-180到0(不包括0),因为整数部分最大是179,或者180但小数部分为0。 对于非负数: ^\+?( 180(\.0+)? # 允许180, 180.0等 | # 或者 (1[0-7][0-9]|[1-9][0-9]|[0-9])(\.\d+)? # 0到179.999... )$ 然后将两部分合并: ^[-+]?(180(\.0+)?|((1[0-7][0-9]|[0-9]{1,2})(\.\d+)?))$ 但这样合并的话,正负号都可以,但需要确保当符号为负时,整数部分不能超过180,并且当符号为负且整数部分是180时,小数必须为0。 因此,正确的正则表达式应该将符号和数值部分组合起来,确保当有负号时,数值部分符合上述条件,而正号或无符号时也是如此。 可能更好的方法是使用正则表达式的负向先行断言,但这样会增加复杂度。 或者,将整个表达式分为两种情况: 1. 匹配-180或-180.0等 2. 匹配-0到-179.999...或者0到179.999...或者+0到+179.999...或者180.0等 但是这样可能会比较复杂。 另一种思路是,允许可选的符号,然后数值部分必须满足: - 如果整数部分是180,小数部分必须为0 - 否则,整数部分在0到179之间,可以有小数部分 同时,如果有负号,整个数值部分必须不超过180,并且当有负号时,数值部分可以是180.0或者小于180的数。 因此,正则表达式可能如下: ^[-+]?((180(\.0+)?)|((0|([1-9][0-9]{0,2}))(\.\d+)?))$ 但这样无法正确限制负数的情况,因为比如-180.5会被允许,但实际应该无效。 这时候,我意识到可能需要将正则表达式拆分为两部分:负数和非负数,并用选择符|来组合。 例如: ^( -? # 负数或非负数 ( 180(\.0+)? # 180或180.0... | # 或 (0|[1-9][0-9]{0,2}) # 0到179的整数部分 (\.\d+)? # 可选的小数部分 ) | - # 或者以负号开头的情况,处理负数的特殊格式 ( 180(\.0+)? # -180.0... | # 或 (0|[1-9][0-9]{0,2})(\.\d+)? # 0到179.999... ) )$ 不过这样似乎重复了,而且可能无法正确覆盖所有情况。 或许更有效的方式是使用正则表达式的分组和条件判断,但JavaScript正则表达式不支持条件语法,而其他语言如Perl或PCRE可能支持,但用户可能希望得到一个通用的正则表达式。 因此,可能需要另一种方法:使用两个部分,一个处理负数,一个处理非负数。 例如: ^(?: [-+]?(?:180(?:\.0+)?|(?:0|[1-9][0-9]{0,2})(?:\.\d+)?) # 非负数和带符号的情况,但可能超过范围 | -(?:180(?:\.0+)?|(?:0|[1-9][0-9]{0,2})(?:\.\d+)?) # 负数情况 )$ 但这仍然无法正确限制负数的情况,比如-181会被排除,因为整数部分181超过三位数吗?不,0到179的整数部分可能用[1-9][0-9]{0,2},即允许1到999,这显然不对。哦,这里有问题,原来的整数部分应该限制在0到179,所以需要调整。 正确的整数部分应该: - 对于非负数,整数部分可以是0到179,或者180(但仅当小数部分为0时) - 对于负数,整数部分可以是0到180(但整体数值必须不小于-180) 但如何用正则表达式表示呢? 可能更好的方式是将整数部分分为: - 当整数部分为180时,小数必须为0 - 否则,整数部分为0到179,可以有小数 同时,允许可选的符号,但处理负数时,整数部分不能超过180。 因此,正则表达式可以这样构造: ^[-+]?(?:180(?:\.0+)?|(?:0|1[0-7][0-9]|[0-9]{1,2})(?:\.\d+)?)$ 这里: - 180(\.0+)? 匹配180或180.0等 - (0|1[0-7][0-9]|[0-9]{1,2}) 匹配0到179的整数部分: - 1[0-7][0-9] 匹配100到179 - [0-9]{1,2} 匹配0到99 - (?:\.\d+)? 允许小数部分 这样,整个表达式可以匹配: - 可选符号 - 180后面只能跟.0或没有小数 - 或者0到179的整数,可以有任意小数 这样,对于负数的情况,比如-180.0是允许的,而-180.1则不会被匹配,因为180后面必须跟.0+,而-180.1的整数部分是180,但小数部分是.1,不符合180(\.0+)?的结构,所以会被拒绝。 同样,比如-179.5会被允许,因为整数部分是179,属于1[0-7][0-9]的范围,小数部分存在。 而-181会被拒绝,因为整数部分181不符合1[0-7][0-9]或[0-9]{1,2}。 这样看来,这个正则表达式可以正确覆盖所有有效的情况: - 180 → 有效 - -180.0 → 有效 - 179.999 → 有效 - 0 → 有效 - 0.000 → 有效 - 180.1 → 无效,因为180后面必须有.0+ - 181 → 无效,整数部分超过179 - -181 → 无效,整数部分不符合 这样应该可以正确匹配所有有效的经度值。 所以,最终的正则表达式是: ^[-+]?(180(\.0+)?|((1[0-7][0-9]|[0-9]{1,2}))(\.\d+)?)$ 测试一些例子: 有效案例: - 180 → 匹配 - +180.0 → 匹配 - -180.0 → 匹配 - 0 → 匹配 - 90.5 → 匹配 - -90.123 → 匹配 - 179.9999 → 匹配 无效案例: - 180.1 → 不匹配,因为180后面只能跟.0+ - 181 → 不匹配,整数部分超过179 - -180.1 → 不匹配,同上 - 90. → 不匹配,小数部分必须有数字 - 1234 → 不匹配,整数部分超过三位数(但正则表达式中,1[0-7][0-9]允许100-179,而[0-9]{1,2}允许0-99,所以整数部分最多三位,但不超过179) 可能还需要考虑前导零的问题,比如012.34这样的输入,但根据正则表达式中的[0-9]{1,2},这会允许0开头,比如012,但实际这可能不正确,因为整数部分不应该有前导零,除非是0本身。 例如,输入012.34可能表示12.34,但前导零是无效的格式。这时候,正则表达式需要禁止前导零,除非数值本身就是0或者小数部分存在。 例如,允许: - 0 → 有效 - 0.5 → 有效 - 12 → 有效 - 012 → 无效,因为整数部分不能有前导零 所以需要调整整数部分的匹配,禁止前导零。例如,将整数部分改为: (0|[1-9][0-9]{0,2}) 但需要保证不超过179。例如: - 0 → 允许 - 1-9 → 允许 - 10-99 → 允许 - 100-179 → 允许 所以,整数部分的正确正则表达式部分应该是: (0|1[0-7][0-9]|[1-9][0-9]|[0-9]) 或者分解为: - 0 → 允许 - 1-9 → [1-9] - 10-99 → [1-9][0-9] - 100-179 → 1[0-7][0-9] 因此,合并为: (0|1[0-7][0-9]|[1-9][0-9]|[1-9]) 但可以简化为: (0|([1-9][0-9]{0,1})|1[0-7][0-9]) 或者更清晰的写法: (0|([1-9]\d?)|1[0-7]\d) 这样,整数部分不允许前导零,除了单独的0。 因此,调整后的正则表达式: ^[-+]?(180(\.0+)?|0(\.\d+)?|([1-9]\d?|1[0-7]\d)(\.\d+)?)$ 这样: - 180(\.0+)? → 处理180的情况 - 0(\.\d+)? → 处理0和0.xxx的情况 - ([1-9]\d?|1[0-7]\d)(\.\d+)? → 处理1-179的整数,允许小数 这样,前导零的问题被解决,比如012会被拒绝,因为整数部分必须是0或者不以零开头的数字。 例如: - 0 → 有效 - 0.5 → 有效 - 12 → 有效 - 012 → 无效,因为整数部分只能是0或以1-9开头 - 123 → 有效(如果123<=179的话?哦,123是有效的,因为1[0-7]\d中的123的十位是2,属于0-7,所以允许。例如,179是允许的,180由前面的部分处理。 所以,这个正则表达式现在可以正确限制整数部分的范围,同时禁止前导零。 综上,最终的经度校验正则表达式应该是: ^[-+]?(180(\.0+)?|((0|([1-9]\d?)|1[0-7]\d))(\.\d+)?)$ 再测试一些案例: 有效: - 0 → 有效 - 0.0 → 有效 - 90 → 有效 - -90 → 有效(假设符号处理正确) - +180.0 → 有效 - 179.9 → 有效 - 1 → 有效 无效: - 180.1 → 无效 - 181 → 无效 - -180.1 → 无效 - 012 → 无效(前导零) - 0. → 无效(需要小数部分) - .5 → 无效(整数部分缺失) - 1234 → 无效 但是,当前的表达式可能仍然存在问题,比如符号的处理。例如,符号是可选的,所以表达式允许像+180.0,-0.5等情况,这些都是有效的经度值。 因此,最终的正则表达式应该是: ^[-+]?(180(\.0+)?|((0|([1-9]\d?)|1[0-7]\d))(\.\d+)?)$ 同时,可能需要允许-0.5这样的情况,这在经度中是有效的,因为西经0.5度可以表示为-0.5。所以,符号的处理是正确的。 此外,还需要考虑像-0这样的输入,这在正则表达式中会被允许,因为0是有效的,加上负号后变成-0,但实际应用中可能被视为0,但正则表达式仍然允许这种情况,因为经度的范围包括-180到180,而-0是允许的。 综上,这个正则表达式应该能够正确校验经度的有效性。</think>要生成一个校验经度的正则表达式,我们需要确保输入值在有效范围(-180.0 到 180.0)内,并符合数值格式。以下是逐步实现的方案: --- ### **步骤 1:明确经度的规则** 1. **范围要求**: - 最小值为 `-180.0`(西经180度) - 最大值为 `180.0`(东经180度) 2. **格式要求**: - 可包含**正负号**(`+` 或 `-`),符号为可选项。 - 可为整数或小数(如 `90`、`-45.5`)。 - 若为 `180` 或 `-180`,小数部分必须为 `.0`(如 `180.0` 有效,`180.1` 无效)。 - 禁止前导零(如 `012.3` 无效,除非值为 `0`)。 --- ### **步骤 2:构建正则表达式** 通过以下规则逐层组合: 1. **符号部分**: ```regex [-+]? ``` 可选正负号。 2. **整数部分**: - `180` 必须单独处理,且小数部分必须为 `.0`。 - 其他整数范围:`0` 到 `179`,禁止前导零。 ```regex (180(\.0+)?) # 匹配 180 或 180.0 | # 或 (0|([1-9]\d?)|1[0-7]\d) # 匹配 0-179(禁止前导零) ``` 3. **小数部分**: ```regex (\.\d+)? # 可选小数部分 ``` --- ### **最终正则表达式** 合并上述规则,得到完整的正则表达式: ```regex ^[-+]?(180(\.0+)?|0(\.\d+)?|([1-9]\d?|1[0-7]\d)(\.\d+)?)$ ``` --- ### **正则表达式解析** - `^` 和 `$`:匹配字符串的**开始和结束**,确保输入无多余字符。 - `[-+]?`:可选的**正负号**。 - `180(\.0+)?`:匹配 `180` 或 `180.0`、`180.00` 等。 - `0(\.\d+)?`:匹配 `0` 或 `0.123`。 - `([1-9]\d?|1[0-7]\d)(\.\d+)?`:匹配 `1` 到 `179` 的整数或小数(禁止前导零)。 --- ### **测试案例** | 输入值 | 是否有效 | 说明 | |-------------|----------|----------------------| | `180.0` | ✔️ | 最大值(含小数) | | `-180.0` | ✔️ | 最小值(含小数) | | `90.5` | ✔️ | 正常小数 | | `-45.123` | ✔️ | 负小数 | | `0` | ✔️ | 零值 | | `012.3` | ❌ | 前导零无效 | | `180.1` | ❌ | 超过最大值 | | `181` | ❌ | 整数超出范围 | | `123.` | ❌ | 小数部分缺失 | --- ### **代码示例(JavaScript)** ```javascript const longitudeRegex = /^[-+]?(180(\.0+)?|0(\.\d+)?|([1-9]\d?|1[0-7]\d)(\.\d+)?)$/; // 测试函数 function validateLongitude(value) { return longitudeRegex.test(value); } ``` 通过上述正则表达式,可以准确校验经度的有效性和格式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值