如何用OCL约束数组元素属性?附字符串格式约束场景求解
实现你的OCL数组元素约束
没问题,你的需求完全可以用OCL实现!我来给你一步步拆解怎么写~
约束代码(结合你的类结构)
从你提供的类图来看,目标类包含一个pre: String[*]的数组属性,假设这个类的名称是TargetClass(如果实际类名不同,替换成你图里的类名就行),可以在类的上下文下编写如下OCL约束:
context TargetClass inv: self.pre->forall(s : String | s.includes('not ') or s.indexOf(' ') = -1 )
逐行解释
self.pre->forall(s : String | ...):这是OCL里遍历集合/数组的标准写法,意思是**pre数组里的每一个字符串元素s都必须满足后面的条件**s.includes('not '):检查字符串s是否包含子串"not "(注意这里的空格不能少,对应你要求的'not'和一个空格)s.indexOf(' ') = -1:判断字符串s里完全没有任何空格——indexOf(' ')返回-1就代表整个字符串里找不到空格字符
更直观的正则写法(可选)
如果你觉得正则表达式更清晰,也可以换成下面这种写法,效果完全一样:
context TargetClass inv: self.pre->forall(s : String | s.matches('.*not .*') or s.matches('[^ ]*') )
s.matches('.*not .*'):匹配任何包含"not "的字符串(.*表示任意字符重复任意次数)s.matches('[^ ]*'):匹配完全不包含空格的字符串([^ ]代表非空格字符,*表示可以有零个或多个这类字符)
额外说明
这个约束是严谨的:两个条件是互斥的(一个字符串不可能同时既包含not 又完全没空格),而且覆盖了所有你要求的合法情况,完全符合你的需求。
内容的提问来源于stack exchange,提问作者elena
相关产品推荐
相关产品推荐

