Java-regex一次使用另一个字符替换第一个和最后一个字符

Java-regex一次使用另一个字符替换第一个和最后一个字符,java,regex,Java,Regex,假设我这里有这个字符串: [Hel[don't change in the middle]lo] 如何用另一个字符替换第一个和最后一个括号,如下所示: #Hel[don't change in the middle]lo# String str = "[Hel[don't change in the middle]lo]"; str = str.replaceFirst("\\[", "#"); if (str.substring(str.length() - 1).equals("]"))

假设我这里有这个字符串:

[Hel[don't change in the middle]lo]
如何用另一个字符替换第一个和最后一个括号,如下所示:

#Hel[don't change in the middle]lo#
String str = "[Hel[don't change in the middle]lo]";
str = str.replaceFirst("\\[", "#");
if (str.substring(str.length() - 1).equals("]")) {
    str = str.substring(0, str.length() - 1) + "#";
    System.out.println(str);
}
str = str.replace("myregex");
我知道这是可能的,就像这样:

#Hel[don't change in the middle]lo#
String str = "[Hel[don't change in the middle]lo]";
str = str.replaceFirst("\\[", "#");
if (str.substring(str.length() - 1).equals("]")) {
    str = str.substring(0, str.length() - 1) + "#";
    System.out.println(str);
}
str = str.replace("myregex");
有没有其他简单的方法来使用正则表达式,这样我就可以替换第一个 那最后一枪呢

像这样:

#Hel[don't change in the middle]lo#
String str = "[Hel[don't change in the middle]lo]";
str = str.replaceFirst("\\[", "#");
if (str.substring(str.length() - 1).equals("]")) {
    str = str.substring(0, str.length() - 1) + "#";
    System.out.println(str);
}
str = str.replace("myregex");
你可以

str = str.replaceAll("^\\[|]$", "#");
您可以使用:

String repl = str.replaceAll("^([^\\[]*)\\[|\\]([^\\]]*)$", "$1#$2");

在这里,我们使用两个子匹配之间的交替:

  • ^([^[]*)\\[
    -匹配0个或多个字符,后跟开头的
    [
  • \\]([^]]*)$
    -匹配
    ]
    ,后跟结尾的0个或多个字符
PS:这还可以处理输入中第一个
[
和最后一个
]
之前的一些任意字符。

这就足够了:

System.out.println(str.replaceAll("^\\[(.*)]$", "#$1#"));

如果操作非常简单,请不要使用正则表达式:

StringBuilder sb = new StringBuilder(str);
sb.set(0, '#');
sb.set(str.length()-1, '#');
String result = sb.toString();
也可以编写一个表达式:

String result =
    new StringBuilder(str.length())
        .append('#')
        .append(str, 1, str.length()-1)
        .append('#')
        .toString();
如果要替换的字符不在开头和结尾,请使用
indexOf
lastinexof
搜索它们:

sb.set(str.indexOf('['), '#');
sb.set(str.lastIndexOf(']'), '#');

这个show me
#Hel[中间不要改变#lo#
,它改变了最后一个,也改变了字符串内部,这是不正确的。我想这是因为第二个
]
没有被转义。否则似乎没问题。结束括号不需要在@Izruo转义,问题是末尾缺少$以指示字符串的结尾Yea,如果结束括号始终位于输入的末尾,则该括号也可以工作。您应该添加
^
,否则
f[o]o] 
将替换为:
f#o]o#
此显示错误
java.util.regex.PatternSyntaxException:index 20附近的未关闭字符类
此仍显示
\Hel[中间不要换#lo
如果我最后不使用
#
,它会改变最后一个,但在中间,这并不正确。它只会改变第一个
[
和最后一个
]
.yes@anubhava我只需要检查字符串是否以该字符串开头并以该字符串结尾,如果不需要更改的话,为此我创建了一个条件
if(str.substring(str.length()-1).equals(“]”){
如果它以这个结尾,那么就替换它,否则你就不需要这么想了;)谢谢你@Andy Turner,这在另一种情况下也可以帮助其他人;)注意:不要写
str.substring(str.length()-1)。equals(“])
,这会创建一个不必要的字符串。使用
str charAt(str.length()-1)=']'].
.mmm,谢谢@AndyTurner这是正确的