如何使用正则表达式拆分字符串,取1位数以上的数字#Java



这个程序应该是一个计算器,所以当用户插入一个类似"6+9-2+4-12";,它应该给出结果。。。当用户只给出一个数字,如"1";6+2-1+3-2";;但是如果用户插入一个2位数的数字;12〃;,程序将其视为1&2.

这是我使用的正则表达式:

String[] somma = text1.split("(?<=[0-9]+)");

这是表达式";6+9-2+4-12":

6 + 9 - 2 + 4 - 1 2
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "+"
at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.base/java.lang.Double.parseDouble(Double.java:549)
at Calcolatrice.Ascoltatore.actionPerformed(Ascoltatore.java:69)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6636)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6401)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5012)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4919)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4548)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4489)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2764)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4844)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

它应该起作用,因为它使用的数字[0-9]更多+"。。。我不知道该怎么办了

对这个问题的一种解释是,你想把数字放在一起,但把其他所有东西都拆分成单独的令牌,所以你想拆分:

  • 数字后
  • 在数字之前
  • 不在数字之间

作为独立规则,这将是:

  • 在后面没有数字的数字之后:(?<=d)(?!d)
  • 在数字前面没有数字之前:(?<!d)(?=d)

所以你想要的是:

String[] somma = text1.split("(?<=\d)(?!\d)|(?<!\d)(?=\d)");

为了一开始不得到空令牌,我们不想拆分";在输入开始的数字"之前;,所以我们加上这个确切的条件:

String[] somma = text1.split("(?<=\d)(?!\d)|(?<!\d|^)(?=\d)");
// result: ["6", "+", "9", "-", "2", "+", "4", "-", "12"]

这将允许计算由所有运算符(包括括号(组成的表达式,具体取决于使用输入表达式标记化结果的代码。


根据问题中尝试的拆分,对该问题的另一种解释是,您只想在数字之后进行拆分,因此您想进行拆分:

  • 数字后
  • 不在数字之间

这当然更简单:

String[] somma = text1.split("(?<=\d)(?!\d)");
// result: ["6", "+9", "-2", "+4", "-12"]

这将允许通过简单地解析和添加值来评估仅由+-运算符组成的表达式。

最新更新