2013-08-27 88 views
0

需要正則表達式的模式來匹配字符串排除如果 '#' 更多的則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'#'? –

回答

1

說明

這個表達式:

  • 要求字符串以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

1

你可以做的就是調用'your line'.match(/#/g).length在你的方法中,如果長度大於1,你可以排除這些結果。在這之後,如果這個條件滿足,通過鏈接進行匹配。

+0

對不起,我會用其他正則表達式其中包含更多其他條件 – Dmitry

1

第一次嘗試:

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

2

編輯:根據您的更新:

您可以使用此正則表達式,允許在一個字符串最大一個#

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

相關問題