提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目
给定一个由多个命令字组成的命令字符串:
1、字符串长度小于等于127字节,只包含大小写字母,数字下划线和偶数个双引号;
2、命令字之间以一个或多个下划线_进行分割;
3、可以通过两个双引号””来标识包含下划线 的命令字或空命令字(仅包含两个双引号的命令字),双引号不会在命令字内部出现;
请对指定索引的敏感字段进行加密,替换为******(6个*)并删除命令字前后多余的下划线_。
如果无法找到指定索引的命令字,输出字符串 ERROR。
输入描述
输入为两行,第一行为命令字索引K(从0开始),第二行为命令字符串S。
输出描述
输出处理后的命令字符串,如果无法找到指定索引的命令字输出字符串ERROR
测试代码
package com.des.data.test;
import java.util.ArrayList;
import java.util.List;
public class SensitiveFieldEncryptionAndDecryption {
public static void main(String[] args) {
String str = "password_a12345678_timeout_100";
String strll = "aaa_password_\"a12_45678\"_timeout__100_\"\"_";
String strerror = "password12a12345678_timeout100";
printll(strll, 13);
}
private static void printll(String strll, int k) {
StringBuffer stringBuffer = new StringBuffer();
List<String> bfs = new ArrayList<>();
int start = 0;
for (int i = 0; i < strll.length(); i++) {
if (i + 1 >= strll.length()) {
break; //到最后了,循环结束,少一个对于这个题目是可以接受的
}
if (i - 1 < 0) {
continue; //首次循环,敏感字段不放在开头,k!=0,弱国需要开头就是敏感字段处理,可以拼接一个,完事之后再去掉,还可以用下面的代码
}
//设置敏感字段开始轮询位置,用start表示,这样可以实现在k之前的字段方便处理,这里即使不指定k,稍作修改还按照规则匹配,只需稍作修改即可
if (strll.charAt(i) == '_') {
if (i + 1 == k) {
start = i + 1;
continue;
}
if (stringBuffer.length() == 0) {
continue;
}
}
//没有开始直接下一轮
if (start == 0) {
continue;
}
//以 "_ 结尾的,做一种结尾处理
if (strll.charAt(i) == '\"' && strll.charAt(i + 1) == '_') {
start = 0;
if (strll.charAt(i - 1) == '\"') { //如果一个引号之前还是引号,说明之歌双引号之间是什么也没得,不做处理
continue;
}
stringBuffer.append(strll.charAt(i));//拼接最后一个引号
if (stringBuffer.length() != 0) {
bfs.add(stringBuffer.toString());//结果数组添加需要加密显示的字符串
stringBuffer = new StringBuffer();//置空临时加密字符串变量
}
continue;//此处只有一个k输入的时候,可以用break,没有k输入,或者多个k的情况下,这里必须使用continue,
}
//以 _ 结尾的,做一种结尾处理
if (strll.charAt(i) == '_' &&
strll.charAt(i - 1) != '\"' &&
stringBuffer.length() != 0 &&
!stringBuffer.toString().contains("\"")) {
start = 0;
if (stringBuffer.length() != 0) {
bfs.add(stringBuffer.toString());
stringBuffer = new StringBuffer();
}
continue;
}
stringBuffer.append(strll.charAt(i)); //拼接需要加密的字符串临时变量
}
if (bfs.size() == 0) {
bfs.add("ERROR");//查不到的情况下输出
}
for (int i = 0; i < bfs.size(); i++) {
System.out.println(strll);
String stlli = strll.replaceAll(bfs.get(i), "******");
if (stlli.contains("_")) {
String striNK = stlli.replaceAll("_", " "); //把所有的下划线替换成空格
String striNG = striNK.replaceAll("\\s+", "_");//这样可以方便的实现所有下划线合并
System.out.println(striNG);
}
}
}
}