簡體   English   中英

正則表達式檢查字符串僅包含十六進制字符

[英]Regex to check string contains only Hex characters

我以前從未做過正則表達式,而且我發現它們對於處理字符串非常有用。 我看過一些教程 (例如),但是我仍然不明白如何對字符串中的十六進制字符進行簡單的Java正則表達式檢查。

用戶將在文本框中輸入以下內容: 0123456789ABCDEF ,我想知道該輸入是正確的,否則,當返回false時,例如XTYSPG456789ABCDEF

是否可以使用正則表達式來做到這一點,或者我是否誤解了它們的工作原理?

是的,您可以使用正則表達式來做到這一點:

^[0-9A-F]+$

說明:

^            Start of line.
[0-9A-F]     Character class: Any character in 0 to 9, or in A to F.
+            Quantifier: One or more of the above.
$            End of line.

要在Java中使用此正則表達式,您可以例如在String上調用matches方法:

boolean isHex = s.matches("[0-9A-F]+");

請注意, matches僅查找完全匹配項,因此在這種情況下,您不需要行錨的開始和結束。 看到它在線上工作: ideone

您可能還希望同時允許大寫和小寫AF,在這種情況下,您可以使用以下正則表達式:

^[0-9A-Fa-f]+$

可能是您想使用POSIX字符類\\p{XDigit} ,所以:

^\\p{XDigit}+$

另外,如果您打算非常頻繁地使用正則表達式,建議使用常量以避免每次都重新編譯它,例如:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("^\\p{XDigit}+$");

public static void main(String[] args) {
    String input = "0123456789ABCDEF";
    System.out.println(
        REGEX_PATTERN.matcher(input).matches()
    );  // prints "true"
}

實際上,給出的答案並不完全正確。 出現問題是因為數字0-9也是十進制值。 您要做的部分工作是測試00-99,而不是0-9,以確保較低的值不是十進制數。 像這樣:

^([0-9A-Fa-f]{2})+$

要說這些必須成對出現! 否則-字符串不一樣! :-)

例:

   (Pick one)
   var a = "1e5";
   var a = "10";
   var a = "314159265";

如果我在正則表達式中使用了接受的答案,它將返回TRUE。

   var re1 = new RegExp( /^[0-9A-Fa-f]+$/ );
   var re2 = new RegExp( /^([0-9A-Fa-f]{2})+$/ );

   if( re1.test(a) ){ alert("#1 = This is a hex value!"); }
   if( re2.test(a) ){ alert("#2 = This IS a hex string!"); }
     else { alert("#2 = This is NOT a hex string!"); }

請注意,在兩種情況下,“ 10”均返回TRUE。 如果傳入的字符串只有0-9,則您無法分辨,如果是十六進制值或十進制值,則很容易看出來,除非長度不一的字符串前面缺少零(十六進制值始終成對出現-即-低字節/高位字節)。 但是像“ 34”這樣的值都是完全有效的十進制或十六進制數字。 他們只是意味着兩件事。

還請注意,由於周期,無論您執行哪種測試,“ 3.14159265”都不是十六進制值。 但是,通過添加“ {2}”,您至少要確保它確實是一個十六進制字符串,而不是像十六進制字符串那樣看起來。

暫無
暫無

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

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