正则表达式字符串包含最多一个 '#'

问题描述:

需要正则表达式的模式来匹配字符串排除如果 '#' 更多的则1串倍正则表达式字符串包含最多一个 '#'

var srg = new RegExp(/([a-z0-9#]+[\s])/g); 

字符串:

fdsffmsd,fmsd 
qwjswkds03sj 
ewew 
rfekwjkr#jfkdlsf 
wiru0ksd#erjk#jkls 
# 
casdw##kfdl 

结果

fdsffmsd,fmsd

qwjswkds03sj

ewew

rfekwjkr#jfkdlsf

wiru0ksd#erjk#jkls

casdw ## kfdl

Fiddle

感谢

UPDATE:

请原谅我没有好任务的解释

我更新新的小提琴 New fiddle

var srg = new RegExp(/((\-)[a-z0-9#]+[\s])/g); 

我们做什么:

  • 搜索“ - ”字符

  • 若发现 - 匹配,0-9#,而不能满足任何空间

  • 需要添加条件,比赛仅#0或模式1倍捕捉

可能会像[A-Z0-9#{0,1}]的意思是#0次或一个...

+0

你需要匹配不包含双'##线'? –

+0

yes,right,only a-z0-9#but not if#more than 1 – Dmitry

+0

如果行正常,或者您想搜索所有'a-z0-9#'的页面或文件,您需要匹配只要他们不包含2'#'? –

说明

这个表达式:

  • 要求字符串以0开头字符
  • 允许#到至多1周时间字符串中出现
  • 防止空间出现在字符串中
  • 允许一个或多个的a-z0-9字符
  • 允许#字符在任何地方出现字符串,包括开头和结尾

^(?!(?:.*?#){2,})-[a-z0-9#]+$

enter image description here

NODE      EXPLANATION 
-------------------------------------------------------------------------------- 
^      the beginning of the string 
-------------------------------------------------------------------------------- 
    (?!      look ahead to see if there is not: 
-------------------------------------------------------------------------------- 
    (?:      group, but do not capture (at least 2 
          times (matching the most amount 
          possible)): 
-------------------------------------------------------------------------------- 
     .*?      any character except \n (0 or more 
           times (matching the least amount 
           possible)) 
-------------------------------------------------------------------------------- 
     #      '#' 
-------------------------------------------------------------------------------- 
    ){2,}     end of grouping 
-------------------------------------------------------------------------------- 
)      end of look-ahead 
-------------------------------------------------------------------------------- 
    -      '-' 
-------------------------------------------------------------------------------- 
    [a-z0-9#]+    any character of: 'a' to 'z', '0' to '9', 
          '#' (1 or more times (matching the most 
          amount possible)) 
-------------------------------------------------------------------------------- 
    $      before an optional \n, and the end of the 
          string 

例子

Live Demo

样品

-abcdefghijklmnopqrstuvwxyz1234567890  = good 
-abcdefghijklmnopq#rstuvwxyz1234567890 = good 
-abcdefghijklmnopq##rstuvwxyz1234567890 = bad 
-#abcdefghijklmnopqrstuvwxyz1234567890 = good 
-##abcdefghijklmnopqrstuvwxyz1234567890 = bad 
-#abcdefghijklmnopqrstuvwxyz1234567890 = good 
-abcdefghijklmnopqrstuvwxyz1234567890# = good 
-#abcdefghijklmnopqrstuvwxyz1234567890# = bad 
#-abcdefghijklmnopqrstuvwxyz1234567890 = bad 
+0

这很好!谢谢! – Dmitry

+0

您用来生成上述图像的软件是什么? – Florian

你可以做的就是调用'your line'.match(/#/g).length在你的方法中,如果长度大于1,你可以排除这些结果。在这之后,如果这个条件满足,通过链接进行匹配。

+0

对不起,我会用其他正则表达式其中包含更多其他条件 – Dmitry

第一次尝试:

var srg = new RegExp(/[a-z0-9]*#?[a-z0-9]*\s/g); 

说明:#?指定#字符可出现一次或根本没有。这是夹在两个[a-z0-9]*表达式之间,它允许前后的字母数字。最后的\s指定一个单一的空白字符必须发生后(与您的原始正则表达式一致)。

编辑 - 第二次尝试:

var srg = new RegExp(/([a-z0-9]+#?[a-z0-9]*|[a-z0-9]*#?[a-z0-9]+)\s/g); 

这看起来更复杂,但是它的所有做的是上述正则表达式,并分裂成两种可能性 - 第一,其中必须有至少一个字母数字前#和第二个在之后必须至少有一个字母数字#。

+0

alittle不是,每行必须由空格或新行分开 – Dmitry

+0

请看我的更新 – Dmitry

编辑:根据您的更新:

您可以使用此正则表达式,允许在一个字符串最大一个#

var srg = new RegExp('^-[a-z0-9]+#?[a-z0-9]+$'); 

'-wiru0ksd#erjk#jkls'.match(srg); //=> null 

'-fdsffmsd,fmsd'.match(srg); //=> null 

'-rfekwjkr#jfkdlsf'.match(srg); //=> ["-rfekwjkr#jfkdlsf"] 
+0

没有想法我怎么能把这个添加到我的正则表达式...请参阅更新 – Dmitry

+0

好吧,现在检查我编辑的答案。 – anubhava