2011-08-19 146 views
3

我有我的正則表達式以下條件: 當字符串不爲空,應該包含單詞「內部」正則表達式:如何使有條件的正則表達式

所以,換句話說:

"<link linktype='internal' id='{F88AE8AE-69C4-4E31-95BF-73B110FEE63A}' />" --> OK 
"<link linktype='external' id='{F88AE8AE-69C4-4E31-95BF-73B110FEE63A}' />" --> NOK 
"test" --> NOK 
"" --> OK 

我知道一個空字符串可以檢查:^$
或非空字符串:^\s*\S
和我的內部檢查簡稱爲:linktype=\'internal\'(例如)

把它們放在一起是很難的部分。我一直停留在這一點,但預期它不能做:

(?(?=^\s*\S)linktype=\"internal\"|^$) 

誰能幫助?

+0

是否需要做正則表達式? – luketorjussen

+0

是的,它是該軟件包中唯一可能的方法 –

+0

您正在使用C#,您可以像@Vache所建議的那樣輕鬆完成 – luketorjussen

回答

1

你可以嘗試什麼(^$)|(^.*linktype=\"internal\".*$)

無論是空字符串,或與文本linktype="internal"的字符串。

+0

這可能對我來說足夠好,但我仍然想知道應該如何做一個條件表達式和表達式。 –

+0

這是一個有條件('|'是一個「或」),但也使用捕獲,這需要RE做更多的工作。你可能想要一個非捕獲組(即以'(?:'而不是'(')開始),如果字符串必須在任何地方包含「內部」檢查,則不需要第二組中的錨:'(?:^ $)|(?:linktype = \「internal \」)' –

+0

另外,如果「linktype」可能有雙引號或單引號,那麼您必須再次修改;第二組:「(?:linktype = ['\「] internal ['\」])'。 –

2

既然你提到C#,你不妨試試這個:

if(str.Length == 0 || str.Contains("internal")) 

它的工作原理,它的簡單。

+0

如果沒有正則表達式答案出現,我必須做類似於通過將它耦合到我的項目,但我猜正則化應該是由此。 –

+2

哦,你可以用正則表達式,但你必須問自己,如果你應該;) – Vache

+0

@Vache,我完全同意: - )像正則表達式一樣強大,喲你還需要看看你的代碼的可讀性。我可以看看這個答案,並確切知道它做了什麼,這不是正則表達式答案的情況。 – luketorjussen

0

關於類似

(^$)|(^.*linktype=\"internal\".*$) 

--Tomas

0

這樣的事情應該這樣做:

^.*linktype='(internal|)'.*$ 
1

在這種特殊情況下,你可以使用:

^(.*linktype=['"]internal['"].*)?$ 

否則,很容易分開寫每種情況下的正則表達式,然後附上它們在括號中並使用'或'將它們包括在單個表達式中:

(^$)|(^.*linktype=['"]internal['"].*$) 

這將m無論是^$還是^.*linktype=['"]internal['"].*$

0
"<link linktype='internal' id='{F88AE8AE-69C4-4E31-95BF-73B110FEE63A}' />" --> OK 
"<link linktype='external' id='{F88AE8AE-69C4-4E31-95BF-73B110FEE63A}' />" --> NOK 
"test" --> NOK 
"" --> 

如果LINKTYPE =「內部」匹配你並不真正關心的是什麼之前和之後LINKTYPE =「內部」,你無論如何都會得到一個匹配:

(^$)|(linktype='internal') 
0

也許我應該添加我自己的答案。到目前爲止的答案已經使用了成本稍高的捕獲組。到與非捕獲組使用的「或」條件:

(?:^$)|(?:linktype=['\"]internal['\"]) 

無需用於對所述第二部分通過定義一個錨RE將在不錨定字符串內的任何位置相匹配。

此外,要在RE中使用「and」條件,只需將規則連接在一起即可。這就是上面的RE實際上是如何形成的。這是(錨開始和錨固端)OR(一lin ...和字符集['「]和i AND ...等...)

0
string regex = "^(?:\\n|.*linktype=([\'\"])internal\\1.*\\n)"; 
var options = RegexOptions.Multiline); 
var reg = new Regex(regex, options);