我有一块正则表达式,我一直在使用Perl来解析包含Oracle数据库中每个存储过程的大型文本文件。它看起来像这样:
/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,
只有"创建程序"线应匹配。
答案 0 :(得分:1)
转换器工作得很好,但你需要改变一些事情。
/create\\s+(proc(edure)?|function)\\s+\\[*(dbo)?\\]*\\.*\\[*(\\w+)/i
应用第1步(删除前置/
和附加/
)和第2步(将/i
替换为Pattern.CASE_INSENSITIVE
),您会得到以下内容:
Pattern p = Pattern.compile("create\\s+(proc(edure)?|function)\\s+\\[*(dbo)?\\]*\\.*\\[*(\\w+)", Pattern.CASE_INSENSITIVE);
boolean matches = p.matcher(str).matches();
答案 1 :(得分:0)
试试这个:
"create\\s+((procedure)?|(function))?\\s+\\([(dbo)?\\]\\.\\[)?(\\w+)"
它应该可以工作,但如果你需要匹配一些,你需要添加大写,或者在你的正则表达式中添加一个“i”标志来忽略大小写。
在Java中,ecape character \必须使用另一个\来进行转义以逃避正则表达式语法(太多逃避!)
答案 2 :(得分:0)
JRegex project(我既不隶属于也不是用户)可能会让您感兴趣。它声称提供了一个Java库来处理perl正则表达式。