0

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

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

例子:

"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”。)

我有一种感觉,这应该是直截了当的,但为了我的爱,我找不到解决方案。有任何想法吗?

4

5 回答 5

2

否定的lookbehind 不起作用,因为它在匹配之前需要1、2、3、4 或D 以外的值。您示例中的“B”符合断言,因此匹配就是之后的所有内容。

您需要查找不以 1-4 后接另一个大写字母或除 D 以外的任何字母后接另一个大写字母为前缀的 D。

((?<![1-4])D|[ABCE-Z])[A-Z]+$
于 2013-10-25T20:02:52.997 回答
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;
}
于 2013-10-25T19:53:57.593 回答
1

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

(?<![1-4])D?[A-Z-[D]]{2,}
于 2013-10-25T20:13:40.980 回答
0

以下应该有效:

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

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

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

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

于 2013-10-25T19:53:50.717 回答
0

FJ 的正则表达式模式

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

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

fooBar1DDBAR
fooBar1DDB

稍加修正应该会奏效:

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

请参阅http://rubular.com/r/dGJWj7lE79 (FJ) 与http://rubular.com/r/mOux7d4zv3的区别

于 2013-10-27T22:46:58.950 回答