xsd模式不能使用由OR(|)分隔的两个以上的正则表达式

时间:2014-06-27 06:23:57

标签: regex xsd

我在使用xsd模式时面临一些问题......

 <xsd:pattern value="\d+(,\d+)*(,[*])|\d+(,\d+)*|\d+(,[*])(,\d+)+" />

在上面的模式中,我想让用户只输入以下模式:

1,2,3
1,*,3
1,2,*

但是当我尝试输入1,2时,*它会让我跟踪异常......

Unknown Exception occurred while Updating = For input string: "*"

1 个答案:

答案 0 :(得分:0)

我没有看到表达式有任何问题,但可以改进它,这样可以防止错误。错误也可能与使用正则表达式的结果有关,而不是正则表达式本身。

问题中给出的正则表达式是\d+(,\d+)*(,[*])|\d+(,\d+)*|\d+(,[*])(,\d+)+

在Notepad ++ v6.5.5中测试它表明它匹配所有三个示例行,但表达式并未锚定到行的开头和结尾。由于^的优先级,仅添加一个$和一个|是不够的。

使用此表达式匹配所有行:

^(\d+(,\d+)*(,[*])|\d+(,\d+)*|\d+(,[*])(,\d+)+)$

也可以使用^\d+(,\d+)*(,[*])$|^\d+(,\d+)*$|^\d+(,[*])(,\d+)+$,但这似乎更难阅读和理解。

在正则表达式

  • [*]匹配一个字符,可能更好地写为\*
  • (,[*])匹配并捕获两个字符序列,*。捕获它没有意义,因为它在所有地方都得到了修复。所以这可以用,\*替换。
  • 每个替代方案都以\d+开头,这可以考虑在内。
  • 前两个选项仅与最终的`(,[*])子句不同。

进行这些更改会给出表达式:

^\d+((,\d+)*(,\*)*|,\*(,\d+)+)$

问题仅显示带有两个逗号的模式,但正则表达式匹配带有多个逗号的行,但它只允许将第二个或最终值替换为*。所以原始表达式实际匹配

1,2,3
1,*,3
1,2,*
1,2,3,4,5
1,*,3,4,5
1,2,3,*,*
1,2,3,4,*

但不匹配

1,*,*,4,5
1,*,3,*,5
1,*,3,4,*
1,2,*,*,5
1,2,*,4,*
1,2,*,4,5
1,2,3,*,5

为了匹配给定的输入,我只使用两个逗号:

^\d+,(\d+,\d+|\d+,\*|\*,\d+)$

要匹配一个字符串,其中包含以逗号分隔的多个数字,但只有一个(但不是第一个)被*替换,我会使用:

^\d+(,\d+)*(,\*)?(,\d+)*$

请注意上面一行中的?。它表示匹配前一项的零或一次出现。因此它允许,*在字符串中出现一次。