Regex 如何使用正则表达式将字符串转换为不同的子字符串?

Regex 如何使用正则表达式将字符串转换为不同的子字符串?,regex,vb.net,Regex,Vb.net,我有一个包含行的文本文件,类似于 000001 , Line 1 of text , customer 1 name 000002 , Line 2 of text , customer 2 name 000003 , Line 3 of text , customer 3 name = = = = = = = = = 00008

我有一个包含行的文本文件,类似于

000001 , Line 1 of text , customer 1 name
000002 , Line 2 of text , customer 2 name
000003 , Line 3 of text , customer 3 name
  =               =             =
  =               =             =
  =               =             =
000087 , Line 87 of text, customer 87 name
  =               =             =
  =               =             =
001327 , Line 1327 of text, customer 1327 name
  =               =             =
  =               =             =
  =               =             =
我可以编写一个程序,读取上述文件的每一行,将其转换为以下格式:

000001 , 1st Line , 1st Customer name
000002 , 2nd Line , 2nd Customer name
000003 , 3rd Line , 3rd Customer name
  =               =        =
  =               =        =
  =               =        =
000087 , 87th Line, 87th Customer name
  =               =        =
  =               =        =
001327 , 1327th Line, 1327th Customer name
  =               =        =
  =               =        =
  =               =        =
我的问题是:是否有一种直接的方法可以使用正则表达式实现相同的输出

我尝试了以下方法:

Dim pattern As String = "(\d{6}) , (Line \d+ of text) , (customer \d name)" 
Dim replacement As String = " $1 , $2 Line , $3 Customer name " 
Dim rgx As New Regex(pattern)
Dim result As String = rgx.Replace(my_input_file, replacement)
但结果与预期的产出相去甚远


请帮助

您的正则表达式捕获的内容太多。组应仅捕获数字:

Dim pattern As String = "(\d{6}) , Line (\d+) of text , customer (\d+) name"
另外,当您想用序数替换数字时,应该使用
String.Format
进行格式化(逐行):


其中,
GetOrdinal
是一种将数字字符串更改为序号的方法。

您的匹配组太大了。你要匹配的是数字


替换
(\d{6})、文本行(\d+)和客户(\d+)名称

$1、$2行、$3客户名称


然后用
1st


然后将
2th
替换为
2nd


然后用第三个替换第三个


我不知道你是否打算匹配一个真正的顾客名字本身,并以另一个顺序替换它。。。是吗


然后可以使用(带有全局和多行标志)

^(\d{6}),文本的行(\d+)([^]+)(\d)([^]+)$

并替换为
$1,$2行,$4$3$5



提示:我总是用它来测试我的模式并进行实验

使用正则表达式有什么原因吗?也许我误解了这一要求,但这似乎是一种固定格式,其中只有第一部分很重要,因此您可以使用以下简单查询:

IEnumerable<string> lines = File.ReadLines(@"folder\input_text.txt");
IEnumerable<string> result = lines
.Where(l => l.Trim().Length > 0)
.Select(l => int.Parse(l.Split(',').First().Trim()))
.Select(num => string.Format("{0} , {1} Line , {1} Customer name"
    , num.ToString("D6")
    , num + (num == 1 ? "st" : num == 2 ? "nd" : "rd")));
IEnumerable<string> lines = File.ReadLines(@"folder\input_text.txt");
IEnumerable<string> result = lines
.Where(l => l.Trim().Length > 0)
.Select(l => int.Parse(l.Split(',').First().Trim()))
.Select(num => string.Format("{0} , {1} Line , {1} Customer name"
    , num.ToString("D6")
    , num + (num == 1 ? "st" : num == 2 ? "nd" : "rd")));
File.WriteAllLines(@"folder\desired_output.txt", result);