我需要将addres线分成3个部分,每个部分的大小不同。在这种情况下:40、30和30个字符。我想用空格分隔输入字符串,所以这很有意义。
为此,我写了一个reular表达式:(.{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#结果:“ 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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句