我有一个文件,我需要使用正则表达式来替换特定字符。 我有以下格式的字符串:
1234 4215 "aaa.bbb" 5215 1524
我需要用冒号替换句号。 我知道这些句点总是包含在引号内,因此我需要一个正则表达式,它找到一个以“”开头的子字符串,以“”结尾,并包含“。”。并替换“。”用“:”。有人可以解释一下吗?
答案 0 :(得分:2)
您可以使用:
str = str.replaceAll("\\.(?!(([^"]*"){2})*[^"]*$)", ":");
这个正则表达式会找到点,如果它们在双引号内,可以使用前瞻来确保点之后没有偶数引号。
答案 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)。
您可以在String.replaceAll()
"\"([^\\.]*?)(\\.)([^\\.]*?)\""
替换
"\"$1:$3\""
这基本上将双引号之间的内容捕获到组(1-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" ":"