c# - 我正在尝试的这种字符串操作是否有一条线?
问题描述
我有以下格式的字符串:“[someTitle1]firstName$$[someTitle2]secondName$$[someTitle3]thirdName$$[someTitle4]fourthName$$[someTitle5]fifthName$$[someTitle6]sixthName”
我想从中接收以下字符串:(
"thirdName.fourthName.fifthName.sixthName"
输入字符串的长度可能会有所不同,但我希望始终获得最后四个元素(保证至少有 4 个))。
我可以在一行中(或接近它)做到这一点吗?
解决方案
使用新的 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,您可以使用新的TakeLast
LINQ 扩展方法:
string result = String.Join(".", Regex.Split(input, @"(^|\$\$)\[\w+]").TakeLast(4));
使用其他版本的 C#:
string result =
String.Join(".", Regex.Split(input, @"(^|\$\$)\[\w+]").Reverse().Take(4).Reverse());
推荐阅读
- scala - 无法为 scala 中的枚举列表生成正确的招摇
- android - 如何使 ReplacementSpan 无效
- java - final类可以扩展java中的其他类吗?
- android - 如何在 RecyclerView 中制作粘性标题?(有或没有外部库)
- javascript - 使用 Axios 发送多个请求的查询 - React
- mongodb - 如何将观看流定位到有限的数据集?
- android - 在 Android 版 Adobe Animate Air 中保存图像
- javascript - 使用 javascript 从输入数组创建 HTML 列表
- python - PYTHON:如何修复循环停止?
- python - 在 django-admin 中显示相关 m2o 对象的字段