我是正则表达式和正则表达式的新手,我陷入了一种我想在JSF输入字段上应用正则表达式的情况。
哪里
,最低限额为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})* $)
答案 0 :(得分:1)
像
这样的东西^[-.a-zA-Z0-9 ]{1,5}(,[-.a-zA-Z0-9 ]{1,5})*$
所做的更改
[-.a-zA-Z0-9 ]
在字符类中添加了-
和.
,以便匹配它们。
{1,5}
量词,确保匹配最小1
和最大5
个字符
答案 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。我永远不能说堆栈溢出!