gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:47:55 24 4
gpt4 key购买 nike

环境是 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)

我没有找到任何线索为什么在该表达式中不允许插入符号 - 你能支持我调试这个吗?我想知道转义是否是一个问题,在上面的代码行中,我在表达式中加倍了单撇号,也用 ' 进行了尝试,但它总是相同的错误消息。根据标志,我假设 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"
>^.*exec\s+sp_prepexec.+?N'([^@](?:[^']|'')+)'.*$</xsl:variable>

<xsl:variable name="output"
select="fn:replace($inputstring, $regex, '$1', 'ism;j')" />

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

关于java - 为什么插入符号在此正则表达式中是非法字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46333579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com