我可以在堆栈中使用正则表达式吗?

时间:2016-03-07 17:59:10

标签: java regex stack

我刚刚学习Stacks,Queues和Deques,所以这对我来说都是全新的。

我找到了this链接,解释了如何使用带有向量的正则表达式,但它是用于R语言的,而且我没有运气在这个类中找到Java中的正则表达式的任何实现。

如果我只是想从堆栈中删除括号,这在Java中是否可行?

我试过

    Stack stack = new Stack();
    stack.push("Item1");
    stack.push("Item2");
    stack.push("Item3");

    stack = stack.replaceAll(\\[", "").replaceAll("\\]", "");

然而我得到编译器错误

    method.java.util.Vector.replaceAll(java.util.function.UnaryOperator)
    is not applicable(actual and formal argument lists differ in length)

所以,我想过如何在没有使用正则表达式的情况下打印不带括号的ArrayList中的每个项目,我只是为每个循环做了一个,就像这样:

    for(Object item : stack)
        System.out.print(item + " ");

返回

    Item1 Item2 Item3

3 个答案:

答案 0 :(得分:1)

您所指的“来自Stack的括号”实际上并不是Stack本身的一部分。相反,它们是调用String的{​​{1}}方法时生成的Stack的一部分。如果您希望能够修改它,则需要调用相同的方法:

toString

调用String stackStr = stack.toString().replaceAll("\\[", "").replaceAll("\\]", ""); print时您不需要执行此操作的原因是因为这些方法有一个需要println的重载方法,会调用Object对你而言。

或者,你也可以像你一样使用循环。这样会更容易理解。

答案 1 :(得分:1)

堆栈中实际上没有括号。它们是由toString方法生成的,当您println堆栈时会自动调用它,因此您需要在对生成的字符串执行替换之前手动调用它。

您实际上不需要使用正则表达式来执行此纯字符串替换。如果您使用String.replace,这是String.replaceAll的非正则表达式版本,则无需转义括号。 (String.replaceAll方法经常被不必要地使用,因为它的命名很差。)

System.out.print(theStack.toString().replace("[", "").replace("]", ""));

但是,您根本不应该使用字符串替换,因为如果堆栈中的任何项本身包含括号,则会产生错误的结果。您可以通过执行类似str.replaceAll("^\\[|\\]\\z", "")str.substring(1, str.length() - 1)的操作来解决这个问题,但它很麻烦,但在这种情况下仍然无法匹配您的手动循环,因为它不会删除项目之间的逗号。所以用字符串捏造是错误的。

如果要控制生成的字符串,正确的方法是首先正确生成字符串。 E.g:

StringBuilder sb = new StringBuilder();
for (Object item : stack) {
    if (sb.length() > 0) sb.append(" ");
    sb.append(item);
}
System.out.println(sb.toString());

你也可以在这里使用String.join,因为你的堆栈中的所有项目都已经是字符串。 (String.join将在运行时生成异常,如果集合中的任何对象不是StringCharSequence。) 在声明时指定堆栈的项类型为了更好的类型安全。 E.g:

Stack<String> stack = new Stack<>();
/* ... add items ... */
System.out.println(String.join(" ", stack));

如果不是所有项目都是字符串,您可以将它们映射到字符串并以这种方式将它们连接在一起:

System.out.println(stack.stream().map(String::valueOf).collect(Collectors.joining(" ")));

P.S。自从Java 5于2004年问世以来,java.util.Stack已经过时了。在新代码中,您应该用ArrayDequeLinkedList替换它。所有上述代码与这些类的作用相同,尽管它们具有其他不同的特性和性能特征。

答案 2 :(得分:-1)

如果我在问之前再等几分钟,我就不需要在第一时间发帖了。我弄清楚了:

System.out.print(theStack.toString().replaceAll("\\[", "").replaceAll("\\]", ""));