Java 以下正则表达式何时匹配?

Java 以下正则表达式何时匹配?,java,regex,Java,Regex,我在一个Android源文件中找到了以下正则表达式: String regex = "\\s+(?i)src=\"cid(?-i):\\Q" + attachment.mContentId + "\\E\""; if(string.matches(regex)) { Print -- Matched } else { Print -- Not Found } 注意:attachment.mContentId的值基本上类似于C4EA83841E79F643970AF3F20725

我在一个Android源文件中找到了以下正则表达式:

String regex = "\\s+(?i)src=\"cid(?-i):\\Q" + attachment.mContentId + "\\E\"";
if(string.matches(regex)) {
    Print -- Matched
} else {
    Print -- Not Found
}
注意:attachment.mContentId的值基本上类似于C4EA83841E79F643970AF3F20725CB04@gmail.com

我制作了一个示例代码,如下所示:

String content = "Hello src=\"cid:something@gmail.com\" is present";
    String contentId = "something@gmail.com";
    String regex = "\\s+(?i)src=\"cid(?-i):\\Q" + contentId + "\\E\"";
    if(content.matches(regex))
        System.out.println("Present");
    else
        System.out.println("Not Present");
这总是将“不存在”作为输出

但当我做以下工作时:

System.out.println(content.replaceAll(regex, " Replaced Value"));
并用新值替换输出。如果不存在,那么replaceAll如何工作并替换新值?请澄清我的困惑

有人能说出字符串中的哪种内容将使控件转到if部分吗?

字符串regex=“\\s+(?i)src=\”cid(?-i):\\Q“+attachment.mContentId+”\\E\”

细分:

\\s+ - Match 1 or more spaces 

(?i) - Turn on case-insensitive matching for the subsequent string

src=\"cid - match src="cid

(?-i) - Turn off case-insensitive matching

: - Obviously a colon

\\Q - Treat all following stuff before \\E as literal characters, 
      and not control characters. Special regex characters are disabled until \\E

attachment.mContentId - whatever your string is

\\E - End the literal quoting sandwich started by \\Q

\" - End quote
因此它将匹配一个字符串,如
src=“cid:YOUR-string-LITERAL”

或者,使用您自己的示例,类似于此字符串的内容将匹配(有前导空格字符):

谢谢你的更新 您遇到的问题是使用
java.lang.String.matches()
并期望它做您认为应该做的事情

String.matches()
(和
Matcher
)有一个问题:它试图将整个字符串与正则表达式进行匹配

如果使用此正则表达式:

String regex = "\\s+(?i)src=\"cid(?-i):\\Q" + attachment.mContentId + "\\E\"";
这个输入:

String content = "Hello src=\"cid:something@gmail.com\" is present";
content
将永远不会与
regex
匹配,因为整个字符串与正则表达式不匹配

您要做的是使用
Matcher.find
-这应该适合您

String content = "Hello src=\"cid:something@gmail.com\" is present";
String contentId = "something@gmail.com";
Pattern pattern = Pattern.compile("\\s+(?i)src=\"cid(?-i):\\Q" + contentId + "\\E\"");

Matcher m = pattern.matcher(content);

if(m.find())
    System.out.println("Present");
else
    System.out.println("Not Present");

IDEone示例:

正则表达式将匹配任何

src=“cid:contentId”

其中,只有contentId需要与区分大小写的匹配。 例如,给出您的示例contentId(C4EA83841E79F643970AF3F20725CB04@gmail.com)这些字符串将匹配:

SrC=“CiD:C4EA83841E79F643970AF3F20725CB04@gmail.com" src=“cid:C4EA83841E79F643970AF3F20725CB04@gmail.com" SRC=“CID:C4EA83841E79F643970AF3F20725CB04@gmail.com"

虽然这些不匹配:

src=“cid:c4Ea83841e79F643970aF3f20725Cb04@GmaiL.com" src=“cid:C4EA83841E79F643970AF3F20725CB04@GMAIL.COM"


还有,CONTEDD部分是转义符(\q…\e),这样ReGEX引擎就不会考虑其中的特殊字符。

@ ChandraSekhar,我在末尾添加了一个部分来解释为什么您的代码不工作。哇。谢谢。一个小问题。我尝试了content.matches((.*)+regex+“(.*)”),它工作正常。你能建议我应该使用哪一个吗?如果你只需要验证你的字符串是否与正则表达式周围的正则表达式匹配。*是一个有效的选项。相反,如果您需要对每个匹配项进行操作(即替换其中的一部分或提取某些值),则使用Matcher.find是一种更好的方法。原因是String.match方法需要正则表达式来匹配整个字符串。您的正则表达式需要一个以空格开头的字符串,后跟
src=“cid:contentId”
。如果您试图匹配一个不完全符合此规范的字符串,您将得到false。而是使用String.replaceAll方法在字符串中搜索匹配并替换它的任何子字符串。只需执行以下操作即可显示示例打印:
regex=“.*+regex+”*“
,这将告诉regex引擎匹配包含与原始regex匹配的子字符串的任何字符串。
String content = "Hello src=\"cid:something@gmail.com\" is present";
String contentId = "something@gmail.com";
Pattern pattern = Pattern.compile("\\s+(?i)src=\"cid(?-i):\\Q" + contentId + "\\E\"");

Matcher m = pattern.matcher(content);

if(m.find())
    System.out.println("Present");
else
    System.out.println("Not Present");