【问题标题】:Remove angular brackets < and > from a string : Java regex从字符串中删除尖括号 < 和 >:Java regex
【发布时间】:2020-01-02 20:26:12
【问题描述】:

我正在寻找 Java 中的正则表达式,如果字符串中都存在尖括号的开头和结尾,我可以在其中删除它们。 例如1

str = "abc <someting> def < 0"
output: "abc someting def < 0"

如果有打开或关闭,则该大括号应保持原样。

例如2

str = "abc <some <thing>> def < 0"
output : "abc some thing def < 0"

我关注了其他 stackoverflow QA,但没有任何帮助。

下面是我试过的

"\\<[^\\>]*?\\)"
"\\<|\\>"

提前致谢!!!

【问题讨论】:

  • 如果您有some &lt;angle &lt;brackets&gt; 作为输入,那么输出应该是什么:some &lt;angle bracketssome angle &lt;brackets
  • Java 正则表达式不支持递归模式,最好使用解析器。
  • @NickReed,OP 似乎在谈论平衡良好的括号,但不确定(尽管有评论)。
  • 我个人喜欢这里的appendReplacement() and appendTail() 答案stackoverflow.com/questions/375420/…,但任何回调方式都可以。每次匹配,从组 0 中删除所有 &lt;&gt;,然后附加(或替换)到新字符串。正则表达式:"(?s)(?=&lt;)(?:(?=.*?&lt;(?!.*?\\1)(.*&gt;(?!.*\\2).*))(?=.*?&gt;(?!.*?\\2)(.*)).)+?.*?(?=\\1)[^&lt;]*(?=\\2$)"regex101.com/r/mbdquf/1 请注意,每个匹配项都保证有平衡的尖括号。

标签: java regex string


【解决方案1】:

您可以执行循环正则表达式替换,直到没有进行任何更改。我以为您在谈论用括号括起来的无括号文本。在这种情况下,正则表达式为&lt;([^&gt;]*)&gt;,它捕获第一组(名为$1)中的内部文本。

在下面的示例中,while 循环行检查str 的值是否与str.replaceAll() 的结果不同,后者在1 之后分配给str 支票。如果它们相等,则循环结束,即没有任何内容被替换,因此没有要删除的括号。

public class Test {
    public static void main(String args[]) {
        String str = "abc <some <thing>> def < 0";
        while (!str.equals(str = str.replaceAll("<([^>]*)>", "$1")));
        System.out.println(str);
    }
}

输出:

~$ javac Test.java
~$ java Test
abc some thing def < 0

1str.equals() 的目标引用被 before 参数评估,所以在分配之前。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 2021-09-19
  • 2012-03-16
  • 2019-10-12
  • 1970-01-01
相关资源
最近更新 更多