java 正则 整形 文字列_[paiza][botchi] 机械の総合病院 正则表达式 题解

机械の総合病院

这道题是一个判断字符串是否满足条件的简单题目,使用常规方法遍历每个字母来判断是否满足每个条件十分容易想到如何编写。不过,既然是判断字符串字符串是否满足条件,何尝不试一试正则表达式呢?

题目链接: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}+$)((?!(?.)\k\k)\p{Alnum}){6,}$

最左则的^和最右侧的$,表示整个文本应当由之间的正则表达式构成

(?!\d+$),使用断言,判断到结尾为止不能全是数字

(?!\p{Alpha}+$),使用断言,判断到结尾为止不能全是字母

(?!(?.)\k\k),使用后向引用和断言,判断不会出现连续的三个字符,其中ch是后向引用匹配组的命名

((?!(?.)\k\k)\p{Alnum}){6,},在不出现连续三个字符的前提下,寻找6个及以上的字母与数字

因此,使用这个正则表达式便可以判断一个字符串是否符合题目的要求

长度为6位及以上

同时包含数字和字母

不能有连续的3个字符

代码

import java.io.BufferedReader

import java.io.InputStreamReader

import java.util.regex.Pattern

fun main(args: Array) {

val pat = Pattern.compile("^(?!\\d+\$)(?!\\p{Alpha}+\$)((?!(?.)\\k\\k)\\p{Alnum}){6,}\$")

val br = BufferedReader(InputStreamReader(System.`in`))

val mat = pat.matcher(br.readLine())

print(if (mat.matches()) "Valid" else "Invalid")

}

特别感谢

感谢神奇海螺(IzzelAliz)提供了上文中的正则表达式以及优质的正则表达式教程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值