[英]I need a Java regular expression
我目前正在使用以下正则表达式:
^[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个字符或更少,我也可以在正则表达式中包括它吗? 还是应该在正则表达式验证之后检查字符串长度?
这通过了您的示例:
"^([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*$
一种可能的方法是分为两个条件:
^(?=[^*]*\*?[^*]*$)[a-zA-Z*][a-zA-Z0-9*]*$
(?=[^*]*\\*?[^*]*$)
部分确保字符串中最多有一个*
。 [a-zA-Z*][a-zA-Z0-9*]*
部分确保它以字母或*
开头,然后仅字母数字或*
开头。 如果只将正则表达式分成几部分,例如,一个用于开始和结束,一个用于星号,则可能会更容易开发和以后维护。 我不确定整体性能会如何,您将使用更简单的表达式,但必须运行其中的一些表达式。
寻找两种可能的模式,一种以*开头,另一种以字母char开头:
^[a-zA-Z][a-zA-Z0-9]*(\\*?)?[a-zA-Z0-9]*|\*[a-zA-Z0-9]*
怎么样,它更容易阅读:
boolean pass = input.replaceFirst("\\*", "").matches("^[a-zA-Z].*\\w$");
假设我没看错,您想:
*
^([a-zA-Z][a-zA-Z0-9]*\\*|\\*|[a-zA-Z])([a-zA-Z0-9])*$
下半部的括号是为了清楚起见,可以安全地排除在外。
这是一项艰巨的任务(喜欢挑战),但这是:
^(\*[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]*)$
这是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
希望我什么都不会错过。
最多一个星号,任何字母字母字符都可以,除了开始处,数字都可以。
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"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.