java正则表达式识别值并对路径参数进行分类

slhcrj9b  于 2021-07-07  发布在  Java
关注(0)|答案(2)|浏览(256)

目前,我有一个表,保存端点中每个更改的日志,但是我需要在屏幕上向用户显示哪个端点已经更改,哪个id已经发送。我现在有这些例子:
/管理员/帐户/机器人/6/布局/属性
/admin/bot/4/block/content/button/34/标签
/管理员/bot/4/block/content/text/18/message
可以使用正则表达式对每个端点进行分类,例如:

/admin/account/bot/6/layout/properties
name: Update Bot properties
BotId: 6

/admin/bot/4/block/content/text/18/message
name: Update message in Text
BotId: 4
TextId: 18

提取每个值?
谢谢。

dkqlctbz

dkqlctbz1#

取决于要匹配的字符串的确切结构;不是每件事都有规律。这里的基本方法是:

private static final Pattern ACCOUNT_PROPERTIES = 
  Pattern.compile("/admin/account/bot/(\\d+)/layout/properties");
private static final Pattern BLOCK_CONTENT = 
  Pattern.compile("/admin/bot/(\\d+)/block/content/(\\w+)/(\\d+)/(\\w+)");

public void handle(String path) {
   Matcher m;

   m = ACCOUNT_PROPERTIES.matcher(path);
   if (path.matches()) {
       handlePropertiesUpdate(Integer.parseInt(m.group(1)));
       return;
   }

   m = BLOCK_CONTENT.matcher(path);
   if (path.matches()) {
       int botId = Integer.parseInt(m.group(1));
       String objType = m.group(2);
       int objId = Integer.parseInt(m.group(3));
       String updType = m.group(4);
       handleBlockContent(botId, objType, objId, updType);
   }

   throw new NotAcceptedException();
}

等等。
试图让一个regexp抓住一切似乎。。。不明智的。要想弄清楚哪个组去了哪里,这是一件很麻烦的工作,而其中一个结构中的更新则需要更新所有代码。有一些方法可以命名组,这是一个小小的改进,但是您仍然可以看到一个巨大的regexp。如果目标是“通过运行更少的代码让它运行得更快”,我有个坏消息。regexp对性能没有任何保证,如果使用某些regex特性,则最坏的情况是o(n^2)。如果你想要速度,就远离他们,或者至少是一个Maven,这样你就知道什么和如何让他们跑得快。

5kgi1eie

5kgi1eie2#

我不知道有什么简单的方法来生成您在这里期望的确切名称,但是对于键值对,regex模式匹配器可以处理这个问题:

String input = "/admin/bot/4/block/content/button/34/label";
String pattern = "/(\\w+)/(\\d+)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(input);

while (m.find( )) {
    System.out.println(m.group(1) + "Id: " + m.group(2));
}

这张照片:

botId: 4
buttonId: 34

相关问题