[英]Regex Extract Match Groups
(50798.3第1卷,共14页113)
以上是我的剪贴板内容。 与上一个问题一样 ,我提取了50798.3第1卷(共14个),并将其保存在pdf_name和113中作为页码。 这很好。
var current_clipboard = Clipboard.GetText();
var regEx = @"^\((?<Desc>[^-]*)-page\s(?<Page>\d+)";
var match = Regex.Match(current_clipboard, regEx);
string pdf_name = match.Groups["Desc"].Value;
string pagenumber = match.Groups["Page"].Value;
现在,对于-page格式为_Page或_Pages的剪贴板内容的变体,我使用了以下内容,但它不起作用。 不工作,是指当我将MessageBox.Show用于pdf_name和pagenumber时,消息框显示空白消息。 另外,当我测试RegEx时,它显示3个组,如下所示 。 我不需要第二个比赛组。
var current_clipboard = Clipboard.GetText();
var regEx = @"^\((?<Desc>[^-]*)_pag(e|es)\s(?<Page>\d+)";
var match = Regex.Match(current_clipboard, regEx);
string pdf_name = match.Groups["Desc"].Value;
string pagenumber = match.Groups["Page"].Value;
所以,我做错了。 请帮助我将正确的值保存到pdf_name和pagenumber。
编辑#
@杰瑞
我尝试了以下版本。
var current_clipboard = Clipboard.GetText();
var regEx = @"^\((?<Desc>[^-]*)_pages?\s(?<Page>\d+)";
var match = Regex.Match(current_clipboard, regEx);
string pdf_name = match.Groups["Desc"].Value;
string pagenumber = match.Groups["Page"].Value;
MessageBox.Show(pdf_name);
MessageBox.Show(pagenumber);
不幸的是,消息框返回空白消息。
问题似乎是,由于您在页面前不再使用-
分隔符,因此最初的[^-]*
模式正在吞噬整个字符串。
如果下划线未出现在说明中,则应将[^-]*
替换为[^_]*
。 或者,使用惰性匹配: (?<Desc>.*?)
。
您正在捕获(e|es)
作为第二组。
将其更改non-capturimg group
(?:e|es)
非捕获组:(?:通常,您需要括号才能编写有意义的表达式。通常,括号捕获它们匹配的内容。非捕获组使您可以使用括号而不捕获任何内容。请注意语法与前瞻非常相似。
非捕获组模式:(?:Bob)匹配Bob,但是没有捕获Bob。
正则表达式默认情况下区分大小写,这意味着p
仅匹配p
而不匹配P
如果您需要一个不区分大小写的正则表达式,则可以使用RegexOptions.IgnoreCase
或inline修饰符(?i)
,也可以在正则表达式中使用[Pp]
,它将匹配p
或P
(但其他字母为以区分大小写的方式进行匹配。
使用该选项,带有.Match
行将更改:
var match = Regex.Match(current_clipboard, regEx, RegexOptions.IgnoreCase);
使用内联修饰符,正则表达式将更改:
var regEx = @"(?i)^\((?<Desc>[^-]*)_pag(e|es)\s(?<Page>\d+)";
对于字符类,正则表达式将更改:
var regEx = @"^\((?<Desc>[^-]*)_[Pp]ag(e|es)\s(?<Page>\d+)";
对于下一个问题,避免捕获的基本方法是使用非捕获组。 在这里,您有(e|es)
这是一个捕获组。 将其更改为(?:e|es)
:
var regEx = @"^\((?<Desc>[^-]*)_[Pp]ag(?:e|es)\s(?<Page>\d+)";
虽然确实如此,但您在这里不需要更改。 您可以使用?
量词的含义是0或1倍:
var regEx = @"^\((?<Desc>[^-]*)_[Pp]ages?\s(?<Page>\d+)";
带选项和?
示例 量词:
var current_clipboard = Clipboard.GetText();
var regEx = @"^\((?<Desc>[^-]*)_pages?\s(?<Page>\d+)";
var match = Regex.Match(current_clipboard, regEx, RegexOptions.IgnoreCase);
string pdf_name = match.Groups["Desc"].Value;
string pagenumber = match.Groups["Page"].Value;
而这里的支持该语法命名捕捉组另一个正则表达式测试仪现场。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.