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[]
,Javachar[]
不会覆盖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[]
,而Javachar[]
不会覆盖toString()
。而且,JavaString
是不可变的,但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)