Java 删除所有以char';[';并以char';结尾]';一串

Java 删除所有以char';[';并以char';结尾]';一串,java,arrays,regex,string,tostring,Java,Arrays,Regex,String,Tostring,我需要获取一个字符串,并删除其中以字符'['开头,以字符']结尾的所有正则表达式 现在我不知道如何解决这个问题。我尝试将字符串转换为字符数组,然后从任何开始“[”到结束“]”放置空字符,然后使用toString()方法将其转换回字符串 MyCode: char[] lyricsArray = lyricsParagraphElements.get(1).text().toCharArray(); for (int i = 0;i < lyricsArray.

我需要获取一个
字符串
,并删除其中以
字符
'['开头,以
字符
']结尾的所有正则表达式

现在我不知道如何解决这个问题。我尝试将
字符串
转换为字符数组,然后从任何开始“[”到结束“]”放置空字符,然后使用
toString()
方法将其转换回
字符串

MyCode:

char[] lyricsArray = lyricsParagraphElements.get(1).text().toCharArray();
                for (int i = 0;i < lyricsArray.length;i++)
                {
                    if (lyricsArray[i] == '[')
                    {
                        lyricsArray[i] = ' ';
                        for (int j = i + 1;j < lyricsArray.length;j++)
                        {
                            if (lyricsArray[j] == ']')
                            {
                                lyricsArray[j] = ' ';
                                i = j + 1;
                                break;
                            }
                            lyricsArray[j] = ' ';
                        }   
                    }
                }
                String songLyrics = lyricsArray.toString();
                System.out.println(songLyrics);
我想有一个简单的方法。任何帮助都将不胜感激

请澄清:
“abo[dsadsa]efg[adf%@1]d”
转换为
“abcdefgd”
下面的代码引用了字符串对象,然后打印引用的
歌词

String songLyrics = lyricsArray.toString();
System.out.println(songLyrics);
将以上两行替换为

String songLyrics = new String(lyricsArray);
System.out.println(songLyrics);

另一种方法是不将其转换为字符数组,再转换为字符串

String lyricsParagraphElements = "asdasd[asd]";

String songLyrics = lyricsParagraphElements.replaceAll("\\[.*\\]", "");

System.out.println(songLyrics);

下面的代码引用了字符串对象,然后打印引用的
歌词

String songLyrics = lyricsArray.toString();
System.out.println(songLyrics);
将以上两行替换为

String songLyrics = new String(lyricsArray);
System.out.println(songLyrics);

另一种方法是不将其转换为字符数组,再转换为字符串

String lyricsParagraphElements = "asdasd[asd]";

String songLyrics = lyricsParagraphElements.replaceAll("\\[.*\\]", "");

System.out.println(songLyrics);

或简单地使用正则表达式来处理
\\[.\\]
的出现,但不包含任何内容:

String songLyrics = text.replaceAll("\\[.*?\\]", "");
其中
text
当然是:

String text = lyricsParagraphElements.get(1).text();

什么是
\\[.\\]
意思?

replaceAll
的第一个参数是描述正则表达式的字符串。正则表达式定义要在字符串中匹配的模式

让我们把它分开:

