Java正则表达式以及包含开头和结尾

时间:2015-07-17 16:00:32

标签: java regex

我有一个文件,我需要使用正则表达式来替换特定字符。 我有以下格式的字符串:

1234 4215 "aaa.bbb" 5215 1524

我需要用冒号替换句号。 我知道这些句点总是包含在引号内,因此我需要一个正则表达式,它找到一个以“”开头的子字符串,以“”结尾,并包含“。”。并替换“。”用“:”。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

您可以使用:

str = str.replaceAll("\\.(?!(([^"]*"){2})*[^"]*$)", ":");

RegEx Demo

这个正则表达式会找到点,如果它们在双引号内,可以使用前瞻来确保点之后没有偶数引号。

答案 1 :(得分:0)

更新

在考虑之后,你的问题是"期间"可能不止一个双引号期间。

这是一种涵盖该情景的方法

public static void main(String[] args) throws Exception {
    String str = "1234 \"aaa.bbb\" \"a.aa.b.bb\" 5215 1524 \"12.345.123\" \".sage.\" \".afwe\" \"....\"";

    // Find all substrings in double quotes
    Matcher matcher = Pattern.compile("\"(.*?)\"").matcher(str);
    while (matcher.find()) {
        // Extract the match
        String match = matcher.group(1);

        // Replace all the periods with colons
        match = match.replaceAll("\\.", ":");

        // Replace the original matched group with the new string
        str = str.replace(matcher.group(1), match);
    }

    System.out.println(str);
}

结果:

1234 "aaa:bbb" "a:aa:b:bb" 5215 1524 "12:345:123" ":sage:" ":afwe" "::::"

在测试了@anubhava模式之后,他产生了相同的结果,因此为了简单起见而给予他更多的荣誉(+1)。

OLD ANSWER

您可以在String.replaceAll()

中尝试此模式
"\"([^\\.]*?)(\\.)([^\\.]*?)\""

替换

"\"$1:$3\""

这基本上将双引号之间的内容捕获到组(1-3)中。

  • 第1组($ 1) - 所有字符,无论是否存在(*?),都不是句号
  • 第2组($ 2) - 期间
  • 第3组($ 3) - 所有字符,无论是否存在(*?),都不是句号

并将其替换为" {Group 1}:{Group 3}"

public static void main(String[] args) throws Exception {
    String str = "1234 4215 \"aaa.bbb\" 5215 1524 \"12345.123\" \"sage.\" \".afwe\" \".\"";
    System.out.println(str.replaceAll("\"([^\\.]*?)(\\.)([^\\.]*?)\"", "\"$1:$3\""));
}

结果:

1234 4215 "aaa:bbb" 5215 1524 "12345:123" "sage:" ":afwe" ":"