正则表达式匹配部分或全部字符串

问题描述:

我基于变量的结果即时创建正则表达式。我已经成功地测试了大部分表达式,但是我正在努力处理可能长度不同的部分。正则表达式匹配部分或全部字符串

我该如何修改正则表达式(a_)?c(davison)\.nsf?以便下面的任何字符串都可以归类为匹配项?

  • a_cdavis.nsf
  • cdavison.nsf
  • cdaviso.nsf
  • cdavis.nsf

从本质上讲,被认为是一个匹配,字符串必须符合下列条件 -

  1. “(a_)?” - 可以开始与“A_”,但不必
  2. “C” - 必须包含小写字母“c”
  3. “(戴维森)” - 位,我不能做 - 必须包含的部分或全部“戴维森”,从头开始(因此“DAV”是可以接受的,但“儿子”是不是)
  4. “ NSF” - 必须以“.NSF”说完
  5. 长度 - 长度不超过12个字符,包括可选的“_a “在字符串的开始和字符串末尾所需的”.nsf“。

任何提示和技巧将不胜感激。

要使的davison可选各部分,使用嵌套任选的基团(?:...)?),并设置长度的限制,则可以使用在开始锚定的负先行失败比赛如果13个字符被发现(从而,(?!.{13})将使大小的12个字符的字符串):

^(?!.{13})(a_)?c(d(?:a(?:v(?:i(?:s(?:on?)?)?)?)?)?)\.nsf$ 

regex demo

+2

这会不会也匹配'cson.nsf'? Quote:“(所以”dav“是可以接受的,但”儿子“不是)”我认为你需要'(d(a(v(...)?)?)?)?' –

+0

是否预期?如果不是,并且这些字母应该总是跟着另一个,那么'^(?!。{13})(a _)?c(d(?:a(?:v(?:i(?:s(?:on? )?)?)?)?)?)\。nsf $'可以提供帮助。 –

+0

这取决于语言是什么。在JS中,它会[这样的](https://jsfiddle.net/rsLngq2g/)。 –