首页 > 解决方案 > 使用正则表达式从三元运算符中仅选择条件

问题描述

我正在研究 C#,试图从三元运算符中获取条件。我尝试了正则表达式模式

\(\s*\w+.+?(?=\?)\s*\?

但在某些情况下,它完全匹配,但在某些情况下,它匹配错误的条件。

`MatchCollection mcCollection = Regex.Matches(sInputLine, @"\(\s*\w+.+?(?=\?)\s*\?");`

sInputLine 行如:-

  1. 字符串结果 = x > y ?"x 大于 y" : "没有结果";
  2. 字符串结果 = x > y ?“x 大于 y”:x < y ? “x 小于 y”:x == y ?"x 等于 y" : "没有结果";
  3. xyz.pqr((!"0".equals(x > y ? "x 大于 y" : "没有结果");
  4. 字符串 Abc = ((string)Array[0]==null? "":(string)Array[0]) + " " + ((string)Array[1]==null? "":(string)Array[ 1]);

从此输入行匹配字符串应如下所示

从输入线 1

 1. x > y ?

从输入线 2

 2. x > y ?
    x < y ?
    x == y ?

从输入线 3

 3. x > y ?

从输入线 4

 4. (string)Array[0]==null?
    (string)Array[1]==null?

标签: c#regex

解决方案


(\(|(?<!=)=)(?<target>(\(\w*\))?([^(]|(?<=)=)*?\?)

匹配你所有的例子。此处允许的双精度以及打开和关闭的括号很(string)Array...复杂。=

如果要排除?它前面的和空格,只需将其从目标组中排除:

(\(|(?<!=)=)(?<target>(\(\w*\))?([^(]|(?<=)=)*?) *\?
  • (\(|(?<!=)=)前导 ( 或 =,但没有 == (= 负前瞻 =)
  • (?<target>名为“目标”的组
  • (\(\w*\))?括号中的可能项,即 (string), (int32), (ab12)
  • ([^(]|(?<=)=)*?不是 ( 或单个 = 的字符
  • \?)一个 ?最后,目标群体的结束

推荐阅读