我想创建一个简单的正则表达式,以便在字符串的开头或结尾添加双引号"
,如果它们使用Java
string.replaceAll
方法进行实际操作。
到目前为止,这是我最好的尝试:
string.replaceAll("(^[^\"])($)(?<!\")", "\"$1$2\"");
这在隔离方面很好,但不能一起使用:
string.replaceAll("(^[^\"])", "\"$1");
string.replaceAll("($)(?<!\")", "$2\"");
有人可以说明我做错了吗?
提前致谢,
Chopo
答案 0 :(得分:1)
当您使用(^[^\"])($)(?<!")
时,您在字符串的开头匹配除"
以外的任何字符,并且您需要在此字符后面显示字符串的结尾,然后执行其他检查char不是"
(因此,最后的观察结果完全是多余的)。
如果您需要在第一个/最后一个字符不是"
的或开头添加"
,则需要使用替换:
s=s.replaceAll("^(?!\")|$(?<!\")", "\"");
请参阅this regex demo。
<强>详情
^(?!\")
- 如果开头没有"
,则匹配字符串的开头|
- 或$(?<!\")
- 匹配字符串的结尾并检查结尾是否有"
,如果有"
则会失败。 如果您希望使用"
将整个字符串换行,如果字符串周围没有"
,请使用
s=s.replaceFirst("(?s)^[^\"](?:.*[^\"])?$", "\"$0\"");
或者是一种更简单的非正则表达方式,使用字符串连接和几个startsWith
和endsWith
:
if (!s.endsWith("\"") && !s.startsWith("\"")) {
System.out.println("\"" + s + "\"");
}
见this Java demo。 pattern here表示
(?s)^
- 启用Pattern.DOTALL
标志并匹配字符串的开头[^\"]
- 除"
(?:.*[^\"])?
- 任意0+字符的可选序列(如果字符串只有1个字符?),然后是"
以外的任何字符... $
- 在字符串的末尾。 $0
代表整个匹配值。