正则表达式在字符的第一次出现和最后一次出现之间提取字符串

Regex to extract string between the first and last occurrence of a character

我目前正在从违规异常错误消息中提取特定字符串。我做的步骤如下:

输入字符串格式: 键 key

的重复条目 value

当前使用的正则表达式:

Duplicate entry '(.*)' for key '(.*)'

获得第1组:

值的格式 ==> some id-期望值-some id

为了提取想要的值,我目前使用第一个索引和最后一个索引(-)并提取字符串如下:

error.substring(error.indexOf("-") + 1, error.lastIndexOf("-"));

同样的事情可以只用正则表达式来完成吗?

我们可以使用 String#replaceAll:

的单行代码来做到这一点
String input = "some id-desired - d - d- value-some id";
String output = input.replaceAll("^.*?-(.*)-.*", "");
System.out.println(output);

输出:

desired - d - d- value

我谨慎使用的模式会消耗所有内容,直到第一个破折号。然后,它会贪婪地消耗掉第一个破折号和最后一个破折号之间的所有内容。奇怪的示例数据,但我想表明答案对于所需数据中出现的破折号是稳健的。

或多或少直截了当

var pattern = Pattern.compile("-.*-");
var matcher = pattern.matcher(string);
if (matcher.find())
    result = matcher.group();

-> 查找第一个出现的 -,后跟尽可能多的字符,然后是 -。如果 desired-value.

中有 -,这也有效

缺点,破折号包含在结果中,但可以使用 substring() 轻松丢弃。使用正数 lookahead/lookbehind:

可以避免这种情况
...compile("(?<=-).*(?=-)");