正则表达式在字符的第一次出现和最后一次出现之间提取字符串
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("(?<=-).*(?=-)");
我目前正在从违规异常错误消息中提取特定字符串。我做的步骤如下:
输入字符串格式: 键 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("(?<=-).*(?=-)");