java正则表达式校验密码必须是包含大小写字母、数字、特殊符号的8位以上组合...

一、需求:密码必须是包含大写字母、小写字母、数字、特殊符号(不是字母,数字,下划线,汉字的字符)的8位以上组合

二、方案:利用正则表达式来校验

三、思路:排除法

  1、排除大写字母、小写字母、数字、特殊符号中1种组合、2种组合、3种组合,那么就只剩下4种都包含的组合了

  2、表达式为:^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{8,}$

  3、拆分解释:其中(2)-(6)运用了零宽断言、环视等正则功能

    (1)^匹配开头

    (2)(?![A-Za-z0-9]+$)匹配后面不全是(大写字母或小写字母或数字)的位置,排除了(大写字母、小写字母、数字)的1种2种3种组合

    (3)(?![a-z0-9\\W]+$)同理,排除了(小写字母、数字、特殊符号)的1种2种3种组合

    (4)(?![A-Za-z\\W]+$)同理,排除了(大写字母、小写字母、特殊符号)的1种2种3种组合

    (5)(?![A-Z0-9\\W]+$)同理,排除了(大写字母、数组、特殊符号)的1种2种3种组合

    (6)[a-zA-Z0-9\\W]匹配(小写字母或大写字母或数字或特殊符号)因为排除了上面的组合,所以就只剩下了4种都包含的组合了

    (7){8,}8位以上

    (8)$匹配字符串结尾

四、代码:

