从字符串中删除所有以 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);
不将其转换为字符数组并再次转换为字符串的其他方式。
String lyricsParagraphElements = "asdasd[asd]";
String songLyrics = lyricsParagraphElements.replaceAll("\[.*\]", "");
System.out.println(songLyrics);
或者简单地使用正则表达式 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
================
我读了你的新案例,一个字符串包含符号“-”或其他内容
!"#$%&'()*+,-./:;<=>?@\^_`{|}~
在我的正则表达式字符串的 \\@ 之后添加它们(前缀为“\\”)。
我需要获取 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);
不将其转换为字符数组并再次转换为字符串的其他方式。
String lyricsParagraphElements = "asdasd[asd]";
String songLyrics = lyricsParagraphElements.replaceAll("\[.*\]", "");
System.out.println(songLyrics);
或者简单地使用正则表达式 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
================
我读了你的新案例,一个字符串包含符号“-”或其他内容 !"#$%&'()*+,-./:;<=>?@\^_`{|}~ 在我的正则表达式字符串的 \\@ 之后添加它们(前缀为“\\”)。