Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式:XPATH字符串是否指向属性?_Regex_Xpath_Attributes - Fatal编程技术网

Regex 正则表达式:XPATH字符串是否指向属性?

Regex 正则表达式:XPATH字符串是否指向属性?,regex,xpath,attributes,Regex,Xpath,Attributes,我使用的是:“.+/@[^/]+$”。你能想一个为什么这可能不起作用的原因吗?这实际上是一个非常微妙的问题,我认为这是一个很好的问题 我的理解是,(缩写的)XPATH指向一个属性,当且仅当它的最后一个@不在谓词中时,也就是说,它的形式是[…],后面没有任何步骤(比如/…)。我认为它有一个相对简单的正则表达式@[^]/]*$,也就是说,必须有一个@后面没有]或/的正则表达式。另外,如果您想涵盖未命名的XPath,可以使用(@|属性::)[^]/]*$ 我已经包括了一个测试线束,它可能在检查这个或其

我使用的是:“.+/@[^/]+$”。你能想一个为什么这可能不起作用的原因吗?

这实际上是一个非常微妙的问题,我认为这是一个很好的问题

我的理解是,(缩写的)XPATH指向一个属性,当且仅当它的最后一个
@
不在谓词中时,也就是说,它的形式是
[…]
,后面没有任何步骤(比如
/…
)。我认为它有一个相对简单的正则表达式
@[^]/]*$
,也就是说,必须有一个
@
后面没有
]
/
的正则表达式。另外,如果您想涵盖未命名的XPath,可以使用
(@|属性::)[^]/]*$

我已经包括了一个测试线束,它可能在检查这个或其他测试时被证明是有用的。还要注意,标记之间可能有空格,这会使某些正则表达式复杂化

肯定的(属性)
  • @*
    @a
    。/@a
    a/@b
  • a[@b和@c]/@d
  • a[b[@c=“d”]/e[@f和@g]]/h[@i=“j”]/@k
否定(不是属性)
  • a[@b]
    a[@b和@c]
  • a[b[@c和@d]/@e]
  • a[b[@c=“d”]/e[@f和@g]]/h[@i=“j”]/k[5][@l=“m”]
我想不出在最后一个例子之后有
/
但没有
]
的法律例子,但我认为可能有一个

希望这些示例至少能清楚地表明,
[
]
以及
@
之间的任意嵌套。幸运的是,我认为只有最后一个
@
及其嵌套级别才重要

(作为参考,OP的正则表达式在
@a
上失败。我原来的正则表达式在
a[@b和@c]
上失败)


编辑:事实证明,有更多的角情况,这让我确信,没有完全正确的正则表达式。例如,一旦有了属性节点,就有许多方法可以保留它,例如缩写语法中的
/@a//
/@a/
。还有多种更具创造性的方法,例如
/@f//[node()]
。总而言之,如果您想涵盖这些情况,您需要能够匹配
[
]
,而这是基本正则表达式无法做到的。另一方面,你可能会觉得这太做作了…

我认为它对选择上下文节点的“attr”属性的
@attr
不起作用。哦,很好的工作。这是两个完美的边缘案例供我思考。谢谢这在简单的情况下是失败的:
@*[name()!='foo]
@a[祖先::p]
@Tomalak:当然,你是对的。我坚持我的观点,事实上没有正则表达式可以工作,因为它必须跟踪嵌套。。。