正则表达式与可选,懒惰,贪婪的群体

时间:2015-10-27 14:32:36

标签: regex

让我们从word文档中获取此源字符串:

A;SDLFJA;SDJFA;KSDJF;ALKSJDF SOURCE: 3 55 ASDKLFJA;KDSJF
sa;ldkjfa SOURCE: HYPERLINK "ASDLFA;SDFA;SKD" "MATCH9" 3 HYPERLINK   
"ASDLFA;SDFA;SKD" "MATCH10" 55 a;sdkfja;ksdfj;aklsdjf;lk

我正在寻找一个由文字文本组成的模式" SOURCE:"后跟一位数字,一个空格和一个2位数字。

例如,在源字符串的第一行,我想找到" SOURCE:3 55"。

现在,一些聪明的boffin决定嵌入一个1位数的超链接和另一个2位数字的超链接。第2行和第3行显示了两个嵌入的超链接。 MATCH1指的是第一个嵌入的超链接,MATCH2指的是第二个,依此类推。我无法知道在这些超链接之前会放置多少个超链接,所以我们不能假设MATCH9和MATCH10。

我要提取的文字是" 3 55"一部分。我想把它放到一个命名的小组中,我打电话给#34; KeepMe"。

我不介意使用两种不同的模式,一种用于超链接,另一种用于超链接。

这是一个适用于非超链接文本的模式:

SOURCE:\s+(?<KeepMe>\d*\s+\d*)

我得到&#34; 3 55&#34;在KeepMe组中就像我想要的那样。

我还没有能够让超链接匹配模式变得贪婪。

这是一个失败的正则表达式模式,(许多之一):

SOURCE:\s+(?<Hyperlink>HYPERLINK.*MATCH\d*\u0022\s+)??(?<KeepMe1>\d*)\s+
(?<Hyperlink>HYPERLINK.*MATCH\d*\u0022\s+)??(?<KeepMe2>\d*)

在上述模式中,我试图说:

查找文字来源:后跟一个或多个空格。 然后,可选择查找文字文本&#34; HYPERLINK后跟一些字符,然后是文字文本MATCH,后跟一些数字和双引号字符,以懒惰,非贪婪的方式,后跟一个或多个空格,接下来是我要保留的一些数字。然后,像我们刚才那样做另一个HYPERLINK模式匹配,并在此之后保留数字。

请记住,在这两种情况下,我都要提取&#34; 3 55&#34;。它可以用一两件提取,但最好是一件。

任何想法???

2 个答案:

答案 0 :(得分:0)

仅适用于超链接案例的正则表达式是:

/(?<SourceToken>SOURCE:)            # Start with a source tag
\s+                                 # Followed by whitespace
(?<HyperlinkMatchGroup>             # Save the hyperlink & match combo.
(?<Hyperlink>                       # Save the hyperlink (to be discarded)
(?<HyperlinkToken>HYPERLINK\s+)     # Hyperlinks start with the literal tag "HYPERLINK"
(?<HyperlinkText>".*?")             # Hyperlink text contained in quotes, non-greedy
\s*)                                # Followed by whitespace
*                                   # Repeating any number of times
(?<MatchToken>"MATCH\d*")           # Followed by a literal tag "MATCH" and a digit string
\s*                                 # Followed by whitespace
(?<KeepMe>\d+)                      # Finally, the match, which is just a series of digits
\s*                                 # Followed by whitespace
)+                                  # The whole hyperlink & match pair must occur at least once
/x

它可能会也可能不会涵盖您的所有案件;我没有花太多时间深入研究它。

答案 1 :(得分:0)

这应该可以解决问题:

\bSOURCE:\s+(?:HYPERLINK\s+"[^"]*"\s+"MATCH\d+"\s+)?(?<KeepMe1>\d+)\s+(?:HYPERLINK\s+"[^"]*"\s+"MATCH\d+"\s+)?(?<KeepMe2>\d+)\b

主要区别在于我将.*HYPERLINK之间的MATCH替换为不那么贪婪的内容。

小提琴:https://regex101.com/r/yE3fP4/1