2017-02-19 42 views
0

我怎樣才能提取的部分(多線)直列如果是寫在像這樣的javascript代碼:提取內嵌-IF項目

(MYDATA.FIELD > 1.03 ? 'higher than' : (0.97 > MYDATA.FIELD ? 'lower than' : 'equal to'))+ 

groups: 

"MYDATA.FIELD > 1.03" , 
"'higher than'" , 
"0.97 > MYDATA.FIELD" , 
"'lower than'" , 
"'equal to'" 

兩個直列如果一條線,我有此正則表達式:

\((.*?)\s?\?(.*?)\:\s*(\((.*?)\s?\?(.*?)\:(.*?)\))\s?\) 

(Condition1 == true || condition2 == 0.2) ? 
    {"type":"text","value":"..."}, 
    {"type":"text","value":"..."}, 
    {"type":"text","value":"..."}, 
    : 
    {"type":"text","value":"..."}, 
    {"type":"text","value":"..."}, 
) + ... 

groups: 
"Condition1 == true || condition2 == 0.2" , 

"{"type":"text","value":"..."}, 
{"type":"text","value":"..."}, 
{"type":"text","value":"..."}," , 

"{"type":"text","value":"..."}, 
{"type":"text","value":"..."}," , 

我要編輯我的javascript代碼,使JSON對象,所以沒有需要javascript替換函數!

最大深度:2

+0

示出了用於在上述輸入 – RomanPerekhrest

+0

預期的結果中提取'condition','truePart'和'falsePart'加入到質疑,@RomanPerekhrest – MohaMad

回答

0

我有關分析或提取的直列如果還是Conditional (ternary) Operator由這個表達式和故事做項目的問題!

首先,我在PCRE(PHP)的正則表達式測試儀做了,因爲在正則表達式或條件的捕獲組或任何事情,你的名字,IF-條款的慣例,但被稱爲(?(-1)true|false)

感謝Regex101,它是短暫的定義:(?(1)是|否)

如果捕獲組1到目前爲止匹配,匹配的豎線前的模式。否則,匹配豎條之後的模式。可以使用組名稱或PCRE中的相對位置(-1)。全局標誌打破條件。

通過該正則表達式3份直列如果提取:(進入和空間,是更好的可讀性)

\(\s* 
(.+?)\s*\?\s* 
    (\(\s*)? (?(-1)(.+?)\s*\)|(.+?)) 
    \s*\:\s* 
    (\(\s*)? (?(-1)(.+?)\s*\)|(.+?)) 
\s*\) 

Demo for Above CodeImprovements in next update

  • 對於多線接受我將.更改爲[^\X],因爲 pcre不接受使用o f [^] ...

  • 捕獲不同嵌套inline-if的組,但這不重要!


現在回家!但是,什麼是JavaScript在正則表達式的IF-子句? ?

轉換(\(\s*)? (?(-1)(.+?)\s*\)|(.+?))爲JavaScript正則表達式模式是由兩種使用陰性和陽性長相完成:(感謝existing Answerothers

((=有條件的圖案)是圖案|(?!有條件的模式)無圖案)

 ((?=\(\s*) .+?\) | (?!\(\s*) .+?) 
Condition^^^^^^^ ^^^true   ^^^false 

提取inline-if最後的正則表達式是:(進入和空間,是更好的可讀性)

\(\s* 
([^]+?)\s*\?\s* 
    ((?=\(\s*)[^]+?\)|(?!\(\s*)[^]+?) 
     \s+\:\s+ 
    ((?=\(\s*)[^]+?\)|(?!\(\s*)[^]+?) 
\s*\) 
  • 感謝{"type":"text","value":"..."},有不:\s+\:\s+的使用解決了我通過json對象定義的多行搜索並找到false部分。

Demo for Final Answer