簡體   English   中英

如何用正則表達式匹配此字符串?

[英]How to match this strings with Regex?

基本上我有音樂文件名,例如:

<source> <target>

"Travis - Sing"   "Travis - Sing 2001.mp3"
"Travis - Sing"   "Travis - Sing Edit.mp3"
"Travis - Sing"   "Travis - Sing New Edit.mp3"
"Mission Impossible I"   "Mission Impossible I - Main Theme.mp3"
"Mission Impossible I"   "Mission Impossible II - Main Theme.mp3"
"Mesrine - Death Instinct"   "Mesrine - Death Instinct - Le Million.mp3"
"Mesrine - Public Enemy #1"   "Mesrine - Public Enemy #1 - Theme"
"Se7en"   "Se7en Motion Picture Soundtrack - Theme.mp3"

字符串中不包括括號(僅用於演示)。

並且我正在嘗試將“源”與“目標”值進行匹配。

因此,我已經有了源名稱,但是現在我正在使用大量的字符串解析功能,以便能夠將兩者匹配。 如何使用Regex實現相同目的?

編輯:似乎有一個混亂。

"Travis - Sing"是我的源字符串,我正在嘗試將其匹配為:

"Travis - Sing (2001).mp3"
"Travis - Sing (Edit).mp3"
"Travis - Sing (New Edit).mp3"

EDIT2:刪除了括號。

似乎您正在尋找所有以特定字符串開頭的文件-這將回答所有示例。 無需使用兩個循環或使用linq的正則表達式,即可輕松實現這一點:

var matches = from source in sources
              select new
                      {
                          Source = source,
                          Targets = from file in targets
                                    where file.StartsWith(source)
                                    select file
                      };

您還可以使用正則表達式代替StartsWith條件,例如:

where Regex.IsMatch(file, String.Format("^{0}", source), RegexOptions.IgnoreCase)

這可能可以通過許多方式進行優化,但是安德魯建議編寫一個長模式,動態完成並不會很快。

從您的回答到我的評論,我很確定您正在尋找類似這樣的簡單內容。

因此,您可以將多個搜索詞用“ |”分隔。 這是一個替代結構。

class Program
{
    private static List<string> searchList = new List<string>
                                     {
                                         "Travis - Sing (2001).mp3",
                                         "Travis - Sing (Edit).mp3",
                                         "Mission Impossible I - Main Theme.mp3",
                                         "Mission Impossible II - Main Theme.mp3",
                                         "doesn't match"
                                     };

    static void Main(string[] args)
    {
        var matchRegex = new Regex("Travis - Sing|Mission Impossible I");
        var matchingStrings = searchList.Where(str => matchRegex.IsMatch(str));

        foreach (var str in matchingStrings)
        {
            Console.WriteLine(str);
        }
    }
}

編輯如果您想知道要匹配的內容,則可以添加

    static void Main(string[] args)
    {
        var matchRegex = new Regex("(?<travis>Travis - Sing)|(?<mi>Mission Impossible I)");

        foreach (var str in searchList)
        {
            var match = matchRegex.Match(str);
            if (match.Success)
            {
                if (match.Groups["travis"].Success)
                {
                    Console.WriteLine(String.Format("{0} matches against travis", str));
                }
                else if (match.Groups["mi"].Success)
                {
                    Console.WriteLine(String.Format("{0} matches against mi", str));
                }
            }
        }
    }

源和目標之間是否總是存在多個空格? 如果是這樣,則將符合以下條件:

/^(.*?)\s{2,}(.*?)$/

它基本上匹配兩個項目,一個匹配2個以上空白之間的空白,另一個匹配該空白之后的空白。 (捕獲模式使用非貪婪的.*?因此,如果有兩個以上的空格,則不會在任何一個中捕獲多余的空格。)

以下方法更加健壯(允許在源和目標之間使用不同數量的空格或連字符)。 例如,目標詞之間可能有多余的空格,但仍會匹配。

首先,確定字符串中允許用作單詞定界符的字符。 然后使用分隔符將源字符串和目標字符串拆分為標記。 然后檢查是否在您的來源中找到了單詞作為開始單詞。

例如(Java),我使用空格和連字符作為分隔符

public boolean isValidMatch(String source, String target){
    String[] sourceTokens = source.split("[\\s\\-]+");  // split on sequence of 
    //whitespaces or dashes. Two dashes between words will still split 
    //same as one dash.

    String[] targetTokens = target.split("[\\s\\-]+"); // split similarly
    if(sourceTokens.length>targetTokens.length){
        return false;
    }

    for(int i=0;i<souceTokens.length;i++){
        if(!sourceTokens[i].equals(targetTokens[i])){
            return false;
        }
    }
    return true;
}

PS:您可能要添加點“。” 如果您有源“ Hello World”和目標“ Hello World.mp3”,請將該字符用作分隔符; 當前它不匹配,因為正則表達式不會在點上分割,但是如果您將定界符集擴展為包括點,那么它將匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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