代码之家  ›  专栏  ›  技术社区  ›  Antony

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

  •  0
  • Antony  · 技术社区  · 14 年前

    我在以下功能上拔头发:

    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.4”。相反,“2.3”正在被取代 最后的 线路。好像我没有指定多行模式。此外,以下 online tool 返回了正确的匹配项。所以,任何人谁能看到我的正则表达式或代码中的错误,请指出它。

    3 回复  |  直到 11 年前
        1
  •  2
  •   Ahmad Mageed    14 年前

    通过指定 $ 您实际上是在匹配字符串末尾的最后一个匹配项。如果要匹配第一个匹配项,请删除 $ 或者指定需要换行符:

    "^(?<pre>.+)(\|\d\.\d{1,2})"
    

    "^(?<pre>.+)(\|\d\.\d{1,2})[\r\n]"
    

    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。

        2
  •  2
  •   JonWillis    14 年前

    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();
            }
        }
    }
    
        3
  •  0
  •   Andrew Rueckert    14 年前

    你可以用“?”使“+”变得懒惰而不是贪婪。它将抓取尽可能少的字符,同时仍然满足正则表达式。

    Dim rgx = New Regex("^(?<pre>.+?)(\|\d\.\d{1,2})$", RegexOptions.Multiline)
    

    如果您知道版本号前面的文本将不包含任何管道,您还可以替换。使用[^\|]字符类。

    Dim rgx = New Regex("^(?<pre>[^\|]+)(\|\d\.\d{1,2})$", RegexOptions.Multiline)