我正在监听 Kafka 主题并接收消息,将它们与对象进行比较,然后尝试解析消息。我收到了多条有关某项搜索的消息,而我只是想获取该搜索
<小时/>userName:User.Name userId:FDF3JH4 session:9cf2-21-c6-28-c360f1edba53 searchString:test, searchType:DEFAULT_SEARCH
这就是我想要的
LogPattern 为 String logPattern = ".*(userName:)(\\S+)\\s(userId:)(\\S+)\\s(session:)(\\S+)\\s(searchString:)([^,]).*";
if (isValidObject) {
final Pattern p = Pattern.compile(logPattern);
Matcher matcher = p.matcher(historyRequest.getLog());
if (!matcher.matches()) {
return;
}
我设置了一个测试函数来确保我收到的消息和我的模式是正确的,但是当我将其放入实际函数中时,它不起作用。它不会返回 String logPattern = ".*";
的结果但是,奇怪的是,当弄乱日志模式时,我能够获得具有此日志模式和此日志的 kafka 消息的匹配:
String logPattern = ".*[用户名]\\:(\\S+)\\s\\w+:(\\S+)(\\s\\S+\\s\\w+\\:)([^,]+).*";
userName:User.Name userId:D394H4 session:3f1da-0c-fb-90-949a searchString:"test"take:13.0 page:1 resultSize:1 赞助:false
最佳答案
据我所知,您几乎有一个匹配的模式。我猜它没有完全按照您的要求做,因为它没有选择 searchString
参数。我在下面发布了一些代码,其中稍微修改了您的模式版本。我做了两件事:
- 我删除了常量文本周围的括号
- 我修复了模式以匹配
searchString
之后直到逗号的所有文本
代码如下:
public class Logtest {
String logPattern_orig = ".*(userName:)(\\S+)\\s(userId:)(\\S+)\\s(session:)(\\S+)\\s(searchString:)([^,]).*";
String logPattern = ".*userName:(\\S+)\\suserId:(\\S+)\\ssession:(\\S+)\\ssearchString:([^,]*),.*";
String kafkaMsg = "userName:User.Name userId:FDF3JH4 session:9cf2-21-c6-28-c360f1edba53 searchString:test, searchType:DEFAULT_SEARCH";
void test() {
final Pattern p = Pattern.compile(logPattern);
Matcher matcher = p.matcher(kafkaMsg);
if (matcher.matches()) {
System.out.println("Matches!");
for (int i=1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + "='" + matcher.group(i) + "'");
}
}
}
public static final void main(String[] args) {
Logtest lt = new Logtest();
lt.test();
}
}
当我运行它时,我得到以下输出:
Matches!
Group 1='User.Name'
Group 2='FDF3JH4'
Group 3='9cf2-21-c6-28-c360f1edba53'
Group 4='test'
关于java - 正则表达式解析 Kafka 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55209203/