正则表达式未按预期工作。更换

时间:2010-09-02 18:26:17

标签: .net vb.net regex

我将头发拉出以下功能:

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返回了正确的匹配项。所以,任何能够在我的正则表达式或代码中看到错误的人都请指出。

3 个答案:

答案 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)

艾哈迈德·马吉德打败了我。删除$是必需的。在下面的代码中,打印出3行,其中2.1是第一个匹配。

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)