我有以下正则表达式:
/(\(*)?(\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。
答案 0 :(得分:1)
你可以根据单词边界和非单词字符尝试这样的事情:
\b(?!^|$)|\W\K(?=\W)
并替换为空格。
细节:
\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