2015-08-21 128 views
4

什麼是下面的.NET正則表達式轉換PHP正則表達式.NET

preg_replace("/\(([^()]*+|(?R))*\)/","", $string); 

我總是用正則表達式的鬥爭等同,我試圖得到它的權利與myregextester.com,我只是不能得到正確的語法,所以事實證明這個..

1.0 (Mac OS X Mail 9.0 \(3083\)) 

進入

1.0 

我想去掉註釋(即使嵌套)

我正在使用它,但它不適用於嵌套註釋。

Dim regex As New Regex(String.Format("\{0}.*?\{1}", "(", "(")) 
Return regex.Replace(s, String.Empty) 
+2

很抱歉,爲什麼你不使用這個:'\ s * \(。* \)' – d0nut

+1

你想匹配平衡圓括號嗎? –

+1

*在[Friedl的書p436]中匹配嵌套結構*(https://books.google.com/books?id=P5UXAwAAQBAJ&lpg=PA328&ots=HAjQ68fgTv&hl=zh-CN&dq=mastering%20regular%20expressions%20nested%20constructs&pg=PA436#v=onepage&q =(匹配%20Nested%20Constructs&f = false):'\((?> [^()] + | \((?)| \)(?<-DEPTH>))*(?(DEPTH)(?!) ' –

回答

2

正在考慮的正則表達式是一個匹配平衡括號的PCRE正則表達式。在.NET匹配的括號,你可以使用this regex

\((?>(?:[^()])+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\) 

VB.NET實現:

Dim R As Regex = New Regex(" \(     " & _ 
         " (?>    " & _ 
         "  [^()]+   " & _ 
         "  |    " & _ 
         "  \((?<DEPTH>) " & _ 
         "  |    " & _ 
         "  \) (?<-DEPTH>) " & _ 
         " )*     " & _ 
         " (?(DEPTH)(?!))  " & _ 
         " \)     ", _ 
    RegexOptions.IgnorePatternWhitespace) 
Dim str As String = R.Replace("1.0 (Mac OS X Mail 9.0 \(3083\))", "") 

IDEONE demo

把空格去掉,只需添加[ ]*\s*在模式的開始。

如果你只是要刪除的最左邊和最右邊的圓括弧之間的所有字符,請使用貪婪匹配:

(?s)[ ]*\(.*\) 

或者

(?s)\p{Zs}*\(.*\) 

demo

\p{Zs}的Unicode類別類匹配任何Unicode空格,而[ ]匹配正則文字空間。請注意,\s匹配所有可能的空白,包括換行符號。

+0

我測試過「\ s * \(。* \)」和「(?s)[] * \(。* \)」他們都表現相同,在我的測試中,您能提供一個樣本,不同。 – Henry

+0

例如'\ s'可以匹配換行符,'[]'不能。 –

+0

是的,我現在可以看到,「(?s)[] *(。*)」是我正在尋找的,在這種情況下 - 我不認爲換行符是可能的,但如果它是。感謝您的教育。 – Henry

相關問題