簡體   English   中英

為什么這個String不匹配這個正則表達式?

[英]Why is this String not matching this regex?

我有以下代碼:

public class testMatch {

    public static void main(String[] args) {
        String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
        String expression = "3";
        if (dummyMessage.matches(expression)){
            System.out.println("MATCH!");
        } else {
            System.out.println("NO MATCH!");
        }

    }
}

我希望這是一個成功的匹配,因為dummyMessage包含表達式3,但是當我運行這個代碼片段時,代碼打印NO MATCH!

我不知道我做錯了什么。

好的停止吶喊! 。* 3. * works這是我在一些實時代碼中的問題的過度簡化,正則表達式是可配置的,直到現在匹配整個字符串已經沒事了,我現在必須匹配字符串的一部分並且想知道它為什么不起作用。

它匹配整個字符串,即大多數其他正則表達式實現中的^3$ 所以3不匹配,例如333或你的字符串。 但是.*3.*會做的。

但是,如果您只想測試字符串中是否包含“3”,則根本不需要正則表達式。 請改用dummyMessage.contains(expression)

String#matches(regex)判斷此字符串是否與給定的正則表達式匹配。 你的字符串dummyMessage與表達式不匹配,因為它試圖檢查dummyMessage是否為3你可能需要String.contains(charseq)

 String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
            String expression = "3";
            if (dummyMessage.contains(expression)){
                System.out.println("MATCH!");
            } else {
                System.out.println("NO MATCH!");
            }

您應該將整個字符串匹配matches返回true。 也許嘗試使用.*3.*

它將匹配這樣的正則表達式: .*3.*

使用contains(表達式)

 String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
        String expression = "3";
        if (dummyMessage.contains(expression)) {
            System.out.println("MATCH!");
        } else {
            System.out.println("NO MATCH!");
        }

默認情況下, String#matches()測試string是否完全匹配正則表達式。 使它工作替換

expression = "3"

expression = ".*3.*"

要匹配字符串中的子字符串,請使用Matcher#find()方法。

你的正則表達應該是.*3.*

String類的matches()方法檢查整個字符串是否匹配。 我將您的代碼修改為:

public class testMatch
{

    public static void main(String[] args)
    {
        String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
        String expression = ".*3.*";
        if (dummyMessage.matches(expression))
        {
            System.out.println("MATCH!");
        }
        else
        {
            System.out.println("NO MATCH!");
        }

    }
}

它現在有效

您可能正在尋找matcher.find

String message = "asdfasdfsadfsadfasdf 3 sdfasdf3asdfasdf";
String expression = "3";

// Really only need to do this once.
Pattern pattern = Pattern.compile(expression);
// Do this once for each message.
Matcher matcher = pattern.matcher(message);
if (matcher.find()) {
  do { 
    System.out.println("MATCH! At " + matcher.start() + "-" + matcher.end());
  } while ( matcher.find() );
} else {
  System.out.println("NO MATCH!");
}

相應地更改原始正則表達式 - 它當前不正確且不匹配:

String expression = "(.*)3(.*)";

或者只使用String.contains() - 我認為這更適合這種情況。

要么那樣做:

String dummyMessage = "asdfasdfsadfsadfasdf 3 sdfasdfasdfasdf";
String expression = "3";
Pattern p = Pattern.compile(".*3.*");
Matcher m = p.matcher(dummyMessage);
boolean b = m.matches();
if (b) {
    System.out.println("MATCH!");
}
else {
    System.out.println("NO MATCH!");
}

或者這樣:

String dummyMessage = "asdfasdfsadfadfasdf 3 sdfasdfasdfasdf";
String expression = "3"
if (dummyMessage.contains(expression)) {
    System.out.println("MATCH!");
}
else {
    System.out.println("NO MATCH!");
}

暫無
暫無

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

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