2008-10-16 119 views
4

我創建了以下正則表達式模式,試圖匹配以「PRI」或「SEC」結尾的長度爲6個字符的字符串,除非字符串=「SIGSEC」。例如,我想匹配ABCPRI,XYZPRI,ABCSEC和XYZSEC,但不匹配SIGSEC。只有在前面沒有特定字符的情況下,我如何匹配部分字符串?

(\w{3}PRI$|[^SIG].*SEC$) 

這是非常接近和排序作品(如果我通過在「SINSEC」,它返回的「南北經濟走廊」部分匹配),但我沒有在其目前的形式,關於它的美好的感覺。另外,我可能需要在「SIG」之後添加更多排除,並意識到這可能不會太好。有任何想法嗎?

順便說一句,我使用System.Text.RegularExpressions.Regex.Match()在C#

感謝, 豐富

回答

6

假設你的正則表達式引擎支持的負面向前看符號,試試這個:

((?!SIGSEC)\w{3}(?:SEC|PRI)) 

編輯:一位評論者指出,.NET確實支持負向預測,所以這應該很好(謝謝,查理)。

+0

.NET正則表達式支持負向lookaheads,所以這將工作 – Charlie 2008-10-16 02:54:00

+0

啊,很高興知道,謝謝查理。我真的不是一個.NET的傢伙;) – Dan 2008-10-16 02:54:07

+0

這完美的作品丹,謝謝!做一個快速測試,添加額外的排除比賽將是微不足道的。 – Rich 2008-10-16 02:58:02

0

我個人傾向於使用第二個變量構建排除列表,然後將其包含到完整表達式中 - 這是我在過去需要構建任意複雜表達式時使用的方法。

喜歡的東西exclude = 'someexpression'; prefix = 'list of prefixes'; suffix = 'list of suffixes'; expression = '{prefix}{exclude}{suffix}';

0

「有些人,當遇到一個問題,認爲‘我知道,我將使用正則表達式。’現在他們有兩個問題。「 - 賈米Zawinski

0

你甚至可能不想要在正則表達式中排除。例如,如果這是Perl的(我不知道C#,但你或許可以跟着),我會做這樣

if (($str =~ /^\w{3}(?:PRI|SEC)$/) && ($str ne 'SIGSEC')) 

予以明確。它做你想要什麼:

  • 三個單詞字符,然後PRI或SEC和
  • 這不是SIGSEC

沒有人說你必須一切強行進入一個正則表達式。

1

你可以試試這個:

@"\w{3}(?:PRI|(?<!SIG)SEC)" 
  • 匹配3 「字」 字
  • 匹配PRI或美國證券交易委員會(但不是SIG即SIGSEC被排除後)(<?!X)Y - 是負回顧後(這符合項目Ÿ如果它不是用X之前)

此外,我可能需要增加更多的 排除除了「SIG」後來和 意識到,這可能不能擴展 太好

使用我的代碼,你可以輕鬆地添加另一個例外,例如下面的代碼排除SIGSEC和FOOSEC

@"\w{3}(?:PRI|(?<!SIG|FOO)SEC)" 
2

爲了幫助打破丹(正確)的答案,這裏是它的工作原理是:

(   // outer capturing group to bind everything 
(?!SIGSEC) // negative lookahead: a match only works if "SIGSEC" does not appear next 
\w{3}  // exactly three "word" characters 
(?:  // non-capturing group - we don't care which of the following things matched 
    SEC|PRI // either "SEC" or "PRI" 
) 
) 

一起:(?!(SIGSEC)\ w {3}(?: SEC | PRI))

1

爲什麼不使用更多可讀代碼?在我看來這更可維持。

private Boolean HasValidEnding(String input) 
{ 
    if (input.EndsWith("SEC",StringComparison.Ordinal) || input.EndsWith("PRI",StringComparison.Ordinal)) 
    { 
     if (!input.Equals("SIGSEC",StringComparison.Ordinal)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

或在一行

private Boolean HasValidEnding(String input) 
{ 
    return (input.EndsWith("SEC",StringComparison.Ordinal) || input.EndsWith("PRI",StringComparison.Ordinal)) && !input.Equals("SIGSEC",StringComparison.Ordinal); 
} 

這並不是說我不使用正則表達式,但在這種情況下,我不會使用它們。

-1

去從RegExBuddy.com獲取Regexbuddy,這是一個非常簡單的工具,可以幫助你輕鬆找出最複雜的正則表達式。

相關問題