【问题标题】:Multiple RegEx pattern in Classic ASP经典 ASP 中的多个 RegEx 模式
【发布时间】:2021-10-11 22:04:55
【问题描述】:

我在经典 ASP 中使用 Regex 进行验证。我想验证两个不同的值,并检查是否只有两个模式中提到的列出的字符和符号用于该值,并且我尝试使用两个不同的 Regex 对象。但这对我不起作用

这是我的代码

Set re = New RegExp
With re
  .Pattern = "[a-zA-Z0-9\&_+()/-]"
  .Global = True
  .IgnoreCase = True
End With 

Set reNew  = New RegExp
With reNew
  .Pattern = "[a-zA-Z0-9.!\"£$%^&()_+-=[]{}#:@./<>?\\|]"
  .Global = True
  .IgnoreCase = True
End With 

  if re.Test(strComments) = false   then
                    response.write " <label>Upload failed !! Please enter comments using valid characters a-z A-Z 0-9 \._+()%/&-</label>"
                    response.end  
                    else             
                          if reNew.Test(strremark) = false  then
                          response.write "<label> Upload failed !! Please enter remark using valid characters a-z A-Z 0-9 \._+()%/&-</label>"
                          response.end 
                          end if
  end if

谁能帮我理解我哪里出错了?

【问题讨论】:

  • 第二个模式有+-=,它表示一个范围。您可以将- 移动到字符类的末尾,并转义字符类中的方括号[a-zA-Z0-9.!\"£$%^&amp;()_+=[\]{}#:@./&lt;&gt;?\\|-]
  • 也许可以试试这个:[a-zA-Z0-9\&amp;_+()\/-]|[a-zA-Z0-9.!""£$%^&amp;()_+-=[\]{}#:@.\/&lt;&gt;?\\|]。您留下了一些未转义的正斜杠。您的第二个正则表达式中还有一个单引号,尽管您已在表达式中转义,但仍会引发 VBscript 语法错误。 |OR 的正则表达式等价物,因此您可以将两者结合在一起。如果您先使用regex101 之类的网站来测试和分析您的表达方式,这也会有所帮助。我不擅长正则表达式,但你当然可以将这两个表达式整合为一个,而不是使用|
  • 只是说“但这对我不起作用”对我们没有帮助,什么不起作用?,是否有错误,如果有,是什么?具有描述性。另一点是为什么你需要两个正则表达式模式,它们不能结合起来吗?
  • @user692942 我会记住这一点,谢谢....我使用了两种正则表达式模式,因为我想做两组单独的验证。
  • 在这种情况下,每次测试后只调整模式而不是创建多个正则表达式实例可能会更干净。

标签: regex asp-classic


【解决方案1】:

使用以下代码修复:

Set re = New RegExp
With re
  .Pattern = "^[a-zA-Z0-9&_+()/-]+$"
End With 

Set reNew  = New RegExp
With reNew
  .Pattern = "^[a-zA-Z0-9.!""£$%^&()_+=[\]{}#:@./<>?\\|-]+$"
End With 

双引号必须加倍,连字符必须用作括号内的最后一个字符,并且右括号也必须转义。

\&amp; 有一个不必要的反斜杠,我删除了。

锚点用于匹配整个字符串,+ 确保匹配一个或多个允许的字符。

不要设置.Global = True.IgnoreCase = True,因为两者都可以是False,所以这些是冗余代码。

【讨论】:

  • 非常感谢.....但是.... [a-zA-Z0-9\&_+()\/-]|[a-zA-Z0-9.!" "£$%^&()_+-=[]{}#:@.\/?\\|] 在第二种模式中使用它对我有用
  • @TJ32 [] 过早关闭第二个表达式。表达式包含在方括号中,因此如果您在表达式中包含右方括号,它将结束它。您需要转义右方括号:[\],就像 SQL 注入一样,反斜杠告诉表达式“是的,这是一个结束标记,但它是表达式的一部分,而不是表达式语法”。同样,我建议在对代码进行任何更改之前使用regex101.com
  • @TJ32 我只是修正了你的表达方式,我没有尝试将它们合并为一个。合并后的是"^(?:[a-zA-Z0-9&amp;_+()/-]+|[a-zA-Z0-9.!""£$%^&amp;()_+=[\]{}#:@./&lt;&gt;?\\|-]+)$"
【解决方案2】:

不需要多个RegExp对象实例,唯一改变的是模式,它只是一个字符串,所以将字符串存储在一个变量中并替换每个Test()之前的模式。

Dim stringToTest: stringToTest = "..." 'Your test string
Dim validationPattern1: validationPattern1 = "..."
Dim validationPattern2: validationPattern2 = "..."
Dim re: Set re = New RegExp
'Set regex properties
With re
    .Gloabl = True
    .IgnoreCase = True
End With
'Before testing add the pattern
re.Pattern = validationPattern1
If Not re.Test(stringtoTest) Then
    'Validation1 failure logic here
    '...
End If
'Add the next pattern
re.Pattern = validationPattern2
If Not re.Test(stringtoTest) Then
    'Validation2 failure logic here
    '...
End If

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多