我需要一个Java正则表达式

时间:2011-04-08 18:54:23

标签: java regex

我目前正在使用以下正则表达式:

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

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

离。

TE - pass

*TE - pass

TE* - pass

T*E - pass

*9TE - pass

*TE* - fail (multiple asterisk)

9E - fail (starts with number)

编辑: 很抱歉介绍一个晚期编辑,但我还需要确保字符串是8个字符或更少,我可以在正则表达式中包括它吗?或者我应该在正则表达式验证后检查字符串长度吗?

9 个答案:

答案 0 :(得分: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());
}

Per Stargazer,如果你在星星之前允许使用字母数字,那么请使用:

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

答案 1 :(得分:1)

一种可能的方法是分成两个条件:

^(?=[^*]*\*?[^*]*$)[a-zA-Z*][a-zA-Z0-9*]*$
  • (?=[^*]*\*?[^*]*$)部分确保字符串中最多只有一个*
  • [a-zA-Z*][a-zA-Z0-9*]*部分确保以字母或*开头,后面只有字母数字或*

答案 2 :(得分:0)

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

答案 3 :(得分:0)

寻找两种可能的模式,一种以*开头,另一种使用alpha char:

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

答案 4 :(得分:0)

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

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

假设我读得对,你想:

  1. 以字母字符开头
  2. 以字母数字字符结尾
  3. 最多允许一个*

答案 5 :(得分:0)

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

下半部分的括号是为了清晰起见,可以安全地排除。

答案 6 :(得分: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]*)$

答案 7 :(得分: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

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

答案 8 :(得分: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"));