正则表达式最后部分的间距

时间:2017-06-04 19:18:12

标签: regex pcre

我有以下正则表达式:

/(\(*)?(\d+)(\)*)?([+\-*\/^%]+)(\(*)?(\)*)?/g

我有以下字符串:

(5+4+8+5)+(5^2/(23%2))

我使用正则表达式在数字,算术运算符和括号之间添加空格。

我这样做:

\1 \2 \3 \4 \5 \6

将字符串转换为:

( 5 + 4 + 8 + 5 ) + ( 5 ^ 2 / ( 23 % 2))

正如您所看到的,最后两个括号不会间隔。

我怎样才能让它们成为空间?

输出应如下所示:

( 5 + 4 + 8 + 5 ) + ( 5 ^ 2 / ( 23 % 2 ))

试用正则表达式here

2 个答案:

答案 0 :(得分:1)

你可以根据单词边界和非单词字符尝试这样的事情:

\b(?!^|$)|\W\K(?=\W)

并替换为空格。

demo

细节:

\b      # a word-boundary
(?!^|$) # not at the start or at the end of the string
|       # OR
\W      # a non-word character
\K      # remove characters on the left from the match result
(?=\W)  # followed by a non-word character

答案 1 :(得分:1)

您可以尝试一种简单快速的解决方案

修改
一些提示:
我知道你没有验证简单的数学表达式,但在尝试美化之前这样做并没有什么坏处。

无论哪种方式,您都应提前 remove all whitespace 查找\s+替换nothing

要缩小总和符号,您可以这样做:
查找(?:--)+|\++替换+
查找[+-]*-+*替换-

分区和功率符号含义将随实施而变化,
并且压缩它们是不可取的,最好只是验证表单。

验证是由括号的含义复杂化的更复杂的壮举,
和他们的平衡。这是另一个话题。

尽管应该进行最小字符验证 字符串必须至少与^[+\-*/^%()\d]+$匹配。

在选择执行上述操作后,在其上运行美化器。

https://regex101.com/r/NUj036/2

查找((?:(?<=[+\-*/^%()])-)?\d+(?!\d)|[+\-*/^%()])(?!$))
替换'$1 '

解释

 (                             # (1 start)
      (?:                           # Allow negation if symbol is behind it
           (?<= [+\-*/^%()] )
           -
      )?
      \d+                           # Many digits
      (?! \d )                      #  - don't allow digits ahead
   |                              # or,
      [+\-*/^%()]                   # One of these operators
 )                             # (1 end)
 (?! $ )                       # Don't match if at end of string