2017-06-04 64 views
0

我有以下的正則表達式:間距在正則表達式的最後一部分

/(\(*)?(\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

嘗試['\ C |(= \ W?)'(<= \ W?)](HTTPS: //regex101.com/r/NQvCxA/2)並用空格替換。這需要一個執行多個分區和替換的方法(如PHP中的'preg_replace')。 –

+0

@WiktorStribiżew你是我見過的最有天賦的正則表達式模式編寫者之一。你爲什麼不把你的答案發布成像SO這樣的答案? https://meta.stackexchange.com/questions/230676/hey-you-yeah-you-post-your-answers-as-answers-not-comments – mickmackusa

+0

@mickmackusa因爲它和卡西米爾的回答一樣。我們幾乎在同一時間發佈,爲什麼重複? –

回答

1

你可以嘗試一種簡單而快速的解決方案

編輯
一些提示:
我知道你是不是驗證簡單的數學表達式,但在美化之前這樣做不會有什麼壞處。

無論哪種方式,你應該remove all whitespace提前
查找\s+替換nothing

爲了縮小求和符號,你可以這樣做:
查找(?:--)+|\++替換+
查找[+-]*-+*替換-

司和權力符號的含義會因實施而有所不同n,
並且將它們濃縮是不可取的,並且更好地僅僅驗證表單。

驗證是更爲複雜的專長,因括號,
和 及其餘額的含義而複雜化。那是另一個話題。

儘管應該做一個最小字符驗證。
字符串必須至少與^[+\-*/^%()\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 
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 
+0

是否可以使它處理負數? – Drago

+0

@Drago:不,這是一個不同的問題。 –