2011-04-08 64 views
0

我目前使用下面的正则表达式的Java正则表达式:我需要

^[a-zA-Z]{0,}(\\*?)?[a-zA-Z0-9]{0,} 

检查字符串在任何地方开始以字母字符和字母数字字符结束并且有星号(*)字符串,但最多只有一次。这里的问题是,如果给定的字符串仍然通过,如果它以数字开头但没有*,则应该失败。我该如何重写正则表达式才能使这种情况失败?

ex。

 
TE - pass 

*TE - pass 

TE* - pass 

T*E - pass 

*9TE - pass 

*TE* - fail (multiple asterisk) 

9E - fail (starts with number) 

编辑: 对不起引进后期编辑,但我还需要确保字符串为8个字符以内,我可以包括在正则表达式中呢?或者我应该检查正则表达式验证后的字符串长度?

+0

我只是检查验证之前或之后的长度。 – 2011-04-08 19:47:08

回答

4

这通过你的例子:

"^([a-zA-Z]+\\*?|\\*)[a-zA-Z0-9]*$" 

It says: 
    start with: [a-zA-Z]+\\*? (a letter and maybe a star) 
       | (or) 
       \\* a single star 
    and end with [a-zA-Z0-9]* (an alphanumeric character) 

代码来测试它:

public static void main(final String[] args) { 
    final Pattern p = Pattern.compile("^([a-zA-Z]+\\*?|\\*)\\w*$"); 

    System.out.println(p.matcher("TE").matches()); 
    System.out.println(p.matcher("*TE").matches()); 
    System.out.println(p.matcher("TE*").matches()); 
    System.out.println(p.matcher("T*E").matches()); 
    System.out.println(p.matcher("*9TE").matches()); 
    System.out.println(p.matcher("*TE*").matches()); 
    System.out.println(p.matcher("9E").matches()); 
} 

每夜光云,如果你允许字母数字的明星之前,然后使用此:

^([a-zA-Z][a-zA-Z0-9]*\\*?|\\*)\\w*$ 
+1

@NKCSS,它通过T * E就好了,但它在T9失败* Z。把它改成'^([a-zA-Z] [a-zA-Z0-9] * \\ *?| \\ *)\\ w * $'应该可以做到。 – riwalk 2011-04-08 19:10:51

+0

删除它,一定是已经把它添加到错误的正则表达式(这里有很多问题:) :) – NKCSS 2011-04-08 19:12:35

+0

@Stargazer我读它作为所有的字母数字字符应该在星星之后,如果不是这样的话,那么是 – 2011-04-08 19:12:51

1

一种可能的方式是分离成2个条件:

^(?=[^*]*\*?[^*]*$)[a-zA-Z*][a-zA-Z0-9*]*$ 
  • (?=[^*]*\*?[^*]*$)部分也确保了至多一个*字符串英寸
  • [a-zA-Z*][a-zA-Z0-9*]*部分确保它以字母或*开头,后跟字母数字或*
+0

好吧,它看起来像是在工作,但Eclipse说有非法逃跑后果,我应该在'*'之前加倍'\'吗? – Erik 2011-04-08 19:06:55

+0

@Erik:是的。 [](http://。) – kennytm 2011-04-08 19:07:24

+0

好吧,看起来像是按照预期工作,谢谢 – Erik 2011-04-08 19:15:13

0

如果您只是将正则表达式分解为几个部分,例如一个用于开始和结束,另一个用于星号,则以后开发和维护可能会更容易。我不确定总体性能的影响是什么,你会得到更简单的表达式,但必须运行其中的一些。

0

查找了两个可能的模式,一个以*开头的,和一个带有字母字符:

^[a-zA-Z][a-zA-Z0-9]*(\\*?)?[a-zA-Z0-9]*|\*[a-zA-Z0-9]* 
+0

正则表达式构造函数抛出异常: 解析“^ [a-zA-Z] [a-zA-Z0-9](\?)?[a-zA-Z0-9] | * [a-zA-Z0- 9]“ - 量词{x,y}没有任何内容。 – NKCSS 2011-04-08 19:10:11

+0

谢谢 - 没有将它标记为代码,并且SO隐藏了一些字符。 – 2011-04-08 19:18:26

0

这个怎么样,它更容易阅读:

boolean pass = input.replaceFirst("\\*", "").matches("^[a-zA-Z].*\\w$"); 

假设我没有看错,你想:

  1. 开始以字母字符
  2. 结束以字母数字字符
  3. 留出一个*为清楚起见随时随地
0

^([a-zA-Z][a-zA-Z0-9]*\*|\*|[a-zA-Z])([a-zA-Z0-9])*$

围绕下半年括号是,可以安全地排除。

+0

Eek ...刚刚意识到我的要求只有一颗星...挑战 – riwalk 2011-04-08 19:09:43

+0

未能匹配T * M – NKCSS 2011-04-08 19:10:42

+0

编辑应该有这个工作现在 – riwalk 2011-04-08 19:13:34

0

这是一个艰难的(喜欢挑战),但这里是:

^(\*[a-zA-Z0-9]+|[a-zA-Z]+[\*]{1}[a-zA-Z]*)$ 

为了符合T9 * Z,如在另一篇文章中有StarGazer712指出,我不得不将其更改为:

^(\*[a-zA-Z0-9]+|[a-zA-Z]{1}[a-zA-Z0-9]*[\*]{1}[a-zA-Z0-9]*)$ 
0

这是Python的,它会需要一些按摩的Java :


>>> import re 
>>> p = re.compile('^([a-z][^*]*[*]?[^*]*[a-z0-9]|[*][^*]*[a-z0-9]|[a-z][^*]*[*])$', re.I) 
>>> for test in ['TE', '*TE', 'TE*', 'T*E', '*9TE', '*TE*', '9E']: 
... if p.match(test): 
... print test, 'pass' 
... else: 
... print test, 'fail' 
... 
TE pass 
*TE pass 
TE* pass 
T*E pass 
*9TE pass 
*TE* fail 
9E fail 

希望我没有错过任何东西。

0

最多只有一个星号,任何地方的字母字符和任何地方的数字,但在开始时。

String alpha = "[a-zA-Z]"; 
    String alnum = "[a-zA-Z0-9]"; 

    String asteriskNone = "^" + alpha + "+" + alnum + "*"; 
    String asteriskStart = "^\\*" + alnum + "*"; 
    String asteriskInside = "^" + alpha + "+" + alnum + "+\\*" + alnum + "*"; 
    String yourRegex = asteriskNone + "|" + asteriskStart + "|" 
      + asteriskInside; 
    String[] tests = {"TE","*TE","TE*","T*E","*9TE","*TE*", "9E"}; 
    for (String test : tests) 
     System.out.println(test + " " + (test.matches(yourRegex)?"PASS":"FAIL"));