我必须使用正则表达式从需要匹配的文本中提取令牌。示例文本就是这样。

data.orderType.`order.created.time`


现在,我正在使用以下正则表达式对该字符串进行标记。

`(.*?)`|[^.]+


此正则表达式将字符串部分标记化,并给出标记为

data,orderType,`order.created.time`


这里的问题是当令牌被反引号也包括在内时。我该如何抛弃反引号并获得以下内容?

data,orderType,order.created.time

最佳答案

您已经捕获了反引号之间的部分,如果matcher.group(1)参加了比赛,则抓住[^.`]+(=如果它匹配):

Java demo

String s = "data.orderType.`order.created.time`";
String regex = "`([^`]*)`|[^.`]+";
List<String> result = new ArrayList<>();
Matcher m = Pattern.compile(regex).matcher(s);
while (m.find()) {
   if (m.group(1) != null) {
       result.add(m.group(1));
   } else {
       result.add(m.group());
   }
}
System.out.println(result);
// => [data, orderType, order.created.time]


注意我还对否定的字符类添加了反引号,因为我认为反引号只能配对。

10-06 14:02