Regex 多行正则表达式替换

Regex 多行正则表达式替换,regex,replace,multiline,Regex,Replace,Multiline,好的,这里有很多正则表达式,但和往常一样,它们似乎都不符合我要做的 我有一个文本文件: F00220034277909272011 H001500020003000009272011 D001500031034970000400500020000000025000000515000000000 D0015000012617700080032000100000000250

好的,这里有很多正则表达式,但和往常一样,它们似乎都不符合我要做的

我有一个文本文件:

F00220034277909272011                                  
H001500020003000009272011                              
D001500031034970000400500020000000025000000515000000000
D001500001261770008003200010000000025000000132500000000
H004200020001014209272011                              
D004200005355800007702200005142000013420000000000000000
D004200031137360000779000005000000012000000000000000000
H050100180030263709272011                              
D050100001876700006000300019500000025000000250000001500
D050100001247060000071500030000000025000000280000000000
D050100002075670000430400020000000025000000515000000000
D050100008342500007702600005700000010000000000000000700
D050100009460270000702100015205000025000000000000006205
D050100008135120000702400015000000010000000000000001000
D050100006938430000702200026700000010000000000000001000
D050100006423710008000200025700000000000000000000001000
D050100009488040008000600007175000000000000000000001000
D050100001299190000800100016300000000000000000000003950
D050100001244850000800400005407000000000000000000001607
D050100001216280000840200020000000000000001000000006200
D050100001216840000479000008175000000000000100000001000
D050100001265880000410200014350000000000000100000001000
D050100007402650002000300026700000000000000100000001000
D050100001305150002000200016175000000000001000000000000
D050100005435430000899700022350000000000001000000000000
D050100031113850000500200008200000000250000100000001000
对于多行正则表达式(.NET-flavored),我想做一个替换,以便得到:

H050100180030263709272011                              
D050100001876700006000300019500000025000000250000001500
D050100001247060000071500030000000025000000280000000000
D050100002075670000430400020000000025000000515000000000
D050100008342500007702600005700000010000000000000000700
D050100009460270000702100015205000025000000000000006205
D050100008135120000702400015000000010000000000000001000
D050100006938430000702200026700000010000000000000001000
D050100006423710008000200025700000000000000000000001000
D050100009488040008000600007175000000000000000000001000
D050100001299190000800100016300000000000000000000003950
D050100001244850000800400005407000000000000000000001607
D050100001216280000840200020000000000000001000000006200
D050100001216840000479000008175000000000000100000001000
D050100001265880000410200014350000000000000100000001000
D050100007402650002000300026700000000000000100000001000
D050100001305150002000200016175000000000001000000000000
D050100005435430000899700022350000000000001000000000000
D050100031113850000500200008200000000250000100000001000
因此,基本上,我获取了所有以
[HD]0501
开头的内容,没有其他内容

我知道这似乎更适合替换的匹配,但我正在经历一个预构建的引擎,它只接受正则表达式模式字符串和正则表达式替换字符串

我可以为模式和替换字符串提供什么来获得我想要的结果?多行正则表达式是硬编码配置吗

我原本以为这样做会奏效:

搜索:
(?^[HD]0501\d+$)
,但这不匹配

搜索:
(?!^[HD]0501\d+$)
,但这匹配了一堆空字符串,我无法确定替换字符串的内容

搜索:
(?!(?^[HD]0501\d+$)
,未找到组“省略”


看起来这应该很简单,但和往常一样,正则表达式让我觉得自己很笨。非常感谢您的帮助。

尝试匹配以下模式:

(?m)^(?![HD]0501).+(\r?\n)?
并将其替换为空字符串

以下演示:

使用系统;
使用System.Text.RegularExpressions;
名称空间测试
{
类主类
{  
公共静态void Main(字符串[]args)
{
字符串输入=@“F00220034277909272011
H00150002000009272011
D00150003103497000400500020000200005000000515000000
D001500001261770008003003200100000002500000132500000000
H004200020001014209272011
D0042000005355800077020000514200001342000000000000000000
D0042000013113736000077000005000000120000000000000
H050100180030263709272011
D05010000187670000600030001950000002500000025000001500
D050100001247060000715000300000000205000000280000000000
D0501000020756700004304000200002000050000005150000000
D05010000834250000770260000570000100000000000700
D0501000094607000070210001520000205000000000000006205
D050100008135120000740001500000100000000000001000
D050100006938400007022000267000000100000000000001000
D050100006423701008000027000000000000000000001000
D050100009480400080006000071750000000000000000001000
D050100001299190000801000163000000000000000000000003950
D05010000124450000800400054070000000000000000001607
D05010000126280000084020000000000000000000000006200
D050100001268400004790000817500000000000010000001000
D05010000126588000410200014350000000000000100000001000
D0501000074026500020003000267000000000000010000
D050100001300515000200016175000000000010000000000000000
D050100005434300008997000223500000000000010000000000000000
D0501000311113850000005002000082000020250000100000001000”;
字符串正则表达式=@“(?m)^(?[HD]0501)。+(\r?\n)?”;
Console.WriteLine(Regex.Replace(输入,Regex,“”);
}
}
}
印刷品:

H050100180030263709272011
D05010000187670000600030001950000002500000025000001500
D050100001247060000715000300000000205000000280000000000
D0501000020756700004304000200002000050000005150000000
D05010000834250000770260000570000100000000000700
D0501000094607000070210001520000205000000000000006205
D050100008135120000740001500000100000000000001000
D050100006938400007022000267000000100000000000001000
D050100006423701008000027000000000000000000001000
D050100009480400080006000071750000000000000000001000
D050100001299190000801000163000000000000000000000003950
D05010000124450000800400054070000000000000000001607
D05010000126280000084020000000000000000000000006200
D050100001268400004790000817500000000000010000001000
D05010000126588000410200014350000000000000100000001000
D0501000074026500020003000267000000000000010000
D050100001300515000200016175000000000010000000000000000
D050100005434300008997000223500000000000010000000000000000
D0501000311113850000005002000082000020250000100000001000
快速解释:

  • (?m)
    • 启用多行模式,以便
      ^
      匹配新行的开头
  • ^
    • 匹配新行的开头
  • (?![HD]0501)
    • 向前看,看是否没有
      “H0501”
      “D0501”
  • +
    • 匹配除换行符以外的一个或多个字符
  • (\r?\n)?
    • 匹配可选的换行符

就是这样。谢谢我必须弄清楚它是怎么做到的,但这让我开始了。不客气@Jeremy,我还简单解释了这个模式。