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