[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}+$)((?!(?<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")
}

特别感谢

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值