W3C:无法阅读 EBNF 的 SPARQL IRIREF 规范?
W3C: Can't read EBNF's SPARQL IRIREF specification?
(规格:https://www.w3.org/TR/sparql11-query/#rIRIREF)
根据规范,IRIREF 可以这样解析:
[139] IRIREF ::= '<' ([^<>"{}|^`\]-[#x00-#x20])* '>'
困扰我的是表达式的这一部分:
\]-[
如果我认为 \
是括号字符 class 中的转义字符(在 Perl 正则表达式中就是这种情况),那么这意味着 \
单独在 IRIREF 中不是问题,这是有效的:<http://hello\world>
那么这个范围就有这个大问题:]-[
。字符 ]
的序数值是 93,[
的序数值是 91。这意味着我们有一个无效范围:93 到 92。这在我测试的大多数正则表达式引擎中都是不允许的。
这是什么意思?
- 我是否应该将
-
视为括号字符 class 中的常规字符,那么这是无效的 IRIREF: <http://new-example.org>
。没有意义。
- 我是否应该考虑范围
]-[
为空并且此 IRIREF 有效:<http://hello[world]>
- 我认为更有可能的是范围倒置了,这不是w3c规范的问题,这意味着字符
[
、\
和]
是无效字符.这是有道理的。
这是shorthand句法糖,EBNF
准确地说,是一种超越正则表达式标准特性的句法:
这意味着 prior character class without following character class
,在此特定实例中 not certain brackets and quotes, and neither control codes from 0x00 (NUL) to 0x20 (SPC), which would otherwise be included
。
相关参考:EBNF notation used, in particular the clause A - B
. It is referred to in the first paragraph of the SPARQL grammar.
SPARQL 规范说它的语法是使用符号 defined by the XML 1.1 specification 编写的。
在该表示法中,您引用的右侧,
'<' ([^<>"{}|^`\]-[#x00-#x20])* '>'
表示
的序列
- 一个 '<' 字符
零个或多个匹配表达式 [^<>"{}|^`]-[#x00-#x20] 的字符;这是表示
的集合差异
- 由 [^<>"{}|^
\] = any character other than '<', '>', '"', '{', '}', '|', '^', '
' 或 '\' 匹配的任何字符;n.b。'\' 不是此表示法中的转义字符(它具有根本没有转义字符)
- 除[#x00-#x20]匹配的=控制字符C1区加空格
这种模式的写法有点奇怪;它同样可以写成 [^<>"{}|^`#x00-#x20];我不确定为什么编辑们会这样写。
一个'>'字符
所以一一回答你的问题:
Should I consider the - as a regular character in the bracketed character class, then this is invalid IRIREF: http://new-example.org. It makes no sense.
没有。当 A 和 B 是这种表示法中的表达式时, A - B 表示 A 语言中的任何字符串,它也不是 B 语言中的字符串。这里A和B分别是字符-class表达式,一负一正。
你是对的,从旨在接受用尖括号括起来的 IRI 的语法规则中禁止连字符是没有意义的。
Should I consider the range ]-[ null and this IRIREF is valid: http://hello[world]
']-[' 在这里不表示范围,null 或其他; ]
结束第一个字符 class 表达式,[
开始第二个字符。
What I think is more likely is that the range is inverted and is not a problem for w3c specifications, which means the characters [, \ and ] are invalid characters. This makes sense.
如果我对表达式的解析是正确的,'['和']'是合法的(它们不被第一个表达式排除,也不被第二个表达式排除); '\' 被第一个表达式排除。
(规格:https://www.w3.org/TR/sparql11-query/#rIRIREF)
根据规范,IRIREF 可以这样解析:
[139] IRIREF ::= '<' ([^<>"{}|^`\]-[#x00-#x20])* '>'
困扰我的是表达式的这一部分:
\]-[
如果我认为 \
是括号字符 class 中的转义字符(在 Perl 正则表达式中就是这种情况),那么这意味着 \
单独在 IRIREF 中不是问题,这是有效的:<http://hello\world>
那么这个范围就有这个大问题:]-[
。字符 ]
的序数值是 93,[
的序数值是 91。这意味着我们有一个无效范围:93 到 92。这在我测试的大多数正则表达式引擎中都是不允许的。
这是什么意思?
- 我是否应该将
-
视为括号字符 class 中的常规字符,那么这是无效的 IRIREF:<http://new-example.org>
。没有意义。 - 我是否应该考虑范围
]-[
为空并且此 IRIREF 有效:<http://hello[world]>
- 我认为更有可能的是范围倒置了,这不是w3c规范的问题,这意味着字符
[
、\
和]
是无效字符.这是有道理的。
这是shorthand句法糖,EBNF
准确地说,是一种超越正则表达式标准特性的句法:
这意味着 prior character class without following character class
,在此特定实例中 not certain brackets and quotes, and neither control codes from 0x00 (NUL) to 0x20 (SPC), which would otherwise be included
。
相关参考:EBNF notation used, in particular the clause A - B
. It is referred to in the first paragraph of the SPARQL grammar.
SPARQL 规范说它的语法是使用符号 defined by the XML 1.1 specification 编写的。
在该表示法中,您引用的右侧,
'<' ([^<>"{}|^`\]-[#x00-#x20])* '>'
表示
的序列- 一个 '<' 字符
零个或多个匹配表达式 [^<>"{}|^`]-[#x00-#x20] 的字符;这是表示
的集合差异- 由 [^<>"{}|^
\] = any character other than '<', '>', '"', '{', '}', '|', '^', '
' 或 '\' 匹配的任何字符;n.b。'\' 不是此表示法中的转义字符(它具有根本没有转义字符) - 除[#x00-#x20]匹配的=控制字符C1区加空格
这种模式的写法有点奇怪;它同样可以写成 [^<>"{}|^`#x00-#x20];我不确定为什么编辑们会这样写。
- 由 [^<>"{}|^
一个'>'字符
所以一一回答你的问题:
Should I consider the - as a regular character in the bracketed character class, then this is invalid IRIREF: http://new-example.org. It makes no sense.
没有。当 A 和 B 是这种表示法中的表达式时, A - B 表示 A 语言中的任何字符串,它也不是 B 语言中的字符串。这里A和B分别是字符-class表达式,一负一正。
你是对的,从旨在接受用尖括号括起来的 IRI 的语法规则中禁止连字符是没有意义的。
Should I consider the range ]-[ null and this IRIREF is valid: http://hello[world]
']-[' 在这里不表示范围,null 或其他; ]
结束第一个字符 class 表达式,[
开始第二个字符。
What I think is more likely is that the range is inverted and is not a problem for w3c specifications, which means the characters [, \ and ] are invalid characters. This makes sense.
如果我对表达式的解析是正确的,'['和']'是合法的(它们不被第一个表达式排除,也不被第二个表达式排除); '\' 被第一个表达式排除。