Java 要匹配和替换的正则表达式${foo};但不是",&书信电报;c:如果测试=${foo}/&燃气轮机&引用;在爪哇
尽管有人会去探索,但显而易见的问题是,是否有任何正则表达式可以匹配Java 要匹配和替换的正则表达式${foo};但不是",&书信电报;c:如果测试=${foo}/&燃气轮机&引用;在爪哇,java,regex,jsp,jakarta-ee,replace,Java,Regex,Jsp,Jakarta Ee,Replace,尽管有人会去探索,但显而易见的问题是,是否有任何正则表达式可以匹配 ${foo} 但不是 <c:if test="${foo}" /> 或 要用替换那些独立的${foo},这里foo可以是任何字符串,只要${foo}在jsp中有效 编辑: ${foo}可以在任何地方,只要替换后不违反jsp语法!这只是在jsp中防止的预防措施。我相信您可能正在尝试在支持按正则表达式查找功能的文本编辑器中编辑jsp。但是,尝试以其他方式解析JSP(比如@fge pointed)是不明智的 这
${foo}
但不是
<c:if test="${foo}" />
或
要用
替换那些独立的${foo}
,这里foo
可以是任何字符串,只要${foo}
在jsp
中有效
编辑:
${foo}
可以在任何地方,只要替换后不违反jsp
语法!这只是在jsp
中防止的预防措施。我相信您可能正在尝试在支持按正则表达式查找功能的文本编辑器中编辑jsp。但是,尝试以其他方式解析JSP(比如@fge pointed)是不明智的
这里有一个正则表达式,它将匹配${foo}
,但不匹配=“${foo}”
(?
有效地消除
或上的匹配以下正则表达式应该适用于您的示例:
\${[^}]*}(?![^<>]*>)
\${[^}]*}(?![^]*>)
现场演示:
尽管我认为对于一些罕见的病例,这可能仍然会出现假阳性。试试这个
str = str.replaceAll("(?<!<c:(if|when) test=[\"'])\\$\\{foo}", "<c:out value=\"\\${foo}\" />");
str=str.replaceAll(“(?说明
此正则表达式将找到不在
块内的裸${foo}
正则表达式:(?!(“”)\$\{[^}]*\}(?)
替换为
输入文本:${foo bar}此处有更多文本
输出文本:此处有更多文本
要处理${foo.bar}
可能位于`标记内的其他边缘情况,您可能需要使用此正则表达式
正则表达式:(?!(”)(\$\{[^}]*\})(?!”)\124;(]*\ bhref=“)(\$\{[^}]*\})(”)
替换为:$3$5
输入文本:${foo bar}此处有更多文本
输出文本:此处有更多文本
一般来说,正则表达式的功能不足以正确处理任何非普通语言,尤其是允许匹配括号、转义引号和嵌套引号的语言
您可能会在这里找到一个正则表达式,它似乎适用于大多数情况,但这可能只是意味着您还没有遇到足够聪明的攻击者
您需要对允许用户输入的内容进行更严格的限制。您不应该接受JSP代码,尝试“清理”然后执行它。您将被利用。即使Sun也无法做到这一点(请参阅:最近针对Java小程序沙箱的一连串攻击)。所以只需${foo}而不使用”
?什么时候${foo}
在其他标记的字符串中?嗯,等等,这似乎是JSP;为什么需要解析JSP?是的,但仍然是:有一个链接会很有趣,或者至少你在post@fge,我用一个链接编辑了这个问题。是的,你是对的,你的表达式无法检测到
,但仍然如此关闭!我已经很久没有写JSTL了,但是
也不会被包装在
中。你更愿意用
代替它,而不是
。因此需要一个不同的正则表达式(或者简单地说是一个不同的替换)。是的,你是对的,你的正则表达式会发现裸${foo}
,但是
此类型的可重放${foo}
将被忽略。原始示例文本中未包含该边缘大小写。请参阅解决其他边缘大小写的更新响应。
\${[^}]*}(?![^<>]*>)
str = str.replaceAll("(?<!<c:(if|when) test=[\"'])\\$\\{foo}", "<c:out value=\"\\${foo}\" />");