给定一个字符串,例如“fooBAR”,我希望匹配字符串末尾的大写字母(即“BAR”),并带有以下曲折:
示例:
"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”。)
我觉得这应该是直截了当的,但是对于我的爱,我找不到解决方案。有什么想法吗?
答案 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
。
答案 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
之间看到差异