正则表达式匹配大写字母的前两次出现,后跟几个小写字母

本文关键字:小写字 几个 两次 大写字母 正则表达式 | 更新日期: 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})?

然后,您需要连接两个捕获组以获得最终结果。