- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
使用 C# 正则表达式匹配并返回从字符串解析的数据会返回不可靠的结果。
我使用的模式如下:
Regex r=new Regex(
@"(.*?)S?(\d{1,2})E?(\d{1,2})(.*)|(.*?)S?(\d{1,2})E?(\d{1,2})",
RegexOptions.IgnoreCase
);
以下是几个失败的测试用例
Ellen 2015.05.22 Joseph Gordon Levitt [REPOST]
The Soup 2015.05.22 [mp4]
Big Brother UK Live From The House (May 22, 2015)
应该返回
Ellen
)2015.05.22
)Joseph Gordon Levitt [REPOST]
)Alaskan Bush People S02 Wild Times Special
应该返回
Alaskan Bush People
)02
)Wild Times Special
)500 Questions S01E03
应该返回
500 个问题
)01
)03
)工作并返回正确数据的示例
Boyster S01E13 – E14
Mysteries at the Museum S08E08
Mysteries at the National Parks S01E07 – E08
The Last Days Of… S01E06
Born Naughty? S01E02
Have I Got News For You S49E07
看起来,模式忽略 S 和 E(如果未找到),然后使用第一组匹配数字填充该槽。
很明显,此模式需要做更多工作才能处理上述可变字符串。非常感谢您在此问题上的协助。
最佳答案
您试图用一个简单的表达式解析太多内容。那不会很好地工作。在这种情况下,最好的方法是将问题分成更小的问题,然后分别解决每个问题。然后,我们可以稍后将所有内容组合成一个模式。
让我们为要提取的数据编写一些模式。
季/集:
S\d+(?:E\d+(?:\s*\p{Pd}\s*E\d+)?)?
我使用 \p{Pd}
而不是 -
来适应任何破折号类型。
日期:
\d{4}\.\d{1,2}\.\d{1,2}
或者...
(?i:January|February|March|April|May|June|July|August|September|October|November|December)
\s*\d{1,2},\s*\d{4}
为额外信息写一个简单的模式:
.*?
(是的,这很普通)
我们还可以像这样检测显示格式:
\[.*?\]
您可以根据需要添加其他部分。
现在,我们可以将所有内容放入一个模式中,使用组名来提取数据:
^\s*
(?<name>.*?)
(?<info> \s+ (?:
(?<episode>S\d+(?:E\d+(?:\s*\p{Pd}\s*E\d+)?)?)
|
(?<date>\d{4}\.\d{1,2}\.\d{1,2})
|
\(?(?<date>(?i:January|February|March|April|May|June|July|August|September|October|November|December)\s*\d{1,2},\s*\d{4})\)?
|
\[(?<format>.*?)\]
|
(?<extra>(?(info)|(?!)).*?)
))*
\s*$
只需忽略 info
组(它用于 extra
中的条件,这样 extra
就不会消耗应该属于的部分节目名称)。你可以获得多个 extra
信息,所以只需将它们连接起来,在每个部分之间留一个空格。
示例代码:
var inputData = new[]
{
"Boyster S01E13 – E14",
"Mysteries at the Museum S08E08",
"Mysteries at the National Parks S01E07 – E08",
"The Last Days Of… S01E06",
"Born Naughty? S01E02",
"Have I Got News For You S49E07",
"Ellen 2015.05.22 Joseph Gordon Levitt [REPOST]",
"The Soup 2015.05.22 [mp4]",
"Big Brother UK Live From The House (May 22, 2015)",
"Alaskan Bush People S02 Wild Times Special",
"500 Questions S01E03"
};
var re = new Regex(@"
^\s*
(?<name>.*?)
(?<info> \s+ (?:
(?<episode>S\d+(?:E\d+(?:\s*\p{Pd}\s*E\d+)?)?)
|
(?<date>\d{4}\.\d{1,2}\.\d{1,2})
|
\(?(?<date>(?i:January|February|March|April|May|June|July|August|September|October|November|December)\s*\d{1,2},\s*\d{4})\)?
|
\[(?<format>.*?)\]
|
(?<extra>(?(info)|(?!)).*?)
))*
\s*$
", RegexOptions.IgnorePatternWhitespace);
foreach (var input in inputData)
{
Console.WriteLine();
Console.WriteLine("--- {0} ---", input);
var match = re.Match(input);
if (!match.Success)
{
Console.WriteLine("FAIL");
continue;
}
foreach (var groupName in re.GetGroupNames())
{
if (groupName == "0" || groupName == "info")
continue;
var group = match.Groups[groupName];
if (!group.Success)
continue;
foreach (Capture capture in group.Captures)
Console.WriteLine("{0}: '{1}'", groupName, capture.Value);
}
}
这个的输出是...
--- Boyster S01E13 - E14 ---
name: 'Boyster'
episode: 'S01E13 - E14'
--- Mysteries at the Museum S08E08 ---
name: 'Mysteries at the Museum'
episode: 'S08E08'
--- Mysteries at the National Parks S01E07 - E08 ---
name: 'Mysteries at the National Parks'
episode: 'S01E07 - E08'
--- The Last Days Ofâ?¦ S01E06 ---
name: 'The Last Days Ofâ?¦'
episode: 'S01E06'
--- Born Naughty? S01E02 ---
name: 'Born Naughty?'
episode: 'S01E02'
--- Have I Got News For You S49E07 ---
name: 'Have I Got News For You'
episode: 'S49E07'
--- Ellen 2015.05.22 Joseph Gordon Levitt [REPOST] ---
name: 'Ellen'
date: '2015.05.22'
format: 'REPOST'
extra: 'Joseph'
extra: 'Gordon'
extra: 'Levitt'
--- The Soup 2015.05.22 [mp4] ---
name: 'The Soup'
date: '2015.05.22'
format: 'mp4'
--- Big Brother UK Live From The House (May 22, 2015) ---
name: 'Big Brother UK Live From The House'
date: 'May 22, 2015'
--- Alaskan Bush People S02 Wild Times Special ---
name: 'Alaskan Bush People'
episode: 'S02'
extra: 'Wild'
extra: 'Times'
extra: 'Special'
--- 500 Questions S01E03 ---
name: '500 Questions'
episode: 'S01E03'
关于c# - 正则表达式模式与某些节目标题不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30411174/
我有一个加号/减号按钮,希望用户不能选择超过 20 个但不知道如何让它工作。我尝试使用 min="1"max="5 属性,但它们不起作用。这是我的代码和一个 fiddle 链接。https://jsf
我正在尝试复制顶部底部图,如示例 here但它没有正确渲染(紫色系列有 +ve 和 -ve 值,绿色为负值)留下杂乱的人工制品。我也在努力创建一个玩具示例来复制这个问题,所以我希望尽管我缺乏数据,但有
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 6 年前。 社区去年审查了是
这个问题在这里已经有了答案: Adding two positive integers gives negative answer.Why? (4 个答案) 关闭 5 年前。 我遇到了一个奇怪的问题
有谁知道如何将字符串值类型 -4,5 或 5,4 转换为 double -4.5 或 5.4? 最佳答案 只需使用 Double.parseDouble(Locale, String); 糟糕,我很困
我正在尝试根据 TextBlob 分类插入一个仅包含“正”或“负”字符串的新数据框列:对于我的 df 的第一行,结果是 ( pos , 0.75, 0.2499999999999997)我想要' 正
我对 VBA 非常陌生,无法理解如何在一个循环中完成 2 个任务。我非常感谢您的帮助。 我已经能够根据第 3 列中的数据更改第 2 列中的数值,但我不明白如何将负值的字体更改为红色。 表格的大小每月都
欢迎, 我正在使用 jquery 通过 POST 发送表单。 这就是我获得值(value)的方式。 var mytext = $("#textareaid").val(); var dataStrin
double d = 0; // random decimal value with it's integral part within the range of Int32 and always p
我有这个字符串: var a='abc123#xyz123'; 我想构建 2 个正则表达式替换函数: 1) 用 '*' 替换所有确实有 future '#'的字符(不包括'#') 所以结果应该是这样的
我正在使用 DialogFragment。当用户从 Gmail 平板电脑应用程序的屏幕与下面示例图片中的编辑文本进行交互时,我希望正面和负面按钮保持在键盘上方。 在我的尝试中不起作用,这是我的 Dia
从组装艺术一书中,我复制了这句话: In the two’s complement system, the H.O. bit of a number is a sign bit. If the H.O
是否有更好更优雅的方法来实现下面的简单代码(diffYear、A 和 B 是数字): diffYear = yearA - yearB; if (diffYear == 0) { A = B
我正在设计一种语言,并尝试确定 true 应该是 0x01 还是 0xFF。显然,所有非零值都将转换为 true,但我正在尝试确定确切的内部表示。 每种选择的优点和缺点是什么? 最佳答案 没关系,只要
在我的 dialogfragment 类的 OnCreateDialog 中,我正在这样做: AlertDialog.Builder builder = new AlertDialog.Builder
这个问题在这里已经有了答案: Resolving ambiguous overload on function pointer and std::function for a lambda usin
我偶然发现了一个奇怪的 NSDecimalNumber 行为:对于某些值,调用 integerValue、longValue、longLongValue 等,返回意想不到的值(value)。示例: l
这个问题在这里已经有了答案: Resolving ambiguous overload on function pointer and std::function for a lambda using
我有这个正则表达式来测试用户输入是否有效: value.length === 0 || value === '-' || (!isNaN(parseFloat(value)) && /^-?\d+\.
我想用高斯混合模型拟合数据集,数据集包含大约 120k 个样本,每个样本有大约 130 个维度。当我使用 matlab 执行此操作时,我运行脚本(簇号为 1000): gm = fitgmdist(d
我是一名优秀的程序员,十分优秀!