2016-07-21 72 views
1

和提取數據從API來的重複組。我需要在可以在數據中的任何位置的[]括號之間提取文本。例如採集的數據不包含字符,我想驗證字符串

This is [extract] message 
This is message [extract] 
[extract] this message 

正則表達式,我使用這個如下從API工作正常

^[^\]\[]*?\[(?<description>[^\]\[]+)\][^\]\[]*?$ 

現在數據可以是HTML編碼的和具有%5B代替[和%5D代替。

我正則表達式更新爲如下:

^[^\]\[%5B%5D]*?(\[|%5B)(?<description>[^\]\[%5B%5D]+)(\]|%5D)[^\]\[%5B%5D]*?$/i 

但它不處理%5B和5D%作爲單一原子。因此不能夠從下面的有效數據中提取文本:

This is [extract] message % 
This is message 5 [extract] 
[extract d] this message 

,並能夠從下面的無效數據提取文本:

[extract %5D this message 
%5B extract ] this message 

我該如何治療%5B和%5D的原子及以上正確正則表達式?

+1

我反對它運行正則表達式前的字符串進行解碼。正則表達式在純文本上效果最好。 –

+0

解碼字符串非常有意義,謝謝! –

回答

1

首先,你的第一個正則表達式應該寫成

^[^][]*\[(?<description>[^][]+)][^][]*$ 

注意沒有一點逃避[字符類內,就沒有必要逃避]字符類裏面,如果它是第一個字符字符類以外的字符和]。此外,不需要使用懶惰量詞*?,您可以同樣使用*。現在

,你應該解碼字符串到純文本,然後運行上述正則表達式。如果你不想這樣做,你將不得不使用基於回火貪婪令牌複雜的正則表達式像

^(?:(?!%5[DB])[^][])*(?:%5B|\[)(?<description>(?:(?!%5[DB])[^][])+)(?:]|%5D)(?:(?!%5[DB])[^][])*$ 

regex demo(額外模式添加,因爲它是一個多演示)。

正則表達式的解釋

  • ^ - 字符串開頭
  • (?:(?!%5[DB])[^][])* - 回火貪婪令牌匹配比][(見[^][])是不是一個起始字符以外的任何0+符號%5B%5D字符序列
  • (?:%5B|\[) - 前導分隔符,%5B[
  • (?<description>(?:(?!%5[DB])[^][])+) - 「描述」組匹配比][不是一個%5B%5D字符序列(注意起始焦炭等1+符號:您可能希望與(?<description>(?s:.+?))子模式,以檢查是否以取代這對你更好)。
  • (?:]|%5D) - 尾定界符,]%5D
  • (?:(?!%5[DB])[^][])* - 見上述(第二線)
  • $ - 字符串的結尾。

enter image description here

+1

感謝您糾正正則表達式和解釋,相當有用! –