2011-07-19 15 views
9

Belirli bir normal ifadeyle biraz şaşırıyorum.Simple Regex, en az bir tire ile herhangi bir dizgi eşleştirin

Bu eşleme, yalnızca a-z, A-Z, 0-9 olan bir dize olmalı ve dizede herhangi bir yerde en az bir '-' karakterinin olması gerekir.

[a-zA-Z0-9-]+ var ama sorun şu ki, '-' karakteri olmayanlarla da eşleşecektir.

ABC123-ABC //should match 

ABC123ABC //shouldn't match. 

cevap

19

Bu çalışması gerekir: Ayrıca

^([a-zA-Z0-9]*-[a-zA-Z0-9]*)+$ 

tam olarak 135 tire yapmak istiyorsanız:

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

veya en az 23 tire fazla olmamak kaydıyla 54 yapmak istiyorsanız tireler:

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

+0

Teşekkürler, bir şey yap n sayıda tire gerektiriyorsa, gerçekten uzun soluklu olsun? – maxp

+1

Sadece FYI: bu gönderide sağlanan ilk regex ('^ [a-zA-Z0-9] * - [a-zA-Z0-9] * $') _exactly_ one tire ile eşleşir; kısa çizgi (orjinal mesajınızda belirtildiği gibi), diğer örneklere benzer şekilde sarmalı ve ** + **: '^ ([a-zA-Z0-9] * - [a-zA-Z0-9] * eklemelisiniz.) + $ ' –

+0

Bu, yalnızca - olan bir dizeyle eşleşecektir. Her zaman alfanumlar arasına sarılmaya ihtiyaç duyulursa, ([a-zA-Z0-9] + - [a-zA-Z0 -9] +) Denedim ama doğru uyuşmuyor. Bir kez dize parçası ikinci kez düşünülmez mi? Üzgünüm ben regex ve karışık yeni. –

2

Burada basit regex var :) noktası:

^(?=.*-)[a-zA-Z0-9-]+$ 
2

Peter çözüm: eşleşen bir dize verildiğinde (^([a-zA-Z0-9]*-[a-zA-Z0-9]*)+$) iyi bir performans sergiliyor.

^[a-zA-Z0-9]*-[-a-zA-Z0-9]*$ # Match one or more -

^([a-zA-Z0-9]*-){5}[a-zA-Z0-9]*$ # Match exactly 5 -

^([a-zA-Z0-9]*-){1,5}[a-zA-Z0-9]*$ # Match from 1 to 5 -:

İşte aa-aa-aa-aa-aa-aa-aa-aa-aa-aa-aa-aa%

Bu sorunu önlemek düzenli ifadeler şunlardır: a eşleşmeyen dize gibi sunulduğunda Ancak bu ifade Catastrophic Backtracking yaşar

İlgili konular