2016-07-08 53 views
2

我需要使用正则表达式检查字符串。检查具有多个长度模式的字符串

有效的字符串是例如:ABC0001A00023

有三个部分我要检查:

  1. 所以字符串应该用字招牌开始:[a-zA-Z]{1,}
  2. 再就是分钟一个零:[0]{1,}
  3. 第三部分是一个数字\\d+

整个字符串可能不会超过8个符号。

我试过到目前为止:

String NR_PATTERN = "^([a-zA-Z]{1,}[0]{1,}\\d+){3,8}$"; 

的问题是,正则表达式不接受的字符串:KDS0234

+0

你有这种表达的问题是(除了事实,你可以通过插入零或其他字母有任意长度的字符串等并且'[0]'和裸骨骼'0'相同)? – dhke

+1

'“^([a-zA-Z] {1,} [0] {1,} \\ d +){3,8} $”; 'mean [(a-zA-Z] {1,} [0] {1,} \\ d +)'出现3-8次,不是整个长度是3-8 –

+0

尝试像这样:[''^( ?!。{9})[AZ] +0+ [1-9] \\ d * $“'](http://fiddle.re/12v3ha) –

回答

3

你可以在一开始就积极的前瞻尝试:

(?=^.{3,8}$)([a-zA-Z]{1,}[0]{1,}\\d+) 

正前瞻:

(?=^.{3,8}$) 

将展望?=并确认从乞讨innning ^到结尾$的字符串,有任何字符匹配. 3到8次{3,8}

1

(…){3,8}意味着你要...序列3和8倍之间进行反复,而不是字符串是8个字符

你可以只使用(知道你说你需要一个正则表达式,但也许这会对你有用)

String NR_PATTERN = "[a-zA-Z]+0+\\d+"; 
String s = "ABC0001"; 
boolean match = s.length() < 8 && s.matches(NR_PATTERN); 
1

您可以在先行检查长度条件再搭配你的模式:

\b(?=[a-zA-Z0-9]{3,8})([A-Za-z]+0[0-9]+)\b 
0
(?=^.{3,8}$)([a-zA-Z]+[0]+\d+) 

希望这有助于

+0

请编辑更多信息。仅限代码和“尝试这个”的答案是不鼓励的,因为它们不包含可搜索的内容,也不解释为什么有人应该“尝试这个”。我们在这里努力成为知识的资源。 – abarisone

+0

尽管此代码可能有助于解决问题,但 提供了有关_why_和/或_how_的其他上下文,回答该问题将显着提高其长期价值。请[编辑]你的答案,添加一些 的解释。 –

1

你可以去:

\b(?=[A-Z]+0+\d+)\w{3,8}\b 

a demo on regex101.com,在Java使用双反斜线。


这将匹配:

ABC0001 A00023 and ABCD001 

但不是

B123456 or 0001B 
+1

在OP中:“整个字符串不得超过8个符号。” – DVarga