Регулярное выражение соответствует больше, чем нужно - PullRequest
2 голосов
/ 20 января 2010

У меня возникли проблемы с попыткой разработать регулярное выражение, которое выберет все вызовы функций для "tr" из этого блока кода asp ниже. В частности, мне нужно получить строку в каждом вызове функции "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 ]

4 голосов
/ 20 января 2010

Похоже, ваш шаблон регулярных выражений жадный. Попробуйте сделать его нежадным, добавив ? после 2-го +: tr\(\"([^%]|%[0-9]+)+?\"\)

Упрощенная версия для захвата чего-либо внутри tr (...) будет выглядеть так: tr\(\"(.+?)\"\)

1 голос
/ 20 января 2010

тр \ ((\ "[^ \"] *) \ "\)

1 голос
/ 20 января 2010

Вам понадобится не жадный шаблон; просто добавьте ?, например:

tr\(\"([^%]|%[0-9]+)+?\"\)
//                   ^--- notice this
1 голос
/ 20 января 2010

Используйте знак вопроса после модификатора знака плюс, чтобы сделать его нежадным (соответствует только тому, что ему нужно).

Кроме того, может быть привязка к ") &", если это всегда следует за вызовом tr ().

0 голосов
/ 20 января 2010

Это должно сделать, используйте не жадный (?) После * или +:

    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();
    }

( Здесь есть хорошее регулярное выражение в шпаргалке C #)

0 голосов
/ 20 января 2010

Только не совпадать на знаке равенства для строки.

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

0 голосов
/ 20 января 2010

Я не уверен, что он идеален, но он правильно извлек все записи в вашем образце. При тестировании других выражений на этой странице я обнаружил, что возвращались некоторые ошибочные записи. Этот не возвращает плохих данных:

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 . Это очень полезный инструмент для проверки регулярных выражений в вашем браузере.

0 голосов
/ 20 января 2010

тр (\ "* \")

в регулярном выражении. = что угодно, * = любое число (включая 0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...