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