从字符串

时间:2016-03-21 16:10:25

标签: java arrays regex string tostring

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

现在我不知道如何解决这个问题。我尝试将String转换为字符数组,然后从任何起始'['直到他关闭']'中放入空字符,然后使用String方法将其转换回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);

但是在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"

5 个答案:

答案 0 :(得分:3)

或者只是使用正则表达式来\\[.*\\] String songLyrics = text.replaceAll("\\[.*?\\]", ""); 出现text,而不用任何东西:

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

\\[.*\\]当然:

replaceAll

\\[的含义是什么?

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

所以让我们分开吧:

[完全匹配字符.。由于*?在正则表达式中有replace all,因此需要对其进行转义(两次!)。

\\]匹配任何字符,将其与(special meaning)零或多运算符]结合使用,它将匹配任何字符,直到最终找到:

create table t3 (A varchar(10), B varchar(10), C varchar(8) generated always as (case when length(concat(A, B)) > 8 then substr(concat(A,B),1,5) || '...' else concat(A, B) end) ) insert into t3 (A,B) values ('This', ' is a test'); insert into t3 (A,B) values ('ABCD', 'EFGH'); select * from t3 ,匹配字符A B C ---------------------------------- This is a test This ... ABCD EFGH ABCDEFGH 。请注意再次逃脱。

答案 1 :(得分:2)

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

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

替换上面的两行
String songLyrics = new String(lyricsArray);
System.out.println(songLyrics);

Ideone1

其他方式,不将其转换为char数组,再转换为字符串。

String lyricsParagraphElements = "asdasd[asd]";

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

System.out.println(songLyrics);

Ideone2

答案 2 :(得分:1)

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

而不是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);

答案 3 :(得分:1)

您正在打印char[]而Java char[]不会覆盖toString()。并且,Java String immutable ,但Java确实有StringBuilder mutable (并且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);

答案 4 :(得分:1)

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

\\[([\\w\\%\\@]+)\\]

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

=====

我读了你的新案例,一个包含符号的字符串&#34; - &#34;或其他的东西     !&#34;#$%&安培;&#39;()* +, - /:;?&LT; =&GT; @ \ ^ _`{|}〜 在我的正则表达式字符串上的\\ @之后添加它们(带前缀&#34; \\&#34;)。