让我们从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;。它可以用一两件提取,但最好是一件。
任何想法???
答案 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
替换为不那么贪婪的内容。