正则表达式没有返回我要求它选择的内容

问题描述 投票:0回答:1

我有一个如下所示的字符串:

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");
c# regex testcomplete
1个回答
0
投票

要替换两个其他字符串之间出现的字符串,常见的方法是捕获两个边界字符串,然后替换表达式将两个捕获的字符串放回中间,并在中间放置新的所需文本。

使用正则表达式

(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
)没有出现,但我怀疑代码中做了一些额外的事情。

© www.soinside.com 2019 - 2024. All rights reserved.