2014-10-29 54 views
0

我有一段正在使用的Perl來解析包含Oracle數據庫中每個存儲過程的大型文本文件。它看起來像這樣:將perl正則表達式轉換爲Java

/create\s+(proc(edure)?|function)\s+\[*(dbo)?\]*\.*\[*(\w+)/i 

雖然我不太熟悉Perl,所以理想情況下將它轉換爲Java。我試過通過一些轉換器運行它,它會產生:

"/create\\s+(proc(edure)?|function)\\s+\\[*(dbo)?\\]*\\.*\\[*(\\w+)/i" 

但是,這似乎不符合任何正確的輸入。任何人都可以給我一些指針,正確地將其轉換爲Java?

樣本數據:

SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE AddNewTc      

@TCN NVARCHAR(100),     
@TCM NTEXT,     
@TCOLE IMAGE = NULL,     
@BYSPID INT = 0,  

只有 「CREATE PROCEDURE」 行應匹配。

+0

你能否添加預期的輸入/輸出來幫助我們翻譯這個正則表達式?我不知道Perl ReGex的語法,所以這可能會有所幫助 – Supamiu 2014-10-29 09:43:08

+0

你有雙斜槓嗎? java字符串斜槓需要轉義 – 2014-10-29 09:43:40

+0

@ J-16SDiZ:我做到了,但是在後臺,我們正在玩這兩個正則表達式。我不知道如何解決它。 – 2014-10-29 09:46:58

回答

0

試着用這一個:

"create\\s+((procedure)?|(function))?\\s+\\([(dbo)?\\]\\.\\[)?(\\w+)" 

它應該工作,但您需要添加上情況下,如果你需要匹配一些,或者添加一個「我」標誌的正則表達式忽略大小寫。

在Java中

,ecape字符\必須用另一個\轉義在正則表達式語法逃脫(太多逃脫!)

DEMO

+0

我認爲你遇到了我遇到的問題。沒有顯示在SO上添加額外的斜線。 – 2014-10-29 10:00:15

+0

哦,實際上我輸入了它們,但是需要添加一個代碼區域來顯示它們,現在要修復它 – Supamiu 2014-10-29 10:17:24

1

轉換器工作得很好,但你會需要改變一對夫婦東西的。

/create\\s+(proc(edure)?|function)\\s+\\[*(dbo)?\\]*\\.*\\[*(\\w+)/i 
  1. Java沒有直列正則表達式就像你在Perl &的JavaScript做。您需要使用Pattern & Matcher API來獲得正則表達式支持。
  2. 由於缺乏內聯正則表達式,模式修飾符與flags分開完成。

應用步驟1中(除去預謀/和附加/)和步驟2(更換/iPattern.CASE_INSENSITIVE),你會得到這樣的:

Pattern p = Pattern.compile("create\\s+(proc(edure)?|function)\\s+\\[*(dbo)?\\]*\\.*\\[*(\\w+)", Pattern.CASE_INSENSITIVE); 
boolean matches = p.matcher(str).matches(); 
+0

'find()'在這裏更合適。 – nhahtdh 2014-10-29 10:47:24

0

JRegex project(這我既不隸屬於也沒有成爲用戶)可能會對你感興趣。它聲稱提供了一個Java庫來處理perl正則表達式。

相關問題