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