Java Regex:如果缺少,则在字符串的开头和结尾添加引号

时间:2018-06-12 11:37:16

标签: java regex

我想创建一个简单的正则表达式,以便在字符串的开头或结尾添加双引号",如果它们使用Java string.replaceAll方法进行实际操作。

到目前为止,这是我最好的尝试:

string.replaceAll("(^[^\"])($)(?<!\")", "\"$1$2\"");

这在隔离方面很好,但不能一起使用:

string.replaceAll("(^[^\"])", "\"$1");
string.replaceAll("($)(?<!\")", "$2\"");

Example

有人可以说明我做错了吗?

提前致谢,

Chopo

1 个答案:

答案 0 :(得分:1)

当您使用(^[^\"])($)(?<!")时,您在字符串的开头匹配除"以外的任何字符,并且您需要在此字符后面显示字符串的结尾,然后执行其他检查char不是"(因此,最后的观察结果完全是多余的)。

如果您需要在第一个/最后一个字符不是"开头添加",则需要使用替换:

s=s.replaceAll("^(?!\")|$(?<!\")", "\"");

请参阅this regex demo

<强>详情

  • ^(?!\") - 如果开头没有",则匹配字符串的开头
  • | - 或
  • $(?<!\") - 匹配字符串的结尾并检查结尾是否有",如果有"则会失败。

如果您希望使用"将整个字符串换行,如果字符串周围没有",请使用

s=s.replaceFirst("(?s)^[^\"](?:.*[^\"])?$", "\"$0\"");

或者是一种更简单的非正则表达方式,使用字符串连接和几个startsWithendsWith

if (!s.endsWith("\"") && !s.startsWith("\"")) {
    System.out.println("\"" + s + "\"");
}

this Java demopattern here表示

  • (?s)^ - 启用Pattern.DOTALL标志并匹配字符串的开头
  • [^\"] - 除"
  • 以外的任何字符
  • (?:.*[^\"])? - 任意0+字符的可选序列(如果字符串只有1个字符?),然后是"以外的任何字符...
  • $ - 在字符串的末尾。

$0代表整个匹配值。