Java字符串处理及AD日志提取Logged on/off问题求助
如何从Active Directory的不规则描述字符串中提取Logged on/Logged off字段?
问题描述
我从Active Directory中读取到格式不规则的字符串,示例为:"description: John Newman Logged on: 03.26.2018 9:26:29",其中字段内容的词数不固定。我需要从中提取出"Logged on"或"Logged off"对应的字段值。
我尝试了以下代码:
String a = Objects.toString(attrs.get("description"));//从Active Directory获取值 String b = a.split(":")[1];
但得到的结果是John Newman Logged on,不是我想要的登录时间。恳请大家提供帮助,谢谢。
解决方案
方法1:正则表达式匹配(最可靠)
既然目标字段是明确的Logged on:或Logged off:,用正则表达式直接匹配这两个关键词后面的内容是最稳妥的方案——不管前面的描述内容有多复杂,只要这两个关键词存在,就能精准提取对应的值。
代码示例:
String description = Objects.toString(attrs.get("description")); // 正则规则:匹配"Logged on:"或"Logged off:",然后捕获后面的所有内容 Pattern pattern = Pattern.compile("(Logged on|Logged off):\\s*(.*)"); Matcher matcher = pattern.matcher(description); if (matcher.find()) { String actionType = matcher.group(1); // 拿到"Logged on"或"Logged off" String targetValue = matcher.group(2); // 拿到对应的时间,比如"03.26.2018 9:26:29" System.out.println(actionType + " 的值是:" + targetValue); } else { // 处理未找到目标字段的情况 System.err.println("未检测到Logged on或Logged off字段"); }
方法2:定位关键词位置后截取
如果不想用正则,也可以通过定位Logged on:或Logged off:的最后出现位置,再截取后面的内容。不过这个方法需要注意关键词的长度,适合你确定字符串格式不会有太多变化的场景:
String description = Objects.toString(attrs.get("description")); // 找到两个关键词最后出现的位置,取较大的那个(确保找到存在的那个) int keywordIndex = Math.max(description.lastIndexOf("Logged on:"), description.lastIndexOf("Logged off:")); if (keywordIndex != -1) { // 根据找到的关键词,计算需要截取的起始位置 int startPos = keywordIndex + (keywordIndex == description.lastIndexOf("Logged on:") ? 10 : 11); String targetValue = description.substring(startPos).trim(); // 去掉首尾空格 System.out.println("提取的值是:" + targetValue); } else { System.err.println("未找到目标字段"); }
为什么你的原代码没生效?
你用split(":")会把字符串按所有冒号分割成数组,数组的第二个元素是第一个冒号到第二个冒号之间的内容(也就是 John Newman Logged on),但你需要的是Logged on:这个关键词后面的部分,所以原方法无法区分不同冒号的作用,自然得不到正确结果。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

