機械の総合病院
这道题是一个判断字符串是否满足条件的简单题目,使用常规方法遍历每个字母来判断是否满足每个条件十分容易想到如何编写。不过,既然是判断字符串字符串是否满足条件,何尝不试一试正则表达式呢?
题目链接:https://paiza.jp/botchi/challenges/botchi_c_3002
题目描述
PAIZA病院のシステムを解析します。
不正アクセスを試みるクラッカーからユーザーを守るために、ユーザーが設定するパスワードが十分に複雑であるようにしなくてはなりません。
PAIZA病院は、パスワードの複雑さの条件として以下の 3 つを定めました。
・長さが 6 以上
・英字と数字の両方を含む必要がある
・同じ文字を 3 つ以上連続で使用することはできない
なお、英字の大文字と小文字は区別する必要はありません。
パスワードの候補が入力として与えられるので、複雑さの条件をすべて満たす場合は “Valid”、そうでない場合は “Invalid” と出力してください。
例えば、入力例 1 で与えられる 7Caaad9 は 1 つ目の条件と 2 つ目の条件を満たしますが、aaa と 3 つ以上同じ文字が連続で使用されているため、複雑さの条件をすべて満たしません。
输入
t
・パスワードの候補となる文字列 t が与えられます。
・入力は 1 行となり、末尾に改行が 1 つ入ります。
・1 ≦ (t の長さ) ≦ 30
・文字列 t は半角英字あるいは半角数字で構成された文字列
输出
パスワードが複雑
さの要件をすべて満たす場合は “Valid”、そうでない場合は “Invalid” と出力してください。
样例1
样例输入
7Caaad9
样例输出
Invalid
样例2
样例输入
DjZGrduN8Mj4
样例输出
Valid
题解
这道题是一个判断字符串是否满足条件的简单题目,使用常规方法遍历每个字母来判断是否满足每个条件十分容易想到如何编写。不过,既然是判断字符串字符串是否满足条件,何尝不试一试正则表达式呢?
使用到的正则表达式如下,我们来一点一点刨析这个正则表达式的意思
^(?!\d+$)(?!\p{Alpha}+$)((?!(?<ch>.)\k<ch>\k<ch>)\p{Alnum}){6,}$
- 最左则的
^
和最右侧的$
,表示整个文本应当由之间的正则表达式构成 (?!\d+$)
,使用断言,判断到结尾为止不能全是数字(?!\p{Alpha}+$)
,使用断言,判断到结尾为止不能全是字母(?!(?<ch>.)\k<ch>\k<ch>)
,使用后向引用和断言,判断不会出现连续的三个字符,其中ch
是后向引用匹配组的命名((?!(?<ch>.)\k<ch>\k<ch>)\p{Alnum}){6,}
,在不出现连续三个字符的前提下,寻找6个及以上的字母与数字
因此,使用这个正则表达式便可以判断一个字符串是否符合题目的要求
- 长度为6位及以上
- 同时包含数字和字母
- 不能有连续的3个字符
代码
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.regex.Pattern
fun main(args: Array<String>) {
val pat = Pattern.compile("^(?!\\d+\$)(?!\\p{Alpha}+\$)((?!(?<ch>.)\\k<ch>\\k<ch>)\\p{Alnum}){6,}\$")
val br = BufferedReader(InputStreamReader(System.`in`))
val mat = pat.matcher(br.readLine())
print(if (mat.matches()) "Valid" else "Invalid")
}