2017-08-21 83 views
1

串報價在我的應用程序,我可以接受這樣的格式字符串:如何檢查在正則表達式

'key':'value' 
'key1':'value1' 
'key2':'value2' 

現在我想要寫一個正則表達式來檢查這個格式,所以我寫這篇文章的模式:

/^'(.*)'(:{1})'(.*)?'($|\n)/gm 

https://regex101.com/r/oM1qO9/3

這種模式工作,但如果我改變字符串下面的例子,再工作,因爲選擇第一個報價和最後報價等字符串匹配模式。

'key':'value','key1':'value1' 'key2':'value2' 

https://regex101.com/r/oM1qO9/4

+1

替換'。*''與[^'] *'(一個否定的字符類中的單引號)。 ['/^'([^']*)':'([^']*)'$/'](https://regex101.com/r/oM1qO9/6)。 –

+0

@WiktorStribiżew不能再工作,https://regex101.com/r/oM1qO9/5 – MajAfy

+0

你可能需要一個非貪婪的消費:'/^'(.*?)'(:{1})'(.* ?)?'($ | \ n)/ gm' –

回答

1

.*模式匹配比換行符字符儘可能多的其它任何0+字符:形成所述當前位置到行的結尾,消耗所有'字符它發現的道路上的線結束。即使你使用.*?模式,一個懶惰的量化點,它仍然會通過'找到一個有效的匹配(整行至少有4個字符)。

所以,你需要在這裏使用否定字符類,[^']匹配任何字符但是'

/^'([^']*)':'([^']*)'$/ 

或 - 不允許空鍵名:

/^'([^']+)':'([^']*)'$/ 

或 - 不允許兩個空的名稱和值:

/^'([^']+)':'([^']+)'$/ 

詳細

  • ^ - 串
  • 的開始
  • ' - 撇號
  • ([^']*) - 第1組:比'
  • ':'其他任何0+字符 - 文字串':'
  • ([^']*) - 組2:0+任何字符以外'
  • '$ - a '在字符串的末尾。

查看regex demo

請注意,*匹配0次或更多次發生。如果您需要至少匹配一個,請改用+

要允許可選空白,可在需要的地方添加\s*。例如,您可以使用

/^\s*'([^']*)'\s*:\s*'([^']*)'\s*$/ 

參見this regex demo。命名 - - 結果

+0

要匹配的正則表達式,鍵和值都應該包含至少1個字符。所以你的建議,以'取代'不應該是一個建議。 ;-)否則'':''匹配,這不是有效的鍵值對。 –

+0

@mlambrichs:OP沒有設置名稱或值至少包含1個字符的要求。我只是修改了現有的模式,以顯示如何確保字符串中只有4個單引號。 –

+0

你說得對,當然,他/她沒有具體說明。但是人們最終會將空字符串放在數據庫中,我只是想警告。 –

0

使用'([^']+)'\s*:\s*'([^']*)'
第一個它的任何非空字符串不包含「一對之間」匹配,則任何數量的空格,冒號,並且任何數量的匹配空格,最後匹配另一個可能不包含「一對之間」的空字符串。

我假設你只想捕獲鍵和值,而不是冒號,所以我刪除了捕獲組。

https://regex101.com/r/nxVAkB/3

+0

謝謝,我希望使用這個模式進行驗證,而不是捕獲字符串,所以如果一個術語不匹配所有模式應該返回false – MajAfy

0

'(?<key>[^']+)':'(?<value>[^']+)' 

全球匹配所有的例子,給你匹配。

檢查上regex101.com