[英]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.