c# - 用定义长度的空格分割字符串
问题描述
我需要将地址线分成 3 个部分,每个部分的大小不同。在这种情况下:40、30 和 30 个字符。我想用空格分割输入字符串,所以这很有意义。
(.{1,32})([ ]+.{1,30}){0,1}([ ]+.{1,30}){0,1}
为此,我写了一个正则表达式:并在这个网站上尝试过:https ://regex101.com 。有效!
我搬到 Visual Studio 编写一些代码来检查它:
public static void TEST()
{
List<string> ok = new List<string>();
List<string> err = new List<string>();
var lista = GetLista();
foreach (string dir in lista)
{
Regex regex = new Regex(@"(.{1,32})([ ]+.{1,30}){0,1}([ ]+.{1,30}){0,1}");
dir = dir.Trim();
GroupCollection cap = regex.Match(dir).Groups;
if (cap.Count == 0) err.Add(dir);
else ok.Add($"{dir};{cap[0].Value};{(cap.Count > 1 ? cap[1].Value.Trim() : "")};{(cap.Count > 2 ? cap[2].Value : "")};{(cap.Count > 3 ? cap[3].Value.Trim() : "")}";);
}
File.WriteAllLines("ok.txt", txt);
File.WriteAllLines("er.txt", err);
}
结果大相径庭,根本不匹配。正则表达式在 C# 中是否有所不同?
有没有其他方法可以实现这一目标?
编辑:正则表达式给出不同的地方。
更新:我将提供一个例子。让我们使用这个字符串:“ERIK ADESIR COMPANY LA ISLA DE LA PALMA”。
c# result: "ERIK ADESIR COMPANY LA ISLA DE L";"ERIK ADESIR COMPANY LA ISLA DE L";;
通缉:“ERIK ADESIR COMPANY LA ISLA DE”;“LA PALMA”;“”
我认为问题在于正则表达式没有采用整个字符串,只是其中的一部分。
解决方案
您想匹配整个字符串,因此您需要添加锚点,^
并且$
. 接下来,您需要获取捕获的子字符串,而不是整个 match。请注意,GroupCollection
返回所有捕获的组值和整个匹配项作为第一项。因此,您match.Groups
将包含 1 + 捕获组值的数量。您需要忽略第一项。
此外,要检查组是否匹配,您需要使用cap[x].Success
而不是cap.Count > x
.
所以,你需要这样的代码:
foreach (string dir in lista)
{
var match = Regex.Match(dir, @"^(.{1,32})([ ]+.{1,30})?([ ]+.{1,30})?$");
if (match.Success)
{
var cap = match.Groups;
ok.Add($"{dir};{cap[1].Value};{(cap[2].Success ? cap[2].Value.Trim() : "")};{(cap[3].Success ? cap[3].Value : "")}");
}
else
{
err.Add(dir);
}
}
在线查看C# 演示:
List<string> ok = new List<string>();
List<string> err = new List<string>();
var lista = new[] { "ERIK ADESIR COMPANY LA ISLA DE LA PALMA" };
foreach (string dir in lista)
{
var match = Regex.Match(dir, @"^(.{1,32})([ ]+.{1,30})?([ ]+.{1,30})?$");
if (match.Success)
{
var cap = match.Groups;
ok.Add($"{dir};{cap[1].Value};{(cap[2].Success ? cap[2].Value.Trim() : "")};{(cap[3].Success ? cap[3].Value : "")}");
}
else
{
err.Add(dir);
}
}
Console.WriteLine(string.Join("\n", ok));
输出:
ERIK ADESIR COMPANY LA ISLA DE LA PALMA;ERIK ADESIR COMPANY LA ISLA DE;LA PALMA;
推荐阅读
- amazon-web-services - 在 Spring Batch 中列出 S3 存储桶中的可用文件
- python - 将一个类中的多个属性调用到另一个类中 - Python
- java - 使用 Sinks.Many 时重试次数过多
.tryEmitNext 来自多个线程 - javascript - 带有输入的 jQuery 过滤器(包括/内部复选框)
- python - 我需要从 docx 文件中获取包含数据的表格
- talend - Talend Studio 启动时选择工作区时出现问题:“工作区已更改。请重新启动”
- flutter - “int”类型不是“String”类型的子类型,但一切都是整数
- ffmpeg - ffmpeg 记录 16 位,即使我只想要 8 位
- java - 确定两个元素是否位于二维数组的同一行或同一列中的最快方法是什么?
- c++ - 纯虚函数的继承