【问题标题】:VBSscript regex replace text between curlyVBScript 正则表达式替换卷曲之间的文本
【发布时间】:2012-08-11 02:34:33
【问题描述】:

我在这里查看了多个示例,它们都部分有效,但不是全部一起工作。

我正在尝试创建一个正则表达式来替换基于变量的字符串中的文本。我让替换工作,但仅在第一次搜索时。等等。

目标是替换: 文本:{1} 来自用户 1 的文本。
{2} 来自用户 2 的文本。
{1} 来自用户 1 的文本。
- 如果是 QueryString。我需要替换 {} 之间的文本。

如果 QueryString = a user # 例如 1 则显示名称,否则显示“用户无”:

响应:文本:NAME1 来自用户 1 的文本。
用户无文本来自用户 2。
NAME1 来自用户 1 的文本。
- 如果是 QueryString。

-----------------------------------


好的 - 我终于拿到了文件:

<%
Dim StrX, CallMe, varID, varFirmID, varBKID
CallMe = "0"
CallMe = Request.QueryString("x")
StrX = "Memo Tracking:<br />"
StrX =  StrX & "{1} Test Text 1<br/ >{2} Test Text 2<br/ >{1} Test Text 1<br/ >{2} Test   Text 2<br/ >" 'Data - will replace with Recordset Data later - eventually I will also add   [] for two sets
varFirmID = "0"
varBKID = "0"

Set re = new RegExp 
re.IgnoreCase = true
re.Global = true
re.Pattern = "\{(.*)\}" 'find {} part
set matches = re.Execute(StrX) 

'finds Matches of Firms --------------------------------
If matches.Count > 0 Then
For Each Match in Matches 
varFirmID = matches.item(0).submatches(0)
    If Callme = varFirmID Then
        StrX =(Replace(StrX,matches.item(0).submatches(0),"Replaced Name:"))
            End If
            If Callme <> varFirmID Then
        StrX =(Replace(StrX,matches.item(0).submatches(0),"NO NAME:"))
    End If
Response.Write Strx
'End loop if Match --------------------------------
Next
End If
%>

我不断得到部分结果。我觉得我需要在 for 代码之后添加一个“do while 循环”。

目标是... querystring(x)=1 结果:

备忘录追踪:
替换名称 1:测试文本 1
无名称:测试文本 2
替换名称 1:测试文本 1
NO NAME:测试文本 2

目标是... querystring(x)=2 结果:

备忘录追踪:
无名称:测试文本 1
替换名称 2:测试文本 2
无名称:测试文本 1
替换名称 2:测试文本 2

(我将使用 varFirmID 作为键在循环中运行记录集 - 所以我可能需要建议在哪里插入它。) 非常感谢您的帮助!

【问题讨论】:

    标签: regex asp-classic vbscript


    【解决方案1】:

    乍一看,我在您的模式中发现了一个错误:您使用正斜杠类型的“模式开始”,就像在 Javascript/Java 中可以做的那样,但在 VBScript 中却不行

    re.Pattern = "/{(.*)}/"
    

    应该是:

    re.Pattern = "{(.*)}"    ' note: is not going to work for you either, read below
    

    但是,大括号也是特殊字符(前序列的重复计数),所以你必须转义它们:

    re.Pattern = "\{(.*)\}" 
    

    我在您的代码中发现的另一个错误:

    if matches > o then
    

    您应该将o 替换为0,并将matches 替换为matches.count

    if matches.count > 0 then
    

    好的,现在我们正在取得进展。该代码正在运行,但返回1} Text from user 1.&lt;br/&gt;{2} Text from user 2.&lt;br/&gt;{1 而不仅仅是第一个数字,因为正则表达式是matching greedy。正则表达式很有趣,因为您可以为同一个问题创建不同的解决方案。我选择仅从字符串中获取数字部分,但您也可以找出其他解决方案:

    re.Pattern = "\{(\d+)\}"
    

    \d 后面的加号 (+) 表示您想要一个数字 1 到无限次,因此即使您的数字超过 9 也可以。

    我希望我能把它弄清楚。我确实注意到这不会解决您的问题,因为您想在某些条件匹配时替换它。固定模式将对您有所帮助,也许如果您可以进一步澄清您的问题并提供一个包含准确输入/输出的示例,我们可以进一步帮助您。

    【讨论】:

    • 感谢您的快速回复!我非常感谢您的帮助。我终于添加了更新的代码。如果您有机会偷看它,我将不胜感激。
    • @OliverFleener 更新代码上的正则表达式看起来更好,但它仍然与我的回答中解释的贪婪匹配。您需要将 .* 替换为 \d 以匹配单个数字而不是整个混乱的字符串,直到最后一个 }
    • @OliverFleener 哦,这个是流氓:varFirmID = matches.item(0).submatches(0)。您可以执行for each match in matches,然后使用foo = match.submatches(0)(和子匹配(1)等)逐一进行匹配,或者您可以使用for i = 0 to matches.count 并使用foo = matches.item(i).submatches(0) 获取此匹配项。现在你正在混合它们,这会给你一个错误的结果。
    • AC- 感谢您的快速回复。我尝试了这两个建议以及每个建议的 100 种变体,但显然谦虚地承认我不擅长这个。我无法让这个东西循环通过,计数等。我切换了模式字符串,但它也吞噬了一些文本...... [链接]clwwest.com/csg/1test.asp你可以看到我在这个额外的细节上很臭对我来说将是巨大的。提前致谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 2020-08-02
    • 2014-03-11
    相关资源
    最近更新 更多