【问题标题】:How to write regex to verify a comma delimited list of values如何编写正则表达式来验证逗号分隔的值列表
【发布时间】:2013-09-11 15:42:02
【问题描述】:

我正在使用 SobiPro,它是 joomla 的目录系统,并且我有一个字段,其值仅包含字母数字和连字符,因此该文本字段中可能包含的示例如下:

玩具风筝、塑料轮子、单向小玩意、金属线轴、3M 扎带

此正则表达式将在保存字段之前验证他们在表单上输入的内容。

我是这样想的:(\w+)(,\s*\w+)*

但显然我是不对的,它不考虑连字符..任何帮助!谢谢!

【问题讨论】:

  • 字段可以留空吗?是否允许使用非 ASCII 字母/数字?是否允许使用下划线?
  • 抱歉,如果他们没有想要包含的任何内容,可以将字段留空
  • 感谢所有快速回复。我将尝试所有这些,然后在今天下午完成后奖励正确的一个!问候

标签: regex validation sobipro


【解决方案1】:

试试这个:

^[-\w\s]+(?:,[-\w\s]*)*$

使用^ 和$ 可确保我们验证整个值,而不仅仅是在其中某处找到匹配项。

第一个字符类[-\w\s]+ 允许一个或多个字母数字、空格或破折号字符。 破折号应该放在类括号的第一位。

第二组允许零次或多次重复,用逗号分隔。它被包裹在非捕获括号中,一个小的性能优化:(?: … )*

注意事项:

  • 此表达式允许空条目,例如A,B,,D。如果您不想这样做,请将倒数第二个 * 更改为 +。
  • \w 简写允许使用下划线。为防止出现这种情况,请将它们替换为 A-Za-z0-9。

【讨论】:

    【解决方案2】:

    试试这个:

    [-\w\s]+(,[-\w\s]+)*
    

    [-\w\s] 表示单词字符、空格或连字符。

    单词字符通常包含_,因此如果您想防止这种情况,您可能需要将其替换为A-Za-z0-9。

    [-A-Za-z0-9\s]+(,[-A-Za-z0-9\s]+)*
    

    【讨论】:

    • 这将匹配无效输入,例如!@#$%^&*()0,
    • @Jay 根据您的回答,您似乎认为 search 已完成,而不是 match。我假设是后者。您的两者都适用,但对于match 会有多余的字符。我意识到有些语言可能只支持其中一种,我不知道 SobiPro 使用什么,所以它确实可能是search,尽管我的(可能不正确的)假设,基于这个问题,正则表达式正在工作,除了-,因此它使用/支持match,因为正则表达式不包含^ 或$。
    • OP 确实表明表达式的目的是输入验证。在这种用法中,只有当输入完全有效时才会发生匹配。
    • @Jay 我想你可能误解了我的评论,或者我误解了你的第二个评论。详细说明 - 例如,Java 有一个 matches 函数,可以将整个字符串与正则表达式进行比较。如果使用这样的函数,则不需要^ 和$。 Java还有一个find函数,需要^和$。
    • 感谢您的澄清,杜克林。我从未听说过有一种语言能做出这种区分。
    【解决方案3】:

    使用字符类。

    ^([0-9A-Za-z -]+)(,[0-9A-Za-z -]+)*$
    

    请注意,\w 包含下划线,这就是我将其扩展到字母数字范围的原因。

    感谢@Jay 指出丢失的锚点。

    【讨论】:

    • @Jay - 如果我是你,我会评论说,“也是有效的答案,但不要忘记你可能想要锚定你的正则表达式!”恕我直言,这比用一个似乎旨在诋毁而不是阐明的反例进行简洁评论更具建设性。
    • 抱歉,acheong87。我的经验是,一条评论得到更新,然后我删除了这条评论。
    • @AndrewCheong 如果我们想包含所有的特殊字符,我们要手动添加吗
    • @Akhilesh - 您可以手动添加它们,有些必须用反斜杠转义。 (为了安全起见,您可以使用反斜杠将它们全部转义。)您也可以使用[^\w\s],这意味着“不是字母、数字或空白字符”,但我不确定它是否会捕获太多其他符号。
    • @AndrewCheong 好的。假设我们有这个^[\w:=]+(?:,[\w:=]+)*$,但它只匹配特殊字符的:=。那么,为什么我们不能这样做^[.*?]+(?:,[.*?]+)*$(我们可以允许一切,而不是手动添加特殊字符)。
    【解决方案4】:

    您可以为此使用character class:

    [\w\s-]+(,[\w\s-]*)*
    

    为了允许空字段,我已将组内的字符类设为可选。

    如果您的验证器不强制正则表达式始终匹配整个输入字段,您可能需要通过在开头用^ 和在结尾用$ 包围它来将其包围起来以anchor。

    【讨论】:

    • @Jay:取决于验证规则的应用方式。一些规则会自动锚定到字符串的开头和结尾。但我必须承认我不知道 SobiPro 是如何做到的。
    猜你喜欢
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多