提取内联 IF 项目

Extract Inline-IF items

如果是用 javascript 代码编写的(多行)内联,我该如何提取部分内容,如下所示:

 ( 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'"

对于一行中的两个 inline-if,我有这个正则表达式:

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

我关于解析或提取 inline-if 或 Conditional (ternary) Operator 项的问题是通过这个正则表达式和故事完成的!

首先,我在 pcre(PHP) 正则表达式测试器中完成了,因为 IF-Clause 在正则表达式或条件捕获组或任何你命名的东西中的用法,但被称为 (?(-1)true|false)

感谢 Regex101 及其简要定义:

(?(1)yes|no)

If capturing group 1 was matched so far, matches the pattern before the vertical bar. Otherwise, matches the pattern after the vertical bar. A group name, or a relative position (-1) in PCRE, can be used. Global flag breaks conditionals.

通过这个Regex 3部分内联如果提取:(输入和空格是为了更好的可读性)

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

Demo for Above Code and Improvements in next update :

  • 对于多行接受,我将 . 更改为 [^\X] 因为 pcre 不接受 [^] 的用法。 ..

  • 捕获嵌套 inline-if 中不同的组,但没关系!


现在回家了!但是,正则表达式中的 JavaScript IF 子句是什么?

(\(\s*)? (?(-1)(.+?)\s*\)|(.+?)) 转换为 JavaScript 正则表达式模式是通过两种使用负面和正面外观来完成的:(感谢 existing Answer and others

((?=conditional-pattern)yes-pattern|(?!conditional-pattern)no-pattern)

      ( (?=\(\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