簡體   English   中英

Java RegEx - 特殊字符直到字符串結尾

[英]Java RegEx - special character til end of string

鑒於字符串的規則是

[Random Nr of Letters]##[Random Nr of Letters]#[Random Nr of Letters]##########

字符串長度必須為35

My String例如看起來像

TEST##TESTING#TEST#################

我的問題是我無法檢測到錯誤的格式

TEST##TESTING#TEST##A##############

我的方法是:

private static boolean test(String test_line) {
    String test = "[A-Z]{1,}##[A-Z]{1,}#[A-Z]{1,}#{1,}";
    Pattern test_pattern = Pattern.compile(test);
    Matcher matcher = test_pattern.matcher(test_line);
    return matcher.find();
}

是否有一個簡單的方法與RegEx(我必須使用它),如“用#結束此字符串,不允許其他字符”。

另一個問題:我怎樣才能確保我的測試不會允許其他字符而不是AZ 0-9和#? 就像是:

    String test = "([^A-Z][^0-9][#])";
    Pattern test_pattern = Pattern.compile(test);
    Matcher matcher = test_pattern.matcher(test_line);
    return matcher.find();

(與談判)

謝謝您的幫助 :)

讓我們一步一步做:

為了確保某些字符串具有特定長度的正則表達式可以看起來像

^.{35}$

哪里

  • ^表示字符串的開頭
  • . 代表任何字符(在行分隔符旁邊)
  • {35}代表了多少次前一個元素(以出情況. -任何字符)可以出現,所以這里正則表達式需要35個字符
  • $表示字符串的結尾

在您的情況下,您只想接受范圍AZ#字符,以便您可以替換. (任何角色)有這個角色類 [AZ#]所以你的正則表達式看起來像

^[A-Z#]{35}$

但是你也想確保這些角色的順序。 換句話說,您還想檢查整個字符串是否與其他正則表達式匹配

^[A-Z]{1,}##[A-Z]{1,}#[A-Z]{1,}#{1,}$

實際上我們可以簡單地使用+來代替{1,}

^[A-Z]+##[A-Z]+#[A-Z]+#+$

要結合這兩個正則表達式可以使用前瞻機制,讓我們窺視字符位置之后,它被使用,它匹配一些額外的正則表達式后檢查字符。

所以最終的正則表達式看起來像

^(?=[A-Z#]{35}$)[A-Z]+##[A-Z]+#[A-Z]+#+$
    ----------- ------------------------
regex1 (length)  regex2 (order)

現在為了避免每次調用方法時重新編譯( Pattern.compile(test) )相同的正則表達式,最好將其編譯后的版本作為類字段存儲在方法之外。 所以嘗試類似的東西

private static Pattern test_pattern = Pattern
        .compile("^(?=[A-Z#]{35}$)[A-Z]+##[A-Z]+#[A-Z]+#+$");

private static boolean test(String test_line) {
    return test_pattern.matcher(test_line).matches();
}

測試

System.out.println(test("TEST##TESTING#TEST#################"));//true
System.out.println(test("TEST##TESTING#TEST##A##############"));//false

試試吧

[a-zA-Z]+#{2}[a-zA-Z]+#{1}[a-zA-Z]+#{1,}

要么

^([a-zA-Z]+#{2}[a-zA-Z]+#{1}[a-zA-Z]+#{1,})$

要么

^(?=.{35}$)([A-Z]+#{2}[A-Z]+#{1}[A-Z]+#{1,})$

TEST##TESTING#TEST################# // pass
TEST##TESTING#TEST##A############## // fail

演示

以下正則表達式將匹配滿足上述標准的行,

^(?=.{35}$)[A-Z0-9]+##[A-Z0-9]+#[A-Z0-9]+#+$

DEMO

它匹配包含正好35個字符的行。

對於指定的格式,確保最后一個字符是#

([A-Z]+[#]+){3}

要測試字符串的長度:

if(test.length == 35)
    // ...

要測試和允許數字(僅限字母數字和#符號):

([A-Z0-9]+[#]+){3}

允許使用小寫字母:

(\w+#+){3}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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