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

时间:2018-10-17 11:18:56

标签: java regex matcher

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

输入字符串格式: 键

的条目重复

正则表达式当前正在使用:

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

获得的组1:

值的格式==> 某些ID -所需值-一些ID

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

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

只有正则表达式可以做到吗?

2 个答案:

答案 0 :(得分:2)

我们可以使用String#replaceAll以单线方式做到这一点:

String input = "some id-desired - d - d- value-some id";
String output = input.replaceAll("^.*?-(.*)-.*", "$1");
System.out.println(output);

输出:

desired - d - d- value

我谨慎使用的模式会消耗掉所有东西,直到第一个破折号为止。然后,它贪婪地消耗了第一个破折号和最后一个破折号之间的所有内容。样本数据很奇怪,但我想证明答案对于所需数据内出现的破折号是很可靠的。

答案 1 :(得分:0)

或多或少直接

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

->查找第一个出现的-,后跟尽可能多的字符,后跟一个-。如果所需值中有-,这也适用。

缺点是,破折号包含在结果中,但可以使用substring()轻松将其删除。可以使用正向超前/向后看来避免这种情况:

...compile("(?<=-).*(?=-)");