【问题标题】:Relax NG does not support end-of-string regular expression (dollar)Relax NG 不支持字符串结尾正则表达式(美元)
【发布时间】:2014-08-19 08:11:03
【问题描述】:

我需要为 xml 中的属性提供一些有限的可能性,为此我在 Relax NG 验证文档中使用:

<param "pattern">myRegEx</param>

允许指定属性需要符合的一些正则表达式。

由于某种原因,模式不支持使用 $(字符串结尾)符号。

例子:

<param "pattern">Why it does not work??$</param>

这应该与以“Why it doesn't work??”结尾的字符串匹配。句子。 但是 $ 似乎在验证中完全被忽略了。

有人知道为什么吗?

谢谢

纳撒尼尔

【问题讨论】:

  • 您所拥有的不是有效的 XML,因此也不是有效的 Relax NG。换句话说,任何 Relax NG 验证器都会拒绝使用您在问题中显示的内容。您应该在问题中提供mcve,以避免出现此类问题。

标签: xml relaxng dollar-sign


【解决方案1】:

RNG 'pattern' 参数具有与 XSD 简单类型定义上的模式构面相同的*语义。 XSD 模式适用于被验证的整个词法项——XSD 模式没有用 ^ 和 $ 作为字符串开始和字符串结束的锚点,因为 XSD 模式总是匹配整个输入字符串或不匹配。 (对于假设所有正则表达式语言都有 ^ 和 $ 的人来说,如果 XSD 指定它们在模式的开头和结尾被忽略,那可能会更好,但这并没有发生。)

如果你想定义一个匹配任何以字符串“Why does it not work??”结尾的文本节点的模式,而不是匹配两个字符串“Why does it not work$”或“Why does它不工作$”,你会想写

<param name="pattern">.*Why does it not work\?\?</param>

注意:

  • 输掉$
  • 逃脱?

(* 多模式的处理有一个无缘无故的不兼容,但在这里不相关。)

【讨论】:

  • 所以通常如果我想识别一个数字序列,后面必须跟着空格或逗号,但是对于最后一个数字我不想授权逗号,我应该执行以下操作:([0-9][, ]).*([0-9][ ]?){1,}
  • 我认为这不太对。您给出的正则表达式匹配由 (a) 单个数字、(b) 单个逗号或单个空格、(c) 零个或多个字符的任何字符串以及 (d) 一个或多个由 (d1) 组成的序列组成的序列一个数字和 (d2) 一个可选空格。所以 "9,8 7,this is some random stuff 654 3 2 1" 匹配,而 "987,654,321" 不匹配。这似乎与您的散文描述不符。如果您对 RNG 中的正则表达式还有其他问题,最好提出一个新问题。
  • 哦,你完全正确,应该是 ([0-9]+,)*([0-9][ ]?)。无论如何感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多