簡體   English   中英

正則表達式提取匹配組

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

http://www.rexegg.com/regex-disambiguation.html

正則表達式默認情況下區分大小寫,這意味着p僅匹配p而不匹配P 如果您需要一個不區分大小寫的正則表達式,則可以使用RegexOptions.IgnoreCase或inline修飾符(?i) ,也可以在正則表達式中使用[Pp] ,它將匹配pP (但其他字母為以區分大小寫的方式進行匹配。

使用該選項,帶有.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM