正则表达式匹配大写字母的前两次出现,后跟几个小写字母
本文关键字:小写字 几个 两次 大写字母 正则表达式 | 更新日期: 2023-09-27 17:56:57
我一直在浏览这里的示例,了解如何进行类似的正则表达式匹配,但我无法让它适用于我的情况。
我有一个像ThisisMystringItsTooLong
这样的字符串,我想找回ThiMys
(大写字母的前两次出现,后面是两个小写字母)但是,如果那里的字符串只是Thisismystring
(只有一个大写字母),那么我只想
返回Thi
.
我已经尝试([A-Z]{1})([a-z]{2}){0,1}
只获得我的匹配的第一次出现,在大写字母超过 2 个的情况下,但我不确定如何应用第二个条件。
您不能仅使用正则表达式执行此操作,因为匹配始终是输入的连续子字符串。当然,您可以将多个匹配项组合为一个最终结果。
String.Join(String.Empty, Regex.Matches(input, "[A-Z][a-z]{2}")
.Cast<Match>()
.Take(2)
.Select(match => match.Value));
我只需[A-Z][a-z]{2}
使用正则表达式模式并"手动"执行其他逻辑。
public string ShortIdentifier(string longIdentifier)
{
MatchCollection matches = Regex.Matches(longIdentifier, "[A-Z][a-z]{2}");
if (matches.Count == 1) {
return matches[0].Value;
} else if (matches.Count >= 2) {
return matches[0].Value + matches[1].Value;
}
return longIdentifier.Substring(0, Math.Min(longIdentifier.Length, 6));
// Or return whatever you want when there is no match.
}
如果要返回一个大写字母,后跟一个或两个小写字母,请将正则表达式更改为 [A-Z][a-z]{1,2}
。
您可以创建如下方法:
public string GetMyCharacters(string s)
{
int numOfCaps = Regex.Matches(s, "[A-Z]").Count;
if (numOfCaps > 2)
{
var matches = Regex.Matches(s, "[A-Z][a-z]{2}");
return matches[0].Value + matches[1].Value;
}
else if (numOfCaps == 1)
{
var matches = Regex.Matches(s, "[A-Z][a-z]{2}");
return matches[0].Value;
}
else { return null; }
}
然后这样称呼它:
Console.WriteLine(GetMyCharacters("ThisisMystringItsTooLong")); // ThiMys
Console.WriteLine(GetMyCharacters("Thisismystring")); // Thi
Console.WriteLine(GetMyCharacters("wijfowro"));// null
我最初误解了要求,但这里是固定版本:
Regex.Replace(
"ThisisMystringItsTooLong",
"^(?:.*?([A-Z][a-z]{2}))?(?:.*?([A-Z][a-z]{2}))?.*$",
"$1$2"
)
它匹配整个输入字符串,开始 (^) 到结束 ($),它拆分为:
(?:.*?([A-Z][a-z]{2}))? - optional non-capturing group, which consists of
a bunch of non-greedy anything followed
by substring sought, which is captured
(?:.*?([A-Z][a-z]{2}))? - another exactly same group; if we want to place
some limits on what can be between substrings
sought (like no spaces etc.) it goes here
instead of the anything
?.* - anything else
然后,它通过使用 Regex.Replace 方法连接两个(可能为空的)匹配项来构造输出字符串。测试:
"ThisisMystringItsTooLong" -> "ThiMys"
"Thisismystring" -> "Thi"
"thisismystring" -> ""
"that is His String" -> "HisStr"
"oh Hi There!" -> "The"
"oh Hi There Go Here" -> "TheHer"
与 Danies 的答案不同,除了正则表达式之外没有使用任何东西,但不确定它的性能是更好还是更差。
尝试 http://regex101.com/r/pU4aB5
([A-Z]{1}[a-z]{2})[a-z]*([A-Z]{1}[a-z]{2})?
然后,您需要连接两个捕获组以获得最终结果。