我在其中一个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部分?
答案 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),以便正则表达式引擎不会考虑其中的特殊字符。