我在尝试开发一个正则表达式时会遇到一些麻烦,该正则表达式将从下面的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")
返回。
答案 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#备忘单中有一个很好的正则表达式)