簡體   English   中英

為什么 String.matches 在 Java 中返回 false?

[英]Why is String.matches returning false in Java?

if("test%$@*)$(%".matches("[^a-zA-Z\\.]"))
    System.exit(0);

if("te/st.txt".matches("[^a-zA-Z\\.]"))
    System.exit(0);

即使正則表達式應該返回true,程序也沒有退出。 代碼有什么問題?

僅當正則表達式匹配整個 string 時, matches返回true 在您的情況下,您的正則表達式僅代表一個不是azAZ. .

我懷疑您想檢查字符串是否包含您在正則表達式中描述的這些特殊字符之一。 在這種情況下,用.*包圍你的正則表達式,讓正則表達式匹配整個字符串。 哦,你不必逃跑. 在字符類[.]

if ("test%$@*)$(%".matches(".*[^a-zA-Z.].*")) {
    //string contains character that is not in rage a-z, A-Z, or '.'

但是如果你關心性能,你可以使用Matcher#find()方法

  1. 可以在找到包含正則表達式匹配項的子字符串時返回true 這樣應用程序就不需要檢查剩余的文本,這為我們節省了更多的時間,剩余的文本越長。

  2. 不會強迫我們在每次調用String#matches(regex)時不斷構建 Pattern 對象,因為我們可以創建 Pattern 一次並使用不同的數據重用它。

演示:

Pattern p = Pattern.compile("[^a-zA-Z\\.]");

Matcher m = p.matcher("test%$@*)$(%");
if(m.find())
    System.exit(0);

//OR with Matcher inlined since we don't really need that variable
if (p.matcher("test%$@*)$(%").find())
    System.exit(0);

x.matches(y)相當於

Pattern.compile(y).matcher(x).matches()

並要求整個字符串x匹配正則表達式y 如果您只想知道x某個子字符串是否與y匹配,那么您需要使用find()而不是matches()

if(Pattern.compile("[^a-zA-Z.]").matcher("test%$@*)$(%").find())
    System.exit(0);

或者,您可以顛倒測試的意義:

if(!"test%$@*)$(%".matches("[a-zA-Z.]*"))

通過提供匹配允許的字符串而不是不匹配的字符的模式,然后查看測試字符串是否無法匹配此模式。

您始終獲得 false,因為僅當模式匹配完整字符串時, matches()方法才返回 true。

暫無
暫無

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

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