我正在读取一个日志文件并提取文件中包含的某些数据。我能够提取日志文件每行的时间。
现在我要提取身份证 "ieatrcxb4498-1"
. 所有的id都是从子字符串开始的 ieatrcxb
我试图查询并返回基于它的完整字符串。
我试过许多不同于其他帖子的建议。但我失败了,有以下几种模式:
(?i)\\b("ieatrcxb"(?:.+?)?)\\b
(?i)\\b\\w*"ieatrcxb"\\w*\\b"
^.*ieatrcxb.*$
我还尝试根据以下字符串提取完整的id i
并在 1
. 就像他们一样。
日志文件的行
150: 2017-06-14 18:02:21 INFO monitorinfo : Info: Lock VCS on node "ieatrcxb4498-1"
代码
Scanner s = new Scanner(new FileReader(new File("lock-unlock.txt")));
//Record currentRecord = null;
ArrayList<Record> list = new ArrayList<>();
while (s.hasNextLine()) {
String line = s.nextLine();
Record newRec = new Record();
// newRec.time =
newRec.time = regexChecker("([0-1]?\\d|2[0-3]):([0-5]?\\d):([0-5]?\\d)", line);
newRec.ID = regexChecker("^.*ieatrcxb.*$", line);
list.add(newRec);
}
public static String regexChecker(String regEx, String str2Check) {
Pattern checkRegex = Pattern.compile(regEx);
Matcher regexMatcher = checkRegex.matcher(str2Check);
String regMat = "";
while(regexMatcher.find()){
if(regexMatcher.group().length() !=0)
regMat = regexMatcher.group();
}
//System.out.println("Inside the "+ regexMatcher.group().trim());
}
return regMat;
}
我需要一个简单的模式,这将为我做到这一点。
3条答案
按热度按时间drnojrws1#
id是否总是有格式“
ieatrcxb
后跟4位数字,后跟-
,后跟1位“?如果是这样,你可以:
注意
{4}
量词,正好匹配4个数字(\\d
). 如果最后一个数字总是1
,您也可以使用"ieatrcxb\\d{4}-1"
.如果位数不同,可以使用
"ieatrcxb\\d+-\\d+"
,在哪里+
表示“1个或更多”。您也可以使用
{}
出现次数最少和最多的量词。例子:"ieatrcxb\\d{4,6}-\\d"
-{4,6}
意思是“最少4次,最多6次”(这只是一个例子,我不知道这是不是你的情况)。如果您确切地知道id可以有多少个数字,这将非常有用。以上所有的工作都是为了你的案子
ieatrcxb4498-1
. 使用哪一种取决于您的输入如何变化。如果你只需要数字而不需要
ieatrcxb
零件(4498-1
),可以使用lookbehind regex:这使得
ieatrcxb
不是比赛的一部分,因此回来只是4498-1
.如果你也不想
-1
只是4498
,您可以将此与展望相结合:这只会回来
4498
.41zrol4v2#
你想用非常困难的方法来做这件事。如果
lock-unlock.txt
文件与您发布的代码段相同,您可以执行以下操作:如果你不只是寻找身份证号码,只需删除/评论第二和第三
.map()
方法调用,但它将导致字符串列表而不是整数。ubbxdtey3#
或者如果id都被引用了: