为什么插入符号在此正则表达式中是非法字符?



环境是Java 8,Saxon 9.8处理器,XSL样式表版本3,从Eclipse运行。

给定样式表中的以下 xslt 命令:

<xsl:variable name="output" 
select="fn:replace($inputstring, 
'^.*execs+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)

我没有找到任何线索,为什么该表达式中不允许使用插入符号 - 你能支持我调试这个吗? 我想知道转义是否是一个问题,在上面的代码行中,我在表达式中加倍了单撇号,也尝试了',但它总是相同的错误消息。 从标志中给出,我假设 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))

@WillBarnwell有正确的诊断,但有错误的解决方案。'的问题不在于它在正则表达式中很特殊,问题在于它在 XPath 中很特殊,所以你需要使用 XPath 级别的转义,而做到这一点的方法是将其写成两个撇号。这可能会变得非常令人困惑,所以最好的办法通常是将正则表达式移动到用内容定义的变量:

<xsl:variable name="regex" as="xs:string"
>^.*execs+sp_prepexec.+?N'([^@](?:[^']|'')+)'.*$</xsl:variable>
<xsl:variable name="output" 
select="fn:replace($inputstring, $regex, '$1', 'ism;j')" />

(仔细检查,因为我不确定我是否完全理解您的意图)。

语法错误,您的正则表达式以第一个未转义的单引号结尾,并被解释为^.*execs+sp_prepexec.+?N然后是([^^是第一个非法字符。请注意,错误源自 XML 解析器,而不是正则表达式引擎。

'转义单引号不是解决这个问题的方法,正如 @Michael-Kay 所示,它是在变量中定义您的正则表达式。

最新更新