在字母数字正则表达式中有多个空格,多个逗号和多个超标

时间:2015-07-22 12:43:20

标签: regex

我是正则表达式和正则表达式的新手,我陷入了一种我想在JSF输入字段上应用正则表达式的情况。

哪里

  1. 字母数字
  2. 多个空格
  3. 多点(。)
  4. 多个连字符( - )
  5. 允许

    最低限额为1 最高限额为5

    对于多个值 - 它们必须用逗号(,)

    分隔

    所以单个值可以是:

      

    3KD-R

      

    K3

      

    -4

    多个值(必须以逗号分隔):

      

    kdk30,3.K-4,ER - U,2,.I3,

    借助stackoverflow,到目前为止我只能实现这个目标:

      

    (^ [a-zA-Z0-9] {5}(,[a-zA-Z0-9] {5})* $)

2 个答案:

答案 0 :(得分:1)

这样的东西
^[-.a-zA-Z0-9 ]{1,5}(,[-.a-zA-Z0-9 ]{1,5})*$

所做的更改

  • [-.a-zA-Z0-9 ]在字符类中添加了-.,以便匹配它们。

  • {1,5}量词,确保匹配最小1和最大5个字符

Regex demo

答案 1 :(得分:1)

你做得很好。您需要在第一个字符类中添加连字符和点。注意:使用连字符,因为它在一个字符类中委托范围,你需要将它放在上下文中,它不能指定一个范围 - 更不要说把它放在看起来像是无效范围的地方,例如{{ 1}},但位置不能是范围,即第一个或最后一个。所以你的第一个角色类看起来像这样:

7-.[a-zA-Z 0-9.-]{1,5}

因此,我们刚刚定义了一个细分的样子。该模式可以重复出现零次或多次。当然,有很多方法可以做到这一点,但我赞成一个正则表达式子程序,因为这允许代码重用。现在,如果规格发生变化或您正在测试并意识到您必须调整该段模式,则只需在一个地方中更改

BRE或ERE不支持子程序,但最广泛使用的现代正则表达式引擎支持它们(Perl,PCRE,Ruby,Delphi,R,PHP)。他们使用和理解非常简单。基本上,你只需要能够引用(听起来很熟悉?引用回来?返回引用?),这意味着我们需要捕获我们希望重复的正则表达式。然后它就像回头一样简单,但我们不想引用捕获的(数据)的[-a-zA-Z0-9 .]{1,5},而是将其称为{{1} },捕获表达式。在这样做的过程中,我们在逻辑上定义了一个子程序:

\1

因此,第一组基本上定义了我们的子程序,第二组由逗号后跟我们用于第一组的相同分段定义表达式组成,并且可选(&#39) ; *'是零或多量词。)

如果您在考虑效率的情况下操作大量数据,请不要在不必要时捕获。如果您使用括号的唯一目的是交替(例如,(?1))或量化,如在我们的第二组中,使用([a-zA-Z 0-9.-]{1,5})(,(?1))* 表示法,这表示正则表达式引擎这是非捕获组。没有详细说明,维护匹配位置会有很多开销 - 而不是它本身很复杂,只是潜在的高度重复。正则表达式引擎将匹配,存储信息,然后当匹配失败时,他们放弃"放弃"匹配并再次尝试从下一个匹配的子字符串开始。每当他们与您的捕获组匹配时,他们就会再次存储该信息。好的,我现在离开了肥皂盒。 : - )

所以,我们几乎就在那里。我说"几乎"因为我没有掌握所有信息。但如果这应该是"主题"的唯一占用者。 (行,字段等 - 您正在评估的数据样本),您应该将其锚定到"断言"那个要求。插入符号' ^'是主题的开始,美元' $'是主题的结束,所以通过将我们的表达式封装在\b[bB](asset|eagle)\b hound中,我们断言主题在其中完全匹配,从前到后。这些断言的长度为零;他们不消耗任何数据,只断言相对位置。您可以对它们进行操作,例如,(?: ... )会将整个文档缩进两个空格。你还没有用两个空格替换行的开头,但是你可以在那个假想的零长度位置上操作。 (做一些关于零长度断言[又称零宽度断言或环视]的研究,以揭示现代正则表达式的强大功能。例如,在之前的正则表达式中,如果我想确保我没有插入两个空格空行:^ ... $

另外,你没有说你是否需要捕捉结果来做些什么。我的印象只是它的验证,所以没有必要。但是,如果需要,可以将整个表达式包装在捕获括号中:s/^/ /

我将提供假设您需要捕获的最终解决方案,但确实假设整个主题应包含此值:

s/^(?!$)/  /

我知道我继续了一下,但你说你是regex的新手,所以想提供一些细节。我希望它不是太详细。

顺便说一句,一个优秀的教程资源是正则表达式点信息,一个很棒的正则表达式开发和测试工具是regex101 dot com。我永远不能说堆栈溢出!