正则表达式匹配所有文本而没有部分

时间:2013-10-04 08:12:21

标签: c# regex

我正在尝试编写正则表达式,该表达式将匹配以XYZ结尾的所有行,除了以AAXYZ结尾的行。

一些例子:

  1. ABCXYZ - 应匹配
  2. AAXYZ - 不应匹配
  3. ABXYZ - 应匹配
  4. 我从以下表达式.*[^A][^A]XYZ$开始,但它不适用于示例3

2 个答案:

答案 0 :(得分:1)

String[] lines=Regex.Split(input,"[\r\n]+")
                    .Where(x=>Regex.IsMatch(x,"^(?=.*(?<!AA)XYZ$).*$"))
                    .Select(x=>x.Value)
                    .ToArray();

如果只需要正则表达式

^(?=.*(?<!AA)XYZ$).*$

答案 1 :(得分:1)

正则表达式在这里看起来有些过分:

var matches = myInput.Split(new[] {'\n'}, StringSplitOptions.RemoveEmptyEntries)
                     .Where(x => x.EndsWith("XYZ") && !x.EndsWith("AAXYZ"))
                     .ToList();

如果您需要正则表达式,您可以执行以下操作:

^(|.|.*[^A].|.+[^A])XYZ$

这简单地扩展了管道交替的所有可能性:

  • 只需XYZ
  • 任何单个字符后跟XYZ(例如AXYZ
  • 零个或多个字符后跟非A和另外一个字符XYZ(例如QAXYZfoobarBAXYZ
  • 一个或多个字符后跟非A和XYZ(例如XBXYZfoobarXYZ