C# 正则表达式匹配案例 - 拆分字符串并写入文件输出

     2023-04-13     295

关键词:

【中文标题】C# 正则表达式匹配案例 - 拆分字符串并写入文件输出【英文标题】:C# Regex match case - split string and write to file output 【发布时间】:2017-06-11 23:05:23 【问题描述】:

基本上我有一个这种格式的记录文本文件:

(1909, 'Ford', 'Model T'),
(1926, 'Chrysler', 'Imperial'),
(1948, 'Citroën', '2CV'),

我要输出到以下格式的文本文件

new Vehicle()  Id = 1, Year = 1909, Make = "Ford", Model = "Model T" ,
new Vehicle()  Id = 2, Year = 1926, Make = "Chrysler", Model = "Imperial" ,
new Vehicle()  Id = 3, Year = 1948, Make = "Citroën", Model = "2CV" ,

我知道我需要将每一行分成相关的文本部分,例如尝试关注this SO 之类的问题。但是在如何获取年份、品牌和型号的相关匹配字符串部分时遇到了心理障碍。

到目前为止,我已经找到了这个,它可以在括号之间找到所有内容:

\(([^()]+)\)

但不确定如何将值分组并用逗号分隔:

非常感谢任何帮助。

【问题讨论】:

引用的字符串可以包含'('或')'吗? ), 后面总是有换行符吗? 好吧,如果你想使用正则表达式,你可以试试^\((\d+)\s*,\s*'([^']*)'\s*,\s*'([^']*)'\), 【参考方案1】:

正则表达式将它们分组:

\((\d+),\s+[']([\w\së]+)['],\s+[']([\w\s]+)[']\)[,]*

请注意雪铁龙存在问题ën => 您必须输入所有不在 a-z、A-Z 范围内的特殊符号(如 ë ü ÿ 等)

要在代码中使用,您将获得第一组:

string cars = @"(1909, 'Ford', 'Model T'),"
string pattern = @"\((\d+),\s+[']([\w\së]+)['],\s+[']([\w\s]+)[']\)[,]*";
var lResult = Regex.Match(cars, pattern);

if(lResult.Success)
    foreach( var iGroup in lResult.Groups)
        Console.WriteLine(iGroup);

在 lResult.Groups 你得到了关于汽车的信息,你只是根据需要将它输出到文件中。

C# 6.0:

Console.WriteLine($"new Vehicle()  Id = 1, Year = lResults.Groups[1], Make = \"lResults.Groups[2]\", Model = \"lResults.Groups[3]\",");

旧语法:

Console.WriteLine(@"new Vehicle()  Id = 1, Year = "+ lMatch.Groups[1]+", Make = "+ lMatch.Groups[2] + ", Model = "+ lMatch.Groups[3] + " ,");

一旦你把它自动化到 for 循环中,你就可以很容易地添加 Id。

我的示例在 Groups[0] 中包含整个字符串,所以这就是为什么我的索引从 1 开始到 3。

正如@Toto所说,\w已经包含\d,那就不用写了。

【讨论】:

模型可能包含除字母/数字以外的其他字符 @Toto,谢谢,不知道 \d。如果还有其他字符,我们必须定义它们是什么字符 -> 从一些国家/通用字母表中获取。【参考方案2】:

为什么不使用 string.Split(',')?会比正则表达式更快并且适合您(当然,首先删除每行的最后一个“,”。

【讨论】:

如果模型中有逗号会发生什么? 他的问题不清楚,我不知道他是否需要从文本文件读取到 modile 或反之亦然,但无论如何,在任何一种情况下,他都必须有一个用于字段的 deilmitar设置为唯一的 我确实可以使用字符串拆分,但认为正则表达式会更简洁? 不这么认为。 Split 更容易阅读,我认为它是为这类情况设计的。对于更复杂的情况,我会让正则表达式...保持简单 @Tatranskymedved 我会遵循 KISS 原则en.wikipedia.org/wiki/KISS_principle 如果系统模式始终相同,为什么要使用正则表达式?更难阅读,更难主要,不是为了这个目的。如果您的系统将来发生变化,那么考虑使用正则表达式,但现在不要使用正则表达式,因为将来它可能会改变......【参考方案3】:

如果您愿意使用解析器框架(这可能有点矫枉过正),您可以使用例如sprache。没有正确错误处理的示例:

Parser<string> stringContent = 
    from open in Parse.Char('\'').Once()
    from content in Parse.CharExcept('\'').Many().Text()
    from close in Parse.Char('\'').Once()
    select content;

Parser<string> numberContent = Parse.Digit.AtLeastOnce().Text();
Parser<string> element = stringContent.XOr(numberContent);

Parser<List<string>> elements =
    from e in element.DelimitedBy(Parse.Char(',').Token())
    select e.ToList();

Parser<List<string>> parser =
    from open in Parse.Char('(').Once()
    from content in elements
    from close in Parse.Char(')').Once()
    select content;

var input = new List<string>  "(1909, 'Ford', 'Model T')", "(1926, 'Chrysler', 'Imperial')", "(1948, 'Citroën', '2CV')" ;

foreach (var line in input)

    var parsed = parser.Parse(line);
    var year = Int32.Parse(parsed[0]);
    var make = parsed[1];
    var model = parsed[2];

    Console.WriteLine(">> " + year + " " + make + " " + model);

【讨论】:

\w 已经包含\d。您与 Citroën 中的 ë 不匹配(取决于区域设置)。模型可能包含除字母/数字以外的其他字符 @Toto 通过通用元组解析器修复【参考方案4】:

您可以根据命名的捕获组使用此 sn-p:

var cars = new List<string>() 
    "(1909, 'Ford', 'Model T')",
    "(1926, 'Chrysler', 'Imperial')",
    "(1948, 'Citroën', '2CV')",
;

var regex = @"(?<Year>\d+).*?'(?<Brand>.*?)'.*?'(?<Model>.*?)'";

foreach (var car in cars)

    var match = Regex.Match(car, regex);
    if (match.Success)
    
        Console.WriteLine($"match.Groups["Brand"] make match.Groups["Model"] in match.Groups["Year"]");
    

将打印的内容:

福特在 1909 年制造 T 型车

克莱斯勒在 1926 年成为帝国汽车

1948 年雪铁龙制造 2CV

【讨论】:

C# 正则表达式拆分为 Java 模式拆分

】C#正则表达式拆分为Java模式拆分【英文标题】:C#RegexSplitToJavaPatternsplit【发布时间】:2010-11-0310:16:27【问题描述】:我必须将一些C#代码移植到Java,但在转换字符串拆分命令时遇到了一些问题。虽然实际的正则表达式仍然正确... 查看详情

正则表达式从字符串中精确匹配 11 位电话号码并从 C# 中的匹配中删除连字符(-)

】正则表达式从字符串中精确匹配11位电话号码并从C#中的匹配中删除连字符(-)【英文标题】:regextoexactmatch11digitphonenumberfromstringandremovehyphen(-)frommatchinc#【发布时间】:2019-04-1709:05:34【问题描述】:我正在c#windows窗体中创建一... 查看详情

如何使用正则表达式拆分字符串并包含空格

】如何使用正则表达式拆分字符串并包含空格【英文标题】:HowtouseRegextosplitastringANDincludewhitespace【发布时间】:2015-03-2313:59:11【问题描述】:我似乎找不到(或编写)将以下句子拆分为单词并将单词分配给字母之间的空白的简... 查看详情

正则表达式拆分并合并为单个记录

】正则表达式拆分并合并为单个记录【英文标题】:Regexsplitandmergeintosinglerecord【发布时间】:2021-05-2108:51:18【问题描述】:在我的C#应用程序中,我使用下面的正则表达式来拆分字符串([A-Z0-9]20\\d0)。但它将ErrorCode和ErrorMsg拆分为... 查看详情

在正则表达式 c# 中拆分字符串

】在正则表达式c#中拆分字符串【英文标题】:SplittingastringinRegexc#【发布时间】:2021-12-1419:55:52【问题描述】:我正在尝试通过以下方式在C#中拆分字符串:输入字符串的格式为Items.Test1~Items.test2-Items.Test3我正在尝试将其拆分为... 查看详情

C# 正则表达式拆分但如果拆分失败则包含空字符串

】C#正则表达式拆分但如果拆分失败则包含空字符串【英文标题】:C#RegexSplitbutincludeemptystringiffailstosplit【发布时间】:2019-06-0723:40:03【问题描述】:我正在尝试将一个字符串拆分为一个字符串数组。我当前的字符串看起来像这... 查看详情

正则表达式匹配在任意位置连字符并分成两行的特定单词

】正则表达式匹配在任意位置连字符并分成两行的特定单词【英文标题】:regextomatchspecificwordshyphenatedatarbitrarypositionsandsplitacrosstwolines【发布时间】:2012-10-1600:48:24【问题描述】:我希望在文本文件中搜索给定的单词,该单词可... 查看详情

正则表达式与 C# 中的 OR 条件最长匹配

】正则表达式与C#中的OR条件最长匹配【英文标题】:RegexmatchinglongestwithORconditioninC#【发布时间】:2021-10-2510:42:50【问题描述】:我正在尝试提取字符串的一部分,其中在正则表达式中设置了多个模式,并使用条件OR("|")来测试它... 查看详情

正则表达式匹配注释(单行或多行)并匹配其他所有内容(C#)

】正则表达式匹配注释(单行或多行)并匹配其他所有内容(C#)【英文标题】:Regexmatchcomments(single-lineormultiple-line)andmatcheverythingelse(C#)【发布时间】:2020-03-2408:53:49【问题描述】:我正在使用C#,我想匹配单行cmets或多行cmets或e... 查看详情

正则表达式将多次出现与字符串 C# 中的数字匹配

】正则表达式将多次出现与字符串C#中的数字匹配【英文标题】:RegexMatchmultipleoccurenceswithnumbersinstringC#【发布时间】:2017-02-2101:13:32【问题描述】:我一直在寻找我的问题答案,但找不到所以我写在这里。我想以字符串为例:="3... 查看详情

perl语言(代码片段)

...$MATCH上一次成功匹配的字符=~匹配!~不匹配m/str/或/str/正则表达式,看是否含有字符串str<,>,>>代表读取、写入、追加    查看详情

预先将正则表达式模式附加到拆分并将案例类映射到拆分

】预先将正则表达式模式附加到拆分并将案例类映射到拆分【英文标题】:Preappendregexpatterntosplitandmapcaseclasstosplitted【发布时间】:2018-11-1111:50:17【问题描述】:我想拆分以下格式为的字符串valstr="X|blnk_1|blnk_2|blnk_3|blnk_4|time1|time2... 查看详情

正则表达式在 C# 中拆分 OSX df -h 输出

】正则表达式在C#中拆分OSXdf-h输出【英文标题】:RegexsplitOSXdf-houtputinC#【发布时间】:2021-03-2902:35:58【问题描述】:我正在解析一些macOSX日志文件,并且遇到了df-h命令的输出,我现在需要对其进行拆分。该行看起来像:FilesystemS... 查看详情

正则表达式/字符串拆分

】正则表达式/字符串拆分【英文标题】:RegularExpression/Stringsplit【发布时间】:2016-06-2023:24:02【问题描述】:我对RegEx的了解并不像我应该了解的那样熟悉。但是,我正在寻找与值的变体匹配的表达式。我有一个值列表(总共大... 查看详情

C#正则表达式匹配时间

】C#正则表达式匹配时间【英文标题】:C#Regextomatchtime【发布时间】:2019-07-2619:50:55【问题描述】:我正在尝试编写一个正则表达式来匹配“时间”(hh:mm:ss),例如11:20:00、18:02:22或6:00:00。我写了以下内容,但它没有按预期工作... 查看详情

您可以在字符串拆分中使用零宽度匹配正则表达式吗?

】您可以在字符串拆分中使用零宽度匹配正则表达式吗?【英文标题】:Canyouusezero-widthmatchingregexinStringsplit?【发布时间】:2011-01-2506:50:36【问题描述】:System.out.println(Arrays.deepToString("abc<def>ghi".split("(?:<)|(?:>)")));这打印... 查看详情

正则表达式匹配和拆分字符串的每三次出现

】正则表达式匹配和拆分字符串的每三次出现【英文标题】:Regextomatchandspliteverythirdoccurrenceofastring【发布时间】:2020-03-0123:03:08【问题描述】:在KornShell脚本中,我在字符串变量contents中有大量数据,符合以下语法:account_id_0:gr... 查看详情

正则表达式将字符串拆分为 char 但具有最大大小

】正则表达式将字符串拆分为char但具有最大大小【英文标题】:Regexsplitstringtocharbutwithmaximumsize【发布时间】:2018-12-0500:19:23【问题描述】:我正在尝试在C#中构建一个正则表达式,以将我扫描的条形码与组(GS1代码)匹配。所... 查看详情