正则表达式匹配字符串末尾的大写字母与扭曲

时间:2013-10-25 19:43:53

标签: c# regex string

给定一个字符串,例如“fooBAR”,我希望匹配字符串末尾的大写字母(即“BAR”),并带有以下曲折:

  1. 比赛必须至少包含两个字母
  2. 匹配必须包含以下任何内容:1D,2D,3D,4D
  3. 示例:

    "fooB" -> ""
    "fooBAR" -> "BAR"
    "foo64BAR" -> "BAR"
    "foo64BR" -> "BR"
    "fooDBAR" -> "DBAR"
    "foo12BAR" -> "BAR"
    "foo1DBAR" -> "BAR"
    

    琐碎的正则表达式

    [A-Z][A-Z]+
    

    在最后一个示例中失败(返回“DBAR”而不是“BAR”。)

    负面观察,例如

    (?<![1-4D])[A-Z][A-Z]+
    

    也失败了最后一个例子(返回“AR”而不是“BAR”。)

    我觉得这应该是直截了当的,但是对于我的爱,我找不到解决方案。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

我只是将一些简单的模式与一些代码相结合,沿着这些方向:

string GetMatch(string input)
{
    var match = Regex.Match(input, @"\d?([A-Z]{2,})$");
    if (Regex.Match(match.Value, @"^[1-4]D").Success)
        return match.Groups[1].Value.Substring(1);
    else
        return match.Groups[1].Value;
}

答案 1 :(得分:2)

负面后卫不起作用,因为它在比赛前需要1,2,3,4或D以外的东西。您的示例中的“B”符合断言,因此匹配就是之后的所有内容。

你需要寻找一个没有前缀为1-4的D,后面是另一个大写字母,或者除了D后面跟着另一个大写字母的任何字母。

((?<![1-4])D|[ABCE-Z])[A-Z]+$

答案 2 :(得分:1)

使用正则表达式选项Right To Left从最后开始工作:

(?<![1-4])D?[A-Z-[D]]{2,}

答案 3 :(得分:0)

以下内容应该有效:

(?!(?<=[1-4])D)[A-Z]{2,}$

这里的主要正则表达式是[A-Z]{2,},它将匹配字符串末尾的两个或多个大写字符。否定前瞻(?!(?<=[1-4])D)涵盖了您的其他要求。这可以理解为“如果前一个字符是从1到4的数字,则失败,下一个字符是D”。

如果您想在一行结尾而不是字符串结尾处匹配,请使用RegexOptions.Multiline

示例:http://rubular.com/r/XgKv9pavJd

答案 4 :(得分:0)

F.J.的正则表达式

(?!(?<=[1-4])D)[A-Z]{2,}$

对所有可能的输入都不正确,例如

fooBar1DDBAR
fooBar1DDB

稍作修正应该可以解决问题:

(?<![A-Z])(?!(?<=[1-4])D)[A-Z]{2,}$

http://rubular.com/r/dGJWj7lE79(F.J。)与http://rubular.com/r/mOux7d4zv3

之间看到差异