【问题标题】:Making a conditional regular expression制作条件正则表达式
【发布时间】:2012-01-31 17:36:40
【问题描述】:

我在制作这个正则表达式时遇到了一些麻烦:

如果输入包含此符号 "<" 后跟一个字母,我只是希望正则表达式测试失败,例如:<[^a-zA-Z]

但即使没有找到"<",我也希望它能够工作。我该怎么做?

编辑:一些例子

<Wrong example
Wrong <Example

Good Example
< Good Example
Good < Example
Good< Example
Good Example<

编辑 2: 使用 asp.net 时,您不能在输入中发送包含此文本的表单,例如:

<Previous

编辑 3: 此正则表达式将在我无法更改的控件中传递,它通过使用正则表达式验证输入来工作。因此我无法匹配错误的输入

【问题讨论】:

  • 举个例子。有些有效,有些无效。
  • “工作”是什么意思? “即使找不到 &lt;1 也可以工作”是什么意思?如果源字符串包含由小于号 (&lt;) 后跟除大写或小写字母 A-Z 之外的任何单个字符组成的两个字符序列,则您提供的正则表达式将匹配(成功)。如果源字符串不包含该序列,它将不匹配(失败)。你到底想完成什么?
  • 假设我在表单上有一个 html 输入,我不希望用户在字符后面写小于号,因为这会导致错误。应用服务器会崩溃,因为它会认为这可能是一种破坏安全性的尝试,例如脚本攻击
  • @GianT971:正如您所知,这个问题的“正确答案”不是使用正则表达式,而是 HTML 转义您可能在页面上显示的任何内容(因为它存储在数据库或每次显示时)。
  • 我希望我能多次支持@Platinum Azure 的评论。

标签: c# asp.net .net regex


【解决方案1】:

一个消极的前瞻性正则表达式自己喜欢

^(?!.*<[a-zA-Z])

会检查一个字母从不跟在左尖括号后面,但一个空字符串会符合您的条件。您是否还需要确保它至少包含一个 alpha,像这样?

^(?!.*<[a-zA-Z]).*[a-zA-Z]

在 Perl 中:

while (<DATA>) {
  print if  /^(?!.*<[a-zA-Z])/;
}

__DATA__
<Wrong example
Wrong <Example
Good Example
< Good Example
Good < Example
Good< Example
Good Example<

输出

Good Example
< Good Example
Good < Example
Good< Example
Good Example<

【讨论】:

  • 太好了,我会好好研究一下正则表达式的这个能力,谢谢
【解决方案2】:

匹配错误输入并将其列入黑名单可能比匹配良好输入并将其列入白名单更简单。

拒绝与以下正则表达式匹配的任何输入:

<[a-zA-Z]

如果您真的需要白名单解决方案(因为您不控制实际的验证逻辑,只控制正则表达式),您可以这样做:

^(?:[^<]|<[^a-zA-Z]|<$)*$

(如果您还想确保输入不为空,可以将最后一个 Kleene 星号更改为加号。)

【讨论】:

    【解决方案3】:

    您可以使用[a-zA-Z]*(&lt;[^a-zA-Z])?[a-zA-Z]*

    【讨论】:

    • 谢谢,但实际上我的正则表达式必须和我说的完全一样,因为我将它传递给了一个不是我编写的程序
    • 如果有一个
    • 它将用于验证输入,我想接受除了
    • @GianT971 - 您的正则表达式不会匹配您希望它匹配的内容,唯一的方法是尝试将其与正确的正则表达式匹配
    • @Ramhound 那么正则表达式的“If Conditional”呢?我在网上看到的,但我暂时不明白。例如:omegacoder.com/?p=56
    【解决方案4】:

    编辑:也许不是最理想的模式,但它与您的“好”示例匹配并且与您的“错误”示例不匹配:

    ^((^|(<[^a-zA-Z]|[^<a-zA-Z])+)[a-zA-Z]+)+(<[^a-zA-Z]*|[^<a-zA-Z]*)$
    

    我想你想用括号后跟一个?表示该模式出现 0 次或 1 次:

    (<[^a-zA-Z])?
    

    我假设您正在构建一个更大的正则表达式模式,并且只是其中的一部分。

    【讨论】:

    • 我不是在构建大型正则表达式,这是我要检查的唯一条件
    • 这行不通,因为它会触发大量的误报和漏报。它将检查零个或一个有效案例(&lt; 后跟 nonalpha),因此如果有两个有效案例,这将导致假阴性,如果有一个有效案例但也有一个无效案例(&lt; 后跟通过 alpha) 这将导致误报。
    • 只是出于好奇,您能否看看我的替代正则表达式,如果我碰巧错过了标记,请告诉我?我试图让它“简单”,但我完全可以想象我把它搞砸了。
    • @PlatinumAzure - 我自己很好奇并试了一下。 According to my code,它只漏掉了“Good Example
    • 哦,好点,我确实错过了那里的标记。我会编辑我的帖子。
    猜你喜欢
    • 2011-10-30
    • 2022-07-06
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多