我有一个如下所示的字符串:
MSH|^~\&|dgdgd|MSH6TOMSH4|Instrument|MSH4toMSH6|20230921104820+01:00||RSP^K11^RSP_K11|QPC0amoCwk+2uSHidYKB+Q|P|2.5.1||||||UNICODE UTF-8|||LAB-27R^
MSA|AA|1234
我想使用正则表达式来替换
K11|
和 |P
之间的所有内容。这些变化之间的字符串。
我认为这很简单,但我无法让它发挥作用。
我已经尝试过
var regEx5 = /K11\|\w*\|P/g
然后使用该字符串替换文本。不过,正则表达式正在恢复 QPC0amoCHidY
。我不明白它为什么这样做。是因为字符串中包含+
符号吗?我很茫然。
还尝试过
/K11\|[^|]*\|P/g
和/K11\|(.*?)\|P/g
,但没有任何喜悦
执行正则表达式和替换的代码:
var regEx5 = /K11\|([^|]+)\|P/g
newText1 = newText1["replace"](regEx5, "K11|<IGNORE>|P");
要替换两个其他字符串之间出现的字符串,常见的方法是捕获两个边界字符串,然后替换表达式将两个捕获的字符串放回中间,并在中间放置新的所需文本。
使用正则表达式
(K11\|).*(\|P)
捕获第 1 组和第 2 组中的 K11|
和 |P
。它们之间的文本与 .*
匹配,但未捕获。
问题不清楚替换应该是什么,所以我们假设它是
NewText
。
替换表达式应为
\1NewText\2
或 $1NewText$2
,具体取决于所使用的确切 RegEx 版本。
执行更改的 C# 代码可能如下。请注意,将字符串中的反斜杠字符放入 C# 字符串时需要加倍。
string source = "MSH|^~\\&|dgdgd|MSH6TOMSH4|Instrument|MSH4toMSH6|20230921104820+01:00||RSP^K11^RSP_K11|QPC0amoCwk+2uSHidYKB+Q|P|2.5.1||||||UNICODE UTF-8|||LAB-27R^";
string regex = "(K11\\|).*(\\|P)";
string replace = "$1NewText$2";
string output = Regex.Replace(source, regex, replace);
Console.WriteLine($"Was: '{source}'");
Console.WriteLine($"Now: '{output}'");
此代码的输出是:
Was: 'MSH|^~\&|dgdgd|MSH6TOMSH4|Instrument|MSH4toMSH6|20230921104820+01:00||RSP^K11^RSP_K11|QPC0amoCwk+2uSHidYKB+Q|P|2.5.1||||||UNICODE UTF-8|||LAB-27R^'
Now: 'MSH|^~\&|dgdgd|MSH6TOMSH4|Instrument|MSH4toMSH6|20230921104820+01:00||RSP^K11^RSP_K11|NewText|P|2.5.1||||||UNICODE UTF-8|||LAB-27R^'
对该问题的评论指出
仍然回归K11\|(.*)\|P
QPC0amoCHidY
其中文本
QPC0amoCHidY
是 K11|
和 |P
之间的字符串的一部分。在此 ReGex 中,捕获的文本是应替换的文本,原始 K11|
和 |P
因此被 lost。我不知道为什么两个字符串之间的其余文本(即 +2uSHidYKB+Q
)没有出现,但我怀疑代码中做了一些额外的事情。