regex XML模式中的负先行

qq24tv8q  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(169)

我在尝试用一个正则表达式来表示一个字符串,

  • 只能来自[AXYUGHJI]
  • 字符串的最小长度为0,最大长度为8
  • 不区分大小写
  • 必须只有唯一字符

例如,以下是有效的字符串:

axyughji
axgh
agh
h
agHXU

而这些不是。

axXgh
axxhu
AXYUGHJIA
ATXYUGHM

我知道一个事实,XML模式的能力非常有限,因为它们没有负lookaheads的特性,而这是正则表达式在大多数其他语言中支持的特性之一。
是否可以用不同的方式来解决这个问题?
在负面观点的帮助下,我们可以找到一个解决方案,但这是XML模式不支持的。

jobtbby3

jobtbby31#

XSD 1.1,在简单类型上使用Assert:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="value" type="value-type" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  
  <xs:simpleType name="value-type">
    <xs:restriction base="xs:string">
        <xs:minLength value="0"/>
        <xs:maxLength value="8"/>
        <xs:assertion test="matches($value, '^[axyughji]{0,8}$', 'i') and count(distinct-values(string-to-codepoints(lower-case($value)))) eq string-length($value)"/>
    </xs:restriction>
  </xs:simpleType>
  
</xs:schema>

相关问题