正则表达式匹配超过我需要它

时间:2010-01-20 15:38:54

标签: regex asp-classic

我在尝试开发一个正则表达式时会遇到一些麻烦,该正则表达式将从下面的asp代码块中挑选出对“tr”的所有函数调用。具体来说,我需要在每个“tr”函数调用中获取字符串。

    if(RS.Fields("Audid").Value <> 0 ) Then
        Response.Write ("<td>" & tr("RA Assigned") & "</td>")
    else
        Response.Write ("<td>" & tr("Not Yet Assigned") & "</td>")
    End if

    if(RS.Fields("rStatus").Value = "Activated") then
        Response.Write("<td><A HRef='portal_setup_billingII.asp?OrderPId=" & RS.Fields("CustomerParid").Value & "&OrderId=" & RS.Fields("OrderId").Value & "'>" & tr("Edit") &"</A></td></TR>")
    Else
        If (gParLevelz_Admin = gParLevelz and RS.Fields("CustomerParid").Value <> 0) Then 
            Response.Write("<td><A HRef='portal_setup_billingII.asp?OrderPId=" & RS.Fields("CustomerParid").Value & "&OrderId=" & RS.Fields("OrderId").Value & "'>" & tr("Awaiting Authorization") & "</A></td></TR>")
        else                                       
            Response.Write("<td>" & tr("Awaiting Authorization") & "</td></TR>")
        End if
    End if

我相信我已经做好了第一次尝试。以下表达式提取了我将遇到的大多数情况的值...

tr\(\"([^%]|%[0-9]+)+\"\)

导致我最困惑和压力的是如何捕获出现在“tr”函数中的所有字符串。字面上任何东西都可以在“tr”调用的引号之间,不幸的是我的表达式返回的值超过了最后一个引号。因此,鉴于上面我发布的一个匹配片段是......

tr("RA Assigned %2") & "</td>")
            else
                Response.Write ("<td>" & tr("Not Yet Assigned %4") & "</td>")
            End if

            if(RS.Fields("rStatus").Value = "Activated") then
                Response.Write("<td><A HRef='portal_setup_billingII.asp?OrderPId=" & RS.Fields("CustomerParid").Value & "&OrderId=" & RS.Fields("OrderId").Value & "'>" & tr("Edit") &"</A></td></TR>")
            Else
                If (gParLevelz_Admin = gParLevelz and RS.Fields("CustomerParid").Value <> 0) Then 
                    Response.Write("<td><A HRef='portal_setup_billingII.asp?OrderPId=" & RS.Fields("CustomerParid").Value & "&OrderId=" & RS.Fields("OrderId").Value & "'>" & tr("Awaiting Authorization") & "</A></td></TR>")
                else                                       
                    Response.Write("<td>" & tr("Awaiting Authorization") & "</td></TR>")

这比我想要的更多。我只想要tr("RA Assigned %2")返回。

8 个答案:

答案 0 :(得分:4)

看起来你的正则表达式是贪婪的。在第二个?之后添加+,尝试使其变得非贪婪:tr\(\"([^%]|%[0-9]+)+?\"\)

用于捕获tr(...)内部任何内容的简化版本为:tr\(\"(.+?)\"\)

答案 1 :(得分:1)

在加号修饰符后面使用问号使其变得非贪婪(只能根据需要进行匹配)。

此外,也许可以锚定“)&amp;”如果它始终跟随对tr()的调用。

答案 2 :(得分:1)

你需要一个非贪婪的模式;只需添加?,例如:

tr\(\"([^%]|%[0-9]+)+?\"\)
//                   ^--- notice this

答案 3 :(得分:1)

TR \((\ “[^ \”] *)\“\)

答案 4 :(得分:0)

TR(\ “* \”)

在正则表达式中,。 =任何东西,* =任何数字(包括0)

答案 5 :(得分:0)

我不确定它是否完美,但它正确检索了样本中的所有条目。在测试此页面上的其他表达式时,我发现正在返回一些错误的条目。这个不会返回任何不良数据:

tr\("([\W\w\s]+?)"\)

返回的结果将包含整个函数调用,以及函数中的字符串。我用以下输入测试了它:

Response.Write ("<td>" & tr("RA Assigned") & "</td>")
Response.Write ("<td>" & tr("Not Yet Assigned") & "</td>")
Response.Write("<td><A HRef='portal_setup_billingII.asp?OrderPId=" & RS.Fields("CustomerParid").Value & "&OrderId=" & RS.Fields("OrderId").Value & "'>" & tr("Edit") &"</A></td></TR>")
Response.Write("<td><A HRef='portal_setup_billingII.asp?OrderPId=" & RS.Fields("CustomerParid").Value & "&OrderId=" & RS.Fields("OrderId").Value & "'>" & tr("Awaiting Authorization") & "</A></td></TR>")                              
Response.Write("<td>" & tr("Awaiting Authorization") & "</td></TR>")
Response.Write ("<td>" & tr("RA Ass14151igned") & "</td>")
Response.Write ("<td>" & tr("RA %Ass_!igned") & "</td>")

并收到以下输出:

$matches Array:
(
    [0] => Array
        (
            [0] => tr("RA Assigned")
            [1] => tr("Not Yet Assigned")
            [2] => tr("Edit")
            [3] => tr("Awaiting Authorization")
            [4] => tr("Awaiting Authorization")
            [5] => tr("RA Ass14151igned")
            [6] => tr("RA %Ass_!igned")
        )

    [1] => Array
        (
            [0] => RA Assigned
            [1] => Not Yet Assigned
            [2] => Edit
            [3] => Awaiting Authorization
            [4] => Awaiting Authorization
            [5] => RA Ass14151igned
            [6] => RA %Ass_!igned
        )

)

在相关说明中,请查看My Regex Tester。它是一个非常有用的工具,用于在浏览器中测试正则表达式。

答案 6 :(得分:0)

只是不匹配字符串的等号。

tr\(\"([^\"]+)\"\)

答案 7 :(得分:0)

这应该这样做,在*或+:

之后使用非贪婪的(?)
    const string pattern = "tr\\(\".*?\"\\)";
    const string text = "tr(\"RA Assigned %2\") & \"</td>\")";
    Regex r = new Regex(pattern, RegexOptions.Compiled);
    Match m = r.Match(text);
    while (m.Success)
    {
        foreach (Capture c in m.Captures)
        {
            Console.WriteLine(c.Value);
        }
        m = m.NextMatch();
    }

Here在C#备忘单中有一个很好的正则表达式)

相关问题