Java - 使用ReplaceALL表达式解析输入

时间:2014-07-23 00:08:31

标签: java regex replaceall

我试图获取格式化某种方式的输入。例如输入:

在:

"12/4"

我需要在字符串中的每个字母后面留一个空格。

后:

" 12 / 4 "

另一个例子:

"-10/-4*5"

" -10 / -4 * 5 "

6*-8/(-4+2) 

 6 * -8 / ( -4 + 2 ) 

我使用间距来解析和分割输入,但如果它们不是间距,那么我就不能按空格分割。

4 个答案:

答案 0 :(得分:2)

我们可以假设+-在它之前的括号中有数字或表达式时不是一元的。其余的运营商,例如* / ^,可以是一元的,所以它们总是应该用空格包围。

使用上述假设,您可以创建类似

的内容
String text = "-10/-4*+5+6+(1*2)-3^2";
String formatted = text.replaceAll("(?<=[\\d)])[-+]|[*/^]", " $0 ");

System.out.println(formatted);

输出:

-10 / -4 * +5 + 6 + (1 * 2) - 3 ^ 2
^^^   ^^   ^^                        these are not changed

说明:我们希望只用非一元运算符包围空格

  • (?<=[\\d)])[-+] - 我们正在检查-+是否有任何数字或)使用look-behind (?<=[\\d)])
  • [*/^]我们接受任何*/^作为需要用空格包围的非一元符号 - 如果你在这里可以添加更多符号例如( )
  • " $0 " - 此处$0表示来自第0组的匹配(来自整个正则表达式),因此我们只是将正则表达式找到的运算符替换为使用相同的运算符但用空格包围。

答案 1 :(得分:0)

使用此(请参阅the regex demo中的替换):

String replaced = yourString.replaceAll("-?\\d+|.", "$0 ");

注意:我假设12之前的空格是拼写错误,因为你说要在标记之后插入空格。

<强>解释

  • -?\d+匹配可选的连字符和数字
  • |
  • .匹配一个字符
  • $0替换了匹配和空格字符

答案 2 :(得分:0)

在这种情况下,你不必使用空格,使用其他角色:

正如我在您的示例中看到的那样,您可以尝试将运算符作为分割参数,例如+-*/

所以你可以像这样使用:

str.split("+|-|*");

答案 3 :(得分:0)

您可以使用(-?\d+)([^\d])并将其替换为$1 $2(不确定是否应该是0美元和1美元,我可以一个人关闭)。

这会找到一个数字后跟一个非数字([^\d]可以替换为[/*+-^etc]以仅匹配特定的运算符)并分别捕获每个数字,然后用第一个捕获替换它们,一个空格,然后第二次捕获。