簡體   English   中英

以下正則表達式何時匹配?

[英]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.

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