9.4. 字符串内置类型

字符串内置类型表示YANG中可读的字符串。 合法字符是UnicodeISO/IEC 10646 [ISO.10646]字符,包括制表符,回车符和换行符,但不包括其他C0控制字符,代理块和非字符。 字符串语法由第14节中的规则“yang-string”正式定义。

9.4.1. 词汇表示

XML编码中,字符串值在词法上表示为字符数据。

9.4.2. 规范形式

规范形式与词汇表示相同。 字符串值的Unicode规范化没有执行。

9.4.3. 限制

一个字符串可以用“length”(9.4.4节)和“pattern”(9.4.5节)语句进行限制。

9.4.4. “length”声明

length”语句是“type”语句的一个可选子语句,它将长度表达式字符串作为参数。它用于限制内置类型“string”和“binary”或从它们派生的类型。

length”语句限制字符串中的Unicode字符数。

长度范围由一个显式值或一个下界,两个连续的点“..”和一个上界组成。可以给出多个值或范围,用“|”分隔。长度限制值不能是负数。如果给出了多个值或范围,它们都必须是不相交的,并且必须按照升序排列。如果长度限制应用于已经受长度限制的类型,则新的限制必须是等同限制或更多限制的,即,提高下限,减少上限,移除显式长度值或范围或将范围拆分成具有中间间隙的多个范围。长度值是一个非负整数或特殊值“min”或“max”中的一个。 “min”和“max”分别表示被限制类型可接受的最小和最大长度。实现不需要支持大于18446744073709551615的长度值。

长度表达式语法在第14节中由规则“length-arg”正式定义。

9.4.4.1. length的子语句

  1. +---------------+---------+-------------+
  2. | substatement | section | cardinality |
  3. +---------------+---------+-------------+
  4. | description | 7.21.3 | 0..1 |
  5. | error-app-tag | 7.5.4.2 | 0..1 |
  6. | error-message | 7.5.4.1 | 0..1 |
  7. | reference | 7.21.4 | 0..1 |
  8. +---------------+---------+-------------+

9.4.5. “pattern”声明

pattern”语句是“type”语句的一个可选子语句,它使用[XSD-TYPES]中定义的正则表达式字符串作为参数。 它用于将内置类型“string”或从“string”派生的类型限制为与该模式匹配的值。

如果类型具有多个“pattern”语句,则表达式将被组合在一起。即,所有这些表达式必须匹配。

如果将模式限制应用于已受模式限制的类型,则除了新模式之外,值必须与基本类型中的所有模式匹配。

9.4.5.1. pattern的子语句

  1. +---------------+---------+-------------+
  2. | substatement | section | cardinality |
  3. +---------------+---------+-------------+
  4. | description | 7.21.3 | 0..1 |
  5. | error-app-tag | 7.5.4.2 | 0..1 |
  6. | error-message | 7.5.4.1 | 0..1 |
  7. | modifier | 9.4.6 | 0..1 |
  8. | reference | 7.21.4 | 0..1 |
  9. +---------------+---------+-------------+

9.4.6. “modifier”声明

modifier”语句是“pattern”语句的一个可选子语句,它以字符串“invert-match”作为参数。

如果一个模式存在“反向匹配(invert-match)”修饰符,则类型被限制为与模式不匹配的值。

9.4.7. 使用示例

用下面的typedef

  1. typedef my-base-str-type {
  2. type string {
  3. length "1..255";
  4. }
  5. }

以下改进是合法的:

  1. type my-base-str-type {
  2. // legal length refinement
  3. length "11 | 42..max"; // 11 | 42..255
  4. }

而下面的改进是非法的:

  1. type my-base-str-type {
  2. // illegal length refinement
  3. length "1..999";
  4. }

使用以下类型:

  1. type string {
  2. length "0..4";
  3. pattern "[0-9a-fA-F]*";
  4. }

以下字符串匹配:

  1. AB // legal
  2. 9A00 // legal

和以下字符串不匹配:

  1. 00ABAB // illegal, too long
  2. xx00 // illegal, bad characters

使用以下类型:

  1. type string {
  2. length "1..max";
  3. pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
  4. pattern '[xX][mM][lL].*' {
  5. modifier invert-match;
  6. }
  7. }

以下字符串匹配:

  1. enabled // legal

和以下字符串不匹配:

  1. 10-mbit // illegal, starts with a number
  2. xml-element // illegal, starts with illegal sequence