\\[
与字符
[
完全匹配。由于
[
在正则表达式中有一个,因此需要对其进行转义(两次!)

匹配任何字符,将其与()零或多个运算符
*?
组合,它将匹配任何字符,直到最终找到:


\\]
,它与字符
]
匹配。请再次注意转义。

或仅使用正则表达式来表示出现的
\[.\\]
,但不包含任何内容:

String songLyrics = text.replaceAll("\\[.*?\\]", "");
其中
text
当然是:

String text = lyricsParagraphElements.get(1).text();

什么是
\\[.\\]
意思?

replaceAll
的第一个参数是描述正则表达式的字符串。正则表达式定义要在字符串中匹配的模式

让我们把它分开:

\\[
与字符
[
完全匹配。由于
[
在正则表达式中有一个,因此需要对其进行转义(两次!)

匹配任何字符,将其与()零或多个运算符
*?
组合,它将匹配任何字符,直到最终找到:

\\]
,它与字符
]
匹配。请再次注意转义。

您得到的是“奇怪的东西”,因为您正在打印数组的字符串表示形式,而不是将数组转换为字符串


使用

new String(lyricsArray);
但如果这样做,您会发现实际上并没有从字符串中删除字符,而是用空格替换它们

相反,您可以将数组中的所有字符左移,并仅构造最右数目的新字符串:

int src = 0, dst = 0;
while (src < lyricsArray.length) {
  while (src < lyricsArray.length && lyricsArray[src] != '[') {
    lyricsArray[dst++] = lyricsArray[src++];
  }
  if (src < lyricsArray.length) {
    ++src;
    while (src - 1 < lyricsArray.length && lyricsArray[src - 1] != ']') {
      src++;
    }
  }
}
String lyricsString = new String(lyricsArray, 0, dst);
int src=0,dst=0;
while(src
您得到的是“奇怪的东西”,因为您正在打印数组的字符串表示,而不是将数组转换为字符串


使用

new String(lyricsArray);
但如果这样做,您会发现实际上并没有从字符串中删除字符,而是用空格替换它们

相反,您可以将数组中的所有字符左移,并仅构造最右数目的新字符串:

int src = 0, dst = 0;
while (src < lyricsArray.length) {
  while (src < lyricsArray.length && lyricsArray[src] != '[') {
    lyricsArray[dst++] = lyricsArray[src++];
  }
  if (src < lyricsArray.length) {
    ++src;
    while (src - 1 < lyricsArray.length && lyricsArray[src - 1] != ']') {
      src++;
    }
  }
}
String lyricsString = new String(lyricsArray, 0, dst);
int src=0,dst=0;
while(src
您正在打印一个
char[]
,Java
char[]
不会覆盖
toString()
。而且,Java
字符串是不可变的,但Java确实有可变的(并且可以删除任意子字符串)。您可以像这样使用它

String songLyrics = lyricsParagraphElements.get(1).text();
StringBuilder sb = new StringBuilder(songLyrics);
int p = 0;
while ((p = sb.indexOf("[", p)) >= 0) {
    int e = sb.indexOf("]", p + 1);
    if (e > p) {
        sb.delete(p, e + 1);
    }
    p++;
}
System.out.println(sb);

您正在打印一个
char[]
,而Java
char[]
不会覆盖
toString()
。而且,Java
String
是不可变的,但Java确实有可变的(并且可以删除任意子字符串)。您可以像这样使用它

String songLyrics = lyricsParagraphElements.get(1).text();
StringBuilder sb = new StringBuilder(songLyrics);
int p = 0;
while ((p = sb.indexOf("[", p)) >= 0) {
    int e = sb.indexOf("]", p + 1);
    if (e > p) {
        sb.delete(p, e + 1);
    }
    p++;
}
System.out.println(sb);

这正是您案例的正则表达式字符串:

\\[([\\w\\%\\@]+)\\]
当你的植物字符串包含特殊符号时,这是非常困难的。我找不到更短的正则表达式,除非像一个例外一样解释特殊符号。 参考:

================

我正在读你的新案例,一个字符串包含符号“-”或其他符号 !"#$%&'()*+,-./:;?@\^_`{|}~
将它们(前缀为“\\”)添加到我的正则表达式字符串的\\@之后。

这正是适合您的正则表达式字符串:

\\[([\\w\\%\\@]+)\\]
当你的植物字符串包含特殊符号时,这是非常困难的。我找不到更短的正则表达式,除非像一个例外一样解释特殊符号。 参考:

================

我正在读你的新案例,一个字符串包含符号“-”或其他符号 !"#$%&'()*+,-./:;?@\^_`{|}~ 将它们(前缀为“\\”)添加到我的正则表达式字符串的\\@之后。

使用
新字符串(lyricsAr)