当以下正则表达式匹配时?

时间:2014-03-20 13:29:15

标签: 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 基本上会包含 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");

这总是将“Not Present”作为输出。

但是当我在做以下事情时:

System.out.println(content.replaceAll(regex, " Replaced Value"));

输出被替换为新值。如果不存在,那么如何替换所有工作并替换新值?请清除我的困惑。

有人可以说字符串中的哪种内容会使控件转到if部分?

2 个答案:

答案 0 :(得分:2)

String 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"

这样的字符串

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

            src="cid:C4EA83841E79F643970AF3F20725CB04@gmail.com"

供您更新

您遇到的问题是使用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示例:https://ideone.com/8RTf0e

答案 1 :(得分:0)

该正则表达式将匹配任何

  

SRC = “CID:内容识别”

其中只有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”

还对contentId部分进行了转义(\ Q ... \ E),以便正则表达式引擎不会考虑其中的特殊字符。