环境是Java 8,Saxon 9.8处理器,XSL样式表版本3,从Eclipse运行。
在样式表中给出以下xslt命令:
<xsl:variable name="output"
select="fn:replace($inputstring,
'^.*exec\s+sp_prepexec.+?N'([^@](?:[^'']|'''')+)''.*$', '$1', 'ism;j')" />
生成堆栈跟踪:
net.sf.saxon.trans.XPathException: Invalid character '^' in expression
at net.sf.saxon.expr.parser.XPathParser.grumble(XPathParser.java:281)
at net.sf.saxon.expr.parser.XPathParser.grumble(XPathParser.java:238)
at net.sf.saxon.expr.parser.XPathParser.grumble(XPathParser.java:225)
at net.sf.saxon.expr.parser.XPathParser.nextToken(XPathParser.java:196)
at net.sf.saxon.expr.parser.XPathParser.parseDynamicFunctionCall(XPathParser.java:2358)
at net.sf.saxon.expr.parser.XPathParser.parseStepExpression(XPathParser.java:1974)
...
at org.eclipse.wst.xsl.jaxp.debug.invoker.internal.Main.main(Main.java:72)
我没有找到任何线索,为什么在这个表达式中不允许插入符号 - 你能支持我调试吗? 我想知道转义是否是一个问题,在上面的代码行中,我在表达式中加倍了单个撇号,也尝试使用&#39;,但它始终是相同的错误消息。 根据标志我假设Saxon将使用Java正则表达式解析器,但返回的堆栈跟踪不会显示。
这是我要处理的输入字符串的示例:
declare @p1 int
set @p1=328
exec sp_prepexec @p1 output,N'@P1 int,@P2 char(1),@P3 char(1)',N'SELECT "Tbl1009"."RUN_NO" "Col1111","Tbl1009"."DEP_ID" "Col1114" FROM "run" "Tbl1009" WHERE @P1="Tbl1009"."RUN_ID" AND ("Tbl1009"."Profile_ID"=(1) AND @P2=''N'' OR "Tbl1009"."Profile_ID"=(5) AND @P3=''Y'') AND ("Tbl1009"."Profile_ID"=(1) OR "Tbl1009"."Profile_ID"=(5))',150,'N','N'
select @p1
和所需的输出:
SELECT "Tbl1009"."RUN_NO" "Col1111","Tbl1009"."DEP_ID" "Col1114" FROM "run" "Tbl1009" WHERE @P1="Tbl1009"."RUN_ID" AND ("Tbl1009"."Profile_ID"=(1) AND @P2=''N'' OR "Tbl1009"."Profile_ID"=(5) AND @P3=''Y'') AND ("Tbl1009"."Profile_ID"=(1) OR "Tbl1009"."Profile_ID"=(5))
答案 0 :(得分:3)
@WillBarnwell有正确的诊断,但错误的解决方案。 '
的问题不在于它在正则表达式中是特殊的,问题是它在XPath中很特殊,所以你需要使用XPath级别的转义,而这样做的方法是把它写成两个撇号。这可能会让人感到非常困惑,所以最好的办法是将正则表达式移动到一个用内容定义的变量:
<xsl:variable name="regex" as="xs:string"
>^.*exec\s+sp_prepexec.+?N'([^@](?:[^']|'')+)'.*$</xsl:variable>
<xsl:variable name="output"
select="fn:replace($inputstring, $regex, '$1', 'ism;j')" />
(仔细检查,因为我不确定我是否完全理解你的意图)。
答案 1 :(得分:2)
语法错误,你的正则表达式以第一个未转义的单引号结束,并被解释为^.*exec\s+sp_prepexec.+?N
然后是([^
,其中^
是第一个非法字符。请注意,错误源自XML解析器,而不是正则表达式引擎。
使用\'
转义单引号并不是解决此问题的方法,因为@ Michael-Kay表明它是在变量中定义你的正则表达式。