将perl正则表达式转换为Java

时间:2014-10-29 09:38:43

标签: java regex perl

我有一块正则表达式,我一直在使用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,     

只有"创建程序"线应匹配。

3 个答案:

答案 0 :(得分:1)

转换器工作得很好,但你需要改变一些事情。

/create\\s+(proc(edure)?|function)\\s+\\[*(dbo)?\\]*\\.*\\[*(\\w+)/i
  1. Java没有像perl和amp;中那样的内联正则表达式。 JavaScript的。您需要使用Pattern& Matcher正则表达式支持的API。
  2. 由于缺少内联正则表达式,模式修饰符与flags分开完成。
  3. 应用第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 \必须使用另一个\来进行转义以逃避正则表达式语法(太多逃避!)

DEMO

答案 2 :(得分:0)

JRegex project(我既不隶属于也不是用户)可能会让您感兴趣。它声称提供了一个Java库来处理perl正则表达式。