[英]When the following Regex matches?
我在其中一個Android Source文件中找到了以下正則表達式:
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部分?
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
這應該對您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
該正則表達式將匹配任何
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”
同樣,contentId部分被轉義(\\ Q ... \\ E),因此正則表達式引擎不會在其中考慮特殊字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.