在完整文件正则表达式中匹配A部分,但不匹配b部分

时间:2013-07-12 16:24:18

标签: java regex

我必须创建一个单一的正则表达式来搜索完整的文件,以找到与Java XML解析器的第一部分匹配的内容,但不是第二部分。这将用于防止一些XXE攻击。不幸的是, 必须是一个正则表达式而 需要搜索整个文件(而不是逐行)。

我正在搜索java文件以找到DocumentBuilderFactory,我正在寻找初始化变量然后通过下面的setFeature或setEntity运行的情况或者找到SAXParserFactory,其中变量是< em> not 运行下面的setFeature。

以下是我希望正则表达式失败的情况:

案例A(简单案例):

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
...
docBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);

案例B(多行):

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
.newInstance();
...
docBuilderFactory
.setExpandEntityReferences(false);

案例C(使用SAXParser而不是DocumentBuilder):

SAXParserFactory spf = SAXParserFactory.newInstance();
...
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);

重申一下,我希望正则表达式找到DocumentBuilderFactory或SAXParserFactory后面没有setFeature或setExpandEntity的情况。

这是我到目前为止所做的(格式化为希望稍微好一点的理解):

DocumentBuilderFactory (\w+).*=.*DocumentBuilderFactory
[\n|\r]?.*?
\.
[\n|\r]?.*?
newInstance\(\)
(?>.|\n|\r)*
(\1[\n|\r]?.*?\.[\n|\r]?.*?setExpandEntityReferences\(false\)
|\1[\n|\r]?.*?\.[\n|\r]?.*?setFeature\("http://xml.org/sax/features/external-general-entities", false\)
|\1[\n|\r]?.*?\.[\n|\r]?.*?setFeature\("http://apache.org/xml/features/disallow-doctype-decl", false\)).*

|SAXParserFactory (\w+).*=.*SAXParserFactory
[\n|\r]?.*?
\.
[\n|\r]?.*?
newInstance\(\)
(?>.|\n|\r)*
(\1[\n|\r]?.*?\.[\n|\r]?.*?setFeature\("http://xml.org/sax/features/external-general-entities", false\)
|\1[\n|\r]?.*?\.[\n|\r]?.*?setFeature\("http://apache.org/xml/features/disallow-doctype-decl", false\)).*

我在制作这些setFeatures时遇到困难,以至于找不到它们,我很确定根本没有看到setFeatures。

1 个答案:

答案 0 :(得分:2)

当您在单个全局正则表达式中添加必须执行的限制时,这是一个棘手的问题,但只要您设置,我就可以使用以下内容。匹配换行符:

(?:DocumentBuilderFactory|SAXParserFactory)[\s\r\n]+?(\w+)[\s\r\n]*?=[\s\r\n]*?(?:DocumentBuilderFactory|SAXParserFactory)[\.\r\n]+newInstance(?!.*\1(?=[\.\r\n]+(:?setFeature|setExpandEntity)))

我能找到的唯一方法是在负向前瞻中放一个正面的前瞻,这可能不被某些引擎支持,而且运行速度很慢。