我需要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"
答案 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);
其他方式,不将其转换为char数组,再转换为字符串。
String lyricsParagraphElements = "asdasd[asd]";
String songLyrics = lyricsParagraphElements.replaceAll("\\[.*\\]", "");
System.out.println(songLyrics);
答案 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;)。