我在使用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: "*"
答案 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+)*$
请注意上面一行中的?
。它表示匹配前一项的零或一次出现。因此它允许,*
在字符串中出现一次。