java正则表达式获取两个冒号之间的值,冒号除外
我有这样一个字符串:
something:POST:/some/path
现在我想从绳子上单独拿下这根柱子。我是用这个正则表达式做的
:([a-zA-Z]+):
但这给了我一个值和冒号。我明白了:
:POST:
但我需要这个
POST
我的匹配和替换代码如下:
String ss = "something:POST:/some/path/";
Pattern pattern = Pattern.compile(":([a-zA-Z]+):");
Matcher matcher = pattern.matcher(ss);
if (matcher.find()) {
System.out.println(matcher.group());
ss = ss.replaceFirst(":([a-zA-Z]+):", "*");
}
System.out.println(ss);
编辑:
我决定使用lookahead/lookbehind正则表达式,因为我不想将replace
与冒号(如:*:
)一起使用。这是我最后的解决办法
String s = "something:POST:/some/path/";
String regex = "(?<=:)[a-zA-Z]+(?=:)";
Matcher matcher = Pattern.compile(regex).matcher(s);
if (matcher.find()) {
s = s.replaceFirst(matcher.group(), "*");
System.out.println("replaced: " + s);
}
else {
System.out.println("not replaced: " + s);
}
# 1 楼答案
这是您的解决方案:
正则表达式=
(:)([a-zA-Z]+)(:)
代码是:
ss现在包含:
我相信这就是你想要的
# 2 楼答案
如前所述,reqex捕获组可用于替换
以下代码完成了此操作:
# 3 楼答案
有两种方法:
(?<=:)[a-zA-Z]+(?=:)
,或":*:"
注意:您可能需要为正则表达式定义一个
String
常量,因为您在不同的调用中使用它# 4 楼答案
更新
查看您的更新,您只需要
ReplaceFirst
:见Java demo
当您使用
(?<=:)[a-zA-Z]+(?=:)
时,正则表达式引擎会检查字符串中的每个位置,查找其前面的*
,一旦找到,就会尝试匹配1+ASCII字母,然后断言它们后面有一个:
。对于:[A-Za-z]+:
,检查仅在正则表达式引擎找到:
字符后开始。然后,在匹配:POST:
之后,替换模式替换整个匹配在替换模式中硬编码冒号完全可以,因为它们在正则表达式模式中硬编码原始答案
您只需访问组1:
见Java demo
您的
:([a-zA-Z]+):
正则表达式包含一个捕获组(请参见(....)
子模式)。这些组自动编号:第一个组的索引为1
,第二个组的索引为2
,以此类推要替换它,请使用
Matcher#appendReplacement()
:见another demo