2015-12-16 26 views
0

我需要實現的功能進行改造的一個:更換characted方括號之間,通過枚舉符號

字符「{」,「}」,「|」,「\」有一個特殊的含義。包含在{和}中的字符應該作爲一組| -delimited選項來處理,其中一個選項應該隨機選擇並用於替換結果字符串中的機箱。機箱可以嵌套。 '\'應該被解釋爲一個文字轉義字符,所以前面的大括號和管道不會被解析爲源字符串語法的一部分。

例如:

Example 1: 
'ab{c|d|e}' 
Possible results: 
'abc' 
'abd' 
'abe' 

Example 2: 
'a{b{c|d}|e{f|g}}h' 
Possible results: 
'abch' 
'abdh' 
'aefh' 
'aegh' 

Example 3: 
'a{b|c}d{e|f}h' 
Possible results: 
'abdeh' 
'abdfh' 
'acdeh' 
'acdfh' 

Example 4: 
'{\{|\||\}}' 
Possible results 
'{' 
'|' 
'}' 

希望我已經解釋清楚這一點。如果你得到了我想要達到的目標,並且可以想出一個更好的方法來做到這一點,我會非常感激。

+0

怎麼樣嵌套? – sln

+0

使用'preg_replace_callback()' – Barmar

+0

將表達式轉換爲正則表達式,將「{}」替換爲「()」,並使用類似反向正則表達式的庫:https://github.com/icomefromthenet/ReverseRegex。 – maxhb

回答

1

如果沒有嵌套,並且保持簡單,使用\G結構和基於捕捉組其他一些
邏輯,你應該能夠構建
文字輸出。

注意 - 這只是解析孤立的分組,而不是之後。
這將被視爲您想要解析的子部分。
您可以刪除^定位點併爲中間字符串使用添加邏輯。
但是,像這樣說,這只是一個部分。

以下用法 -
使用while循環搜索每個匹配項。
在正文中,這些是觸發器:
- 如果組1匹配,則存儲前綴值。
(第2組將同時匹配)。
- 如果第2組匹配,這是下一個,將其與前綴
結合爲一個獨特的部分。
- 第3組將始終匹配。這是你在哪裏的指標。
它匹配 bar |或末端支架}

繼續緩存臨時唯一部分,直到找到末端支架
在所有匹配結束時,如果遇到結尾,則唯一部分
有效。也就是說,整個事情分析得很好。

在每個部分中,您將需要刪除任何轉義,因爲它們在匹配中沒有被剝離

Find: (?<!\\)\\\K\\ 
'~(?<!\\\)\\\\\K\\\\~' 
Replace: nothing 

祝你好運!


正則表達式:
(?:(?!^)\G|^([^\|{}\\]*(?:\\.[^\|{}\\]*)*){)([^\|}\\]*(?:\\.[^\|}\\]*)*)(\||})

'~(?:(?!^)\G|^([^\|{}\\\]*(?:\\\.[^\|{}\\\]*)*){)([^\|}\\\]*(?:\\\.[^\|}\\\]*)*)(\||})~'

格式化:

(?: 
     (?! ^) 
     \G 
    | 
    ^
     (       # (1 start) 
      [^\|{}\\]* 
      (?: \\ . [^\|{}\\]*)* 
    )        # (1 end) 
     { 
) 
(       # (2 start) 
     [^\|}\\]* 
     (?: \\ . [^\|}\\]*)* 
)        # (2 end) 
(\| | })     # (3) 

實施例4輸出:

** Grp 0 - (pos 0 , len 4) 
{\{| 
** Grp 1 - (pos 0 , len 0) EMPTY 
** Grp 2 - (pos 1 , len 2) 
\{ 
** Grp 3 - (pos 3 , len 1) 
| 

------------------ 

** Grp 0 - (pos 4 , len 3) 
\|| 
** Grp 1 - NULL 
** Grp 2 - (pos 4 , len 2) 
\| 
** Grp 3 - (pos 6 , len 1) 
| 

------------------- 

** Grp 0 - (pos 7 , len 3) 
\}} 
** Grp 1 - NULL 
** Grp 2 - (pos 7 , len 2) 
\} 
** Grp 3 - (pos 9 , len 1) 
} 

示例1輸出:

** Grp 0 - (pos 0 , len 5) 
ab{c| 
** Grp 1 - (pos 0 , len 2) 
ab 
** Grp 2 - (pos 3 , len 1) 
c 
** Grp 3 - (pos 4 , len 1) 
| 

    ------------------- 

** Grp 0 - (pos 5 , len 2) 
d| 
** Grp 1 - NULL 
** Grp 2 - (pos 5 , len 1) 
d 
** Grp 3 - (pos 6 , len 1) 
| 

    ------------------- 

** Grp 0 - (pos 7 , len 2) 
e} 
** Grp 1 - NULL 
** Grp 2 - (pos 7 , len 1) 
e 
** Grp 3 - (pos 8 , len 1) 
}