public class RegexTest {
public static final String PW_PATTERN = "^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{8,}$"; public static void main(String[] args) { String pw1 = "ABCDEFGHIG"; String pw2 = "abcdefghig"; String pw3 = "0123456789"; String pw4 = "!@#$%^&*()"; String pw5 = "ABCDEabcde"; String pw6 = "ABCDE01234"; String pw7 = "ABCDE!@#$%"; String pw8 = "abcde01234"; String pw9 = "abcde!@#$%"; String pw10 = "01234!@#$%"; String pw11 = "abcde01234!@#$%"; String pw12 = "ABCDE01234!@#$%"; String pw13 = "ABCDEabcde!@#$%"; String pw14 = "ABCDEabcde01234"; String pw15 = "Aa0!"; //符合要求密码 String pw16="ABCabc012!@#"; System.out.println(pw1.matches(PW_PATTERN)); System.out.println(pw2.matches(PW_PATTERN)); System.out.println(pw3.matches(PW_PATTERN)); System.out.println(pw4.matches(PW_PATTERN)); System.out.println(pw5.matches(PW_PATTERN)); System.out.println(pw6.matches(PW_PATTERN)); System.out.println(pw7.matches(PW_PATTERN)); System.out.println(pw8.matches(PW_PATTERN)); System.out.println(pw9.matches(PW_PATTERN)); System.out.println(pw10.matches(PW_PATTERN)); System.out.println(pw11.matches(PW_PATTERN)); System.out.println(pw12.matches(PW_PATTERN)); System.out.println(pw13.matches(PW_PATTERN)); System.out.println(pw14.matches(PW_PATTERN)); System.out.println(pw15.matches(PW_PATTERN)); System.out.println(pw16.matches(PW_PATTERN)); } }

输出结果除最后一行外全是false,即只有最后一个密码是符合要求的

五、参考:

  1、《精通正则表达式》第三版 P59用环视功能为数值添加逗号,P129锚点及其他“零长度断言”

  2、正则表达式30分钟入门教程

转载于:https://www.cnblogs.com/feynman61/p/9419640.html

<think>嗯,用户想用Java正则表达式校验文件路径,只能包含斜杠、反斜杠、点、连字符、下划线,还有数字大小写字母。首先,我得确定这些允许的字符具体有哪些,然后构建对应的正则表达式。 首先,允许的字符包括:大小写字母A-Za-z,数字0-9,以及特殊符号/、\、.-、_。在正则表达式中,这些特殊符号有些可能需要转义,比如反斜杠\本身在Java字符串中需要写成两个反斜杠\\,所以在正则里要匹配一个反斜杠的话,应该写成\\\\,因为Java中每个反斜杠都需要转义一次。 然后,文件路径可能有多个层级,比如目录分隔符之后还有更多的字符。所以需要考虑路径中的每个部分都是由允许的字符组成,并且中间用分隔符隔开。不过用户可能只需要校验整个路径字符串是否符合字符要求,而不管路径结构是否正确,比如是否以分隔符开头结尾,者是否存在连续的多个分隔符。所以是否需要考虑这些结构问题呢?用户没特别说明,可能只需要字符的校验,不涉及路径结构的合法性。 所以,正则表达式应该匹配整个字符串,由允许的字符组成,包括这些特殊符号。需要排除其他字符。那正则表达式可以写成:^[A-Za-z0-9/\\\\\\.\\-_]+$。这里的^$表示整个字符串从头到尾都必须符合这个规则。字符类中的每个特殊字符是否需要转义呢?在正则中,反斜杠、点号、连字符需要注意。 在字符类中,连字符-如果不是在第一个最后一个置,者没有用转义的话,会被当作范围符,比如a-z。所以为了避免歧义,应该将-放在字符类的最后者最前面,者转义。这里可以选择放在最后,并且不转义,例如写成[A-Za-z0-9/\\\\\\._-],不过可能更安全的是转义,比如\\-。因为在Java字符串中,反斜杠需要转义,所以写成\\\\-者其实在字符类中,只要-不在可能形成范围的置,比如放在末尾,可以不用转义。例如,[a-z-]这样,最后的-不会被当作范围符。所以可能正确的写法是[A-Za-z0-9/\\\\._-],但要注意顺序。 另外,点号.在正则中通常表示任意字符,但在字符类中,如果不在特定置,可能不需要转义。比如在字符类中,.就是普通的字符,所以可以直接写成\.者直接.?不过测试一下:在字符类中,例如[.]就代表匹配点号本身,不需要转义。不过在Java字符串中,点号写成普通的即可,不过可能需要转义吗?例如,在正则中,字符类里的点号不需要转义,所以直接放进去即可。例如,[a-z.]会匹配小写字母点号。所以正确的处理方式是在字符类中直接包含.,不需要转义。但有时候为了清晰,可能转义,但实际不需要。 所以,综合起来,正确的字符类应该包括: A-Za-z0-9,然后特殊符号:/、\\(在正则中是\,Java中需要写成\\\\)、.-、_。所以正则表达式应该是: ^[A-Za-z0-9/\\\\._-]+$ 不过要注意连字符的置。如果放在中间,可能会导致范围的问题。比如,如果写成[A-Za-z0-9/\\\\._-],其中-置在最后,这样就不会被误认为是范围符。所以正确的写法应该是将连字符放在最后者转义。 例如:[A-Za-z0-9/\\\\._-],者使用转义形式[A-Za-z0-9/\\\\\\.\\-_]。不过可能后者更安全,特别是在不同的正则引擎中可能有不同的处理方式。者,在Java中,正确的转义应该如何处理? 测试一下,假设连字符放在字符类的末尾,不转义,那么应该没有问题。例如,正则表达式写成^[A-Za-z0-9/\\\\._-]+$,这样在Java字符串中,需要写成: String regex = "^[A-Za-z0-9/\\\\\\._-]+$"; 这样,因为在Java字符串中,每个反斜杠需要转义一次,所以正则中的\\写成\\\\,而点号在字符类中不需要转义,但为了保险,可能还是转义?者不需要? 例如,在正则的字符类中,点号.不需要转义,所以直接放进去即可。所以正确的Java字符串应该是: "^[A-Za-z0-9/\\\\\\._-]+$" 者可能不需要转义点号?比如,在字符类中的点号是否会被视为普通字符。是的,字符类中的点号不需要转义。因此,正确的正则应该是: ^[A-Za-z0-9/\\\\._-]+$ 也就是在Java字符串中,写成: "^[A-Za-z0-9/\\\\\\._-]+$" 因为每个反斜杠在Java字符串中需要写成两个反斜杠。所以正则中的每个\对应Java字符串中的两个反斜杠。 现在,检查各个字符是否正确: - / 直接写即可,不需要转义。 - \ 在正则中需要转义为\\,所以在Java字符串中是\\\\。 - . 在字符类中不需要转义,直接写。 - - 放在字符类的最后,不需要转义。 - _ 直接写。 所以,最终的正则表达式应该是: ^[A-Za-z0-9/\\\\\\._-]+$ 然后测试这个正则是否符合要求。例如,正确的路径如:/home/user/dir/file.txt,者C:\\Users\\name\\file.doc,者相对路径如../test-123_abc。 另外,需要注意是否允许空字符串。如果路径不能为空,则+是正确的,如果是允许空的话,应该用*,但显然文件路径不能为空,所以用+。 可能还需要考虑路径是否允许空格?用户明确指出只能包含这些字符,所以空格不允许。所以如果有空格的话会被拒绝。 所以,完整的Java代码示例: 使用PatternMatcher类,者String的matches方法。 例如: String path = "C:\\Users\\test_dir/file-v1.0.txt"; boolean isValid = path.matches("^[A-Za-z0-9/\\\\\\._-]+$"); 者: Pattern pattern = Pattern.compile("^[A-Za-z0-9/\\\\\\._-]+$"); Matcher matcher = pattern.matcher(path); boolean isValid = matcher.matches(); 需要注意,在Windows路径中,反斜杠是常见的,而Unix路径使用正斜杠。但用户可能希望同时允许两者。所以正则中的/\\都是允许的。 另外,可能要考虑路径中的其他合法字符,比如冒号(在Windows的盘符中有C:),但用户给出的允许字符中没有冒号,所以可能用户的需求不包含盘符的情况?比如用户可能希望校验的是路径中的各个部分,而不是完整的带盘符的路径。者用户可能希望允许类似C:/path这样的形式?这时候需要包含冒号,但用户没有提到,所以需要确认。 根据用户的问题,用户要求只能包含/ \.-_ 以及数字大小写字母,所以冒号不在允许的列表中。因此,类似C:\Users的路径会因为包含:而不被匹配,这可能不符合实际需求。这可能是一个问题,用户是否需要考虑盘符的情况? 这时候可能需要用户进一步说明,但根据当前的问题描述,用户给出的允许字符不包含冒号,所以正则表达式不会允许。这时候如果用户希望允许盘符(如C:\),可能需要调整正则,但根据当前的要求,应该按照用户给定的字符来构建。 综上,正确的正则表达式应为:^[A-Za-z0-9/\\\\\\._-]+$,并且需要注意在Java字符串中转义反斜杠。</think>要使用Java正则表达式校验文件路径,要求路径中仅包含 **大小写字母数字、正斜杠 `/`、反斜杠 `\`、点 `.`、连字符 `-`、下划线 `_**,可按以下步骤实现: --- ### 步骤 1:构建正则表达式 允许的字符范围: - 字母:`A-Za-z` - 数字:`0-9` - 符号:`/`、`\`、`.`、`-`、`_` 正则表达式需满足: 1. **符号需转义**:反斜杠 `\` 在Java字符串中需写成 `\\\\`,点 `.` 需转义为 `\\.`(避免被识别为任意字符)。 2. **连字符置**:将 `-` 放在字符组末尾开头,避免被误认为范围符号(如 `a-z`)。 最终正则: ```java String regex = "^[A-Za-z0-9/\\\\\\._-]+$"; ``` --- ### 步骤 2:编写Java代码示例 ```java import java.util.regex.Pattern; import java.util.regex.Matcher; public class FilePathValidator { public static boolean validatePath(String path) { String regex = "^[A-Za-z0-9/\\\\\\._-]+$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(path); return matcher.matches(); } public static void main(String[] args) { String[] testPaths = { "C:\\Users\\test_dir/file-v1.0.txt", // 合法 "/home/user/docs_2023/data.csv", // 合法 "invalid/path/with*star", // 非法(含*) "another\\invalid:file" // 非法(含:) }; for (String path : testPaths) { System.out.println(path + " : " + validatePath(path)); } } } ``` --- ### 步骤 3:关键点说明 1. **正则细节**: - `^...$`:严格匹配整个字符串,确保无额外字符。 - `[...]`:字符组定义允许的字符。 - `+`:至少一个字符(空路径不合法)。 2. **符号处理**: - 反斜杠 `\`:正则中需写为 `\\\\`(Java字符串转义 + 正则转义)。 - 点 `.`:需转义为 `\\.`,避免被识别为任意字符。 - 连字符 `-`:放在字符组末尾,避免范围歧义。 3. **测试用例**: - 合法路径:允许 `/`、`\`、`.`、`-`、`_`。 - 非法路径:包含 `*`、`:` 等未允许的字符。 --- ### 常见问题 **Q1:能否允许空格中文?** 修改正则,在字符组中添加 `\\u4e00-\\u9fa5`(中文) ` `(空格)。 **Q2:如何校验绝对路径(如以 `/` 盘符开头)?** 需调整正则结构,例如: ```java // 示例:Unix绝对路径Windows盘符路径 String regex = "^(/?[A-Za-z]:)?[A-Za-z0-9/\\\\\\._-]+$"; ``` --- 通过上述方法,可严格限制文件路径的字符范围,确保安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值