我将头发拉出以下功能:
Public Function SetVersion(ByVal hl7Message As String, ByVal newVersion As String) As String
Dim rgx = New Regex("^(?<pre>.+)(\|\d\.\d{1,2})$", RegexOptions.Multiline)
Dim m = rgx.Match(hl7Message)
Return rgx.Replace(hl7Message, "${pre}|" & newVersion, 1, 0)
End Function
为简单起见,我正在测试以下输入:
dsfdsaf|2.1
wretdfg|2.2
sdafasd3|2.3
我需要完成的是将第一个行中的“| 2.1”替换为另一个值,例如“| 2.4”。发生的事情是“| 2.3”在 last 行中被替换。好像我没有指定多线模式。此外,以下online tool返回了正确的匹配项。所以,任何能够在我的正则表达式或代码中看到错误的人都请指出。
答案 0 :(得分:2)
通过指定$
,您基本上匹配字符串末尾的最后一个匹配项。如果要匹配第一个匹配项,请删除$
或指定需要换行符:
"^(?<pre>.+)(\|\d\.\d{1,2})"
或
"^(?<pre>.+)(\|\d\.\d{1,2})[\r\n]"
根据您对使用Multiline和测试数据外观的评论,我想您的输入是多行的。使用上述模式并尝试:
Dim input As String = "dsfdsaf|2.1" & Environment.NewLine & _
"wretdfg|2.2" & Environment.NewLine & _
"sdafasd3|2.3"
Console.WriteLine("Before:")
Console.WriteLine(input)
Console.WriteLine("After:")
Console.WriteLine(SetVersion(input, "2.4"))
2.1应更改为2.4。
答案 1 :(得分:2)
class Program
{
static void Main(string[] args)
{
string myData = "dsfdsaf|2.1" + Environment.NewLine +
"wretdfg|2.2" + Environment.NewLine +
"sdafasd3|2.3";
Regex rex = new Regex(@"^(?<pre>.+)(\|\d\.\d{1,2})",RegexOptions.Multiline);
var m = rex.Matches(myData);
foreach (var match in m)
{
string hello = match.ToString();
}
}
}
答案 2 :(得分:0)
你可以用'?'使'+'懒惰而不是贪婪。它会抓住尽可能少的字符,同时仍然可以完成正则表达式。
Dim rgx = New Regex("^(?<pre>.+?)(\|\d\.\d{1,2})$", RegexOptions.Multiline)
如果您知道版本号之前的文本不包含任何管道,您也可以替换。使用[^ \ |]字符类。
Dim rgx = New Regex("^(?<pre>[^\|]+)(\|\d\.\d{1,2})$", RegexOptions.Multiline)