簡體   English   中英

我需要一個Java正則表達式

[英]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$");

假設我沒看錯,您想:

  1. 以字母字符開頭
  2. 以字母數字字符結尾
  3. 任何地方最多允許一個*

^([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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM