从字符串中删除所有以 char '[' 开头并以 char ']' 结尾的正则表达式实例

Deleting all regex instances starting with char '[' and ending with char ']' from a String

我需要获取 String 并删除其中以 character '[' 开头并以 character ']' 结尾的所有正则表达式。

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

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);

但是在 songLyrics 的打印行中我得到了一些奇怪的东西,比如

[C@71bc1ae4
[C@6ed3ef1
[C@2437c6dc
[C@1f89ab83
[C@e73f9ac
[C@61064425
[C@7b1d7fff
[C@299a06ac
[C@383534aa
[C@6bc168e5

我想有一个简单的方法。任何帮助将不胜感激。

澄清一下: 将 "abcd[dsadsadsa]efg[adf%@1]d" 转换为 "abcdefgd"

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

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

将以上两行替换为

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

Ideone1

不将其转换为字符数组并再次转换为字符串的其他方式。

String lyricsParagraphElements = "asdasd[asd]";

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

System.out.println(songLyrics);

Ideone2

或者简单地使用正则表达式 replace all 出现 \[.*\] 没有任何内容:

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

其中 text 当然是:

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

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

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

所以让我们把它分开:

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

. 匹配任何字符,将它与 (lazy) 零或多个运算符 *? 结合起来,它将匹配任何字符,直到它最终找到:

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

您得到 "weird stuff" 是因为您正在打印数组的字符串表示形式,而不是将数组转换为字符串。

而不是lyricsArray.toString(),使用

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);

您正在打印 char[] 并且 Java char[] 不会覆盖 toString()。并且,Java String 不可变的 ,但是 Java 确实有 StringBuilder which is mutable (and StringBuilder.delete(int, int) 可以删除任意子字符串)。你可以像这样使用它,

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\%\@]+)\]

当您的植物字符串包含特殊符号时,这非常困难。我找不到更短的正则表达式,没有像异常一样解释特殊符号。 参考:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#cg

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

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