我目前正在使用以下正则表达式:
^[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个字符或更少,我可以在正则表达式中包括它吗?或者我应该在正则表达式验证后检查字符串长度吗?
答案 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$");
假设我读得对,你想:
*
答案 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"));