首页 > 解决方案 > 我正在尝试的这种字符串操作是否有一条线?

问题描述

我有以下格式的字符串:“[someTitle1]firstName$$[someTitle2]secondName$$[someTitle3]thirdName$$[someTitle4]fourthName$$[someTitle5]fifthName$$[someTitle6]sixthName”

我想从中接收以下字符串:( "thirdName.fourthName.fifthName.sixthName"输入字符串的长度可能会有所不同,但我希望始终获得最后四个元素(保证至少有 4 个))。

我可以在一行中(或接近它)做到这一点吗?

标签: c#string

解决方案


使用新的 C#索引和范围(仅限 C# 8.0、.NET Core),这将变成一个单行:

string result = String.Join('.', Regex.Split(input, @"(^|\$\$)\[\w+]")[^4..]);

请注意,此 Regex 使用$$[someTitle]部分作为分隔符(或仅[someTitle]在开头)。

(^|\$\$)匹配行的开头 ( ^) 或 ( ) 用转义|的双重字符,因为否则在正则表达式中具有特殊含义“行尾”。也被转义,因为它表示字符集的开头。表示字母数字字符。表示至少有一个,但可能有很多。如果标题中可能出现字母和数字以外的其他字符,则替换为(导致 ) where代表任何字符。表示至少一个但尽可能少,否则会消耗最后一个。$\$[\w+\w+.+?(^|\$\$)\[.+?].+?.+]]

使用 .NET Standard 2.1 / .NET Core 2.0,您可以使用新的TakeLastLINQ 扩展方法:

string result = String.Join(".", Regex.Split(input, @"(^|\$\$)\[\w+]").TakeLast(4));

使用其他版本的 C#:

string result =
    String.Join(".", Regex.Split(input, @"(^|\$\$)\[\w+]").Reverse().Take(4).Reverse());

推荐阅读