正規表示式(匹配第一個花括號)

風靈使發表於2018-09-05

學習正則,工作中使用正則讓我對“^”有了新的認知:

正則中^匹配輸入字串的開始位置,除非在[]方括號表示式中使用,此時表示不接受該字符集合。

廢話不多說,直接看栗子吧,

如下圖所示,需要匹配第一個花括號前的地址
這裡寫圖片描述

[^}] 除了“}”以外的任何字元

[^}]* 0或多個非“}”的字元

^[^}]* 從左向右匹配非“}”的多個字元

^[^}]*\} 從左向右匹配第一個包含“}”的字串

這裡寫圖片描述


正規表示式匹配大括號裡面的內容

方法一: {[^}]+}

var str = "aa ds sdf {asdf asdfag }";
var str1 = str.match(/\{[^\}]+\}/)[0];

方法二: /{[\S\s]+}/或者/{(.|\r\n)+}/

注:\S\s可是微軟文件中對\n匹配的標準用法哦

var str = "aa ds sdf {asdf asdfag }";
var str1 = str.match(/\{[\S\s]+\}/)[0];

如何利用正規表示式匹配花括號內的內容

匹配花括號內的內容

Input: {abc}, Output: abc

正規表示式: (?<=\{)[^}]*(?=\})

(?<=\{) 匹配以左花括號開頭
[^}]* 取得內容
(?=\}) 匹配以右花括號結束

private List<String> GetTokens(String str)
{
    Regex regex = new Regex(@"(?<=\{)[^}]*(?=\})", RegexOptions.IgnoreCase);
    MatchCollection matches = regex.Matches(str);

    // Results include braces (undesirable)
    return matches.Cast<Match>().Select(m => m.Value).Distinct().ToList();
}

java正規表示式匹配小括號內的內容

經常用到正則匹配小括號內容,在此摘錄下來

String content = "src: local('Open Sans Light'), local('OpenSans-Light'), url(http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTa-j2U0lmluP9RWlSytm3ho.woff2) format('woff2')";
// 從內容上擷取路徑陣列
Pattern pattern = Pattern.compile("(?<=\\()[^\\)]+");  
Matcher matcher = pattern.matcher(content);
while(matcher.find()){
   System.out.println(matcher.group());
}

輸出

'Open Sans Light'
'OpenSans-Light'
http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTa-j2U0lmluP9RWlSytm3ho.woff2
'woff2'

還有一種情況是,我們只匹配url裡面的內容,比如要匹配的字串是

String content = "local('OpenSans-Light'),url(http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTa-j2U0lmluP9RWlSytm3ho.woff2) format('woff2');unicode-range:U+0460-052F,U+20B4,U+2DE0-2DFF,U+A640-A69F;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url(http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTZX5f-9o1vgP2EXwfjgl7AY.woff2) format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url(http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTRWV49_lSm1NYrwo-zkhivY.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url(http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTaaRobkAwv3vxw3jMhVENGA.woff2) format('woff2');";

然後將正則規則修改為

Pattern pattern = Pattern.compile("(?<=url\\()[^\\)]+"); 

這樣就能匹配如下內容了

http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTa-j2U0lmluP9RWlSytm3ho.woff2
http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTZX5f-9o1vgP2EXwfjgl7AY.woff2
http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTRWV49_lSm1NYrwo-zkhivY.woff2
http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTaaRobkAwv3vxw3jMhVENGA.woff2

正則中使用了零寬度斷言


用正規表示式匹配兩個字元中間的文字

    String skh ="(?<=\\《)[^\\》]+";//用於匹配《》裡面的文字
    String str="但實際上《kajdwdej》孫大偉多";//測試字串
    Pattern pattern=Pattern.compile(skh);
            Matcher matcher=pattern.matcher(str);
            boolean is=matcher.find();
        if(is)System.out.print(matcher.group());

輸出結果為:kajdwdej

同理將skh字串中換成對應所要匹配的兩個字元,就可以匹配兩個字元中間的文字


正則獲取HTML程式碼中imgsrc地址

/// <summary> 
/// 獲得HTML中所有圖片的src地址
/// </summary> 
/// <param name="sHtmlText">HTML程式碼</param> 
/// <returns>圖片的URL列表</returns> 
public static string[] GetHtmlImageUrlList(string sHtmlText)
{
    // 定義正規表示式用來匹配 img 標籤 
    Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
    // 搜尋匹配的字串 
    MatchCollection matches = regImg.Matches(sHtmlText);
    int i = 0;
    string[] sUrlList = new string[matches.Count];
    // 取得匹配項列表 
    foreach (Match match in matches)
        sUrlList[i++] = match.Groups["imgUrl"].Value;
    return sUrlList;
}

相關文章