有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);
}

共 (4) 个答案

  1. # 1 楼答案

    这是您的解决方案:

    正则表达式=(:)([a-zA-Z]+)(:)

    代码是:

    String ss = "something:POST:/some/path/";
    
    ss = ss.replaceFirst("(:)([a-zA-Z]+)(:)", "$1*$3");
    

    ss现在包含:

    something:*:/some/path/

    我相信这就是你想要的

  2. # 2 楼答案

    如前所述,reqex捕获组可用于替换

    以下代码完成了此操作:

      String ss = "something:POST:/some/path/";
        Pattern pattern = Pattern.compile(":([a-zA-Z]+):");
        Matcher matcher = pattern.matcher(ss);
    
        if (matcher.find()) {
            ss = ss.replaceFirst(matcher.group(1), "*");
        }
        System.out.println(ss);
    
  3. # 3 楼答案

    有两种方法:

    • 保留Java代码,并使用lookahead/lookahead(?<=:)[a-zA-Z]+(?=:),或
    • 更改Java代码以将结果替换为":*:"

    注意:您可能需要为正则表达式定义一个String常量,因为您在不同的调用中使用它

  4. # 4 楼答案

    更新

    查看您的更新,您只需要ReplaceFirst

    String result = s.replaceFirst(":[a-zA-Z]+:", ":*:");
    

    Java demo

    当您使用(?<=:)[a-zA-Z]+(?=:)时,正则表达式引擎会检查字符串中的每个位置,查找其前面的*,一旦找到,就会尝试匹配1+ASCII字母,然后断言它们后面有一个:。对于:[A-Za-z]+:,检查仅在正则表达式引擎找到:字符后开始。然后,在匹配:POST:之后,替换模式替换整个匹配在替换模式中硬编码冒号完全可以,因为它们在正则表达式模式中硬编码

    原始答案

    您只需访问组1:

    if (matcher.find()) {
        System.out.println(matcher.group(1));
    }
    

    Java demo

    您的:([a-zA-Z]+):正则表达式包含一个捕获组(请参见(....)子模式)。这些组自动编号:第一个组的索引为1,第二个组的索引为2,以此类推

    要替换它,请使用Matcher#appendReplacement()

    String s = "something:POST:/some/path/";
    StringBuffer result = new StringBuffer();
    Matcher m = Pattern.compile(":([a-zA-Z]+):").matcher(s);
    while (m.find()) {
        m.appendReplacement(result, ":*:");
    }
    m.appendTail(result);
    System.out.println(result.toString());
    

    another demo