我想检查一个变量是否在pascal case中 OpenEdge </跨度> 。
我找到了匹配运算符,并编写了以下代码:
将变量cVariable定义为字符no-undo。
cVariable =“cPascalCase锟”:你。
消息c变量匹配’c [A-Z] *’:U。
但它不起作用,它显示“不”。有没有办法指定 OpenEdge </跨度> 第二个字符应该是大写?还有更多,检查变量是否包含以大写字母开头的单词组?
提前致谢! 锟斤拷
进度不直接支持正则表达式。
有关使用正则表达式的一些示例: 在OpenEdge ABL中使用System.Text.RegularExpressions
进度变量不区分大小写。要使用区分大小写的字符串,您可以将变量声明为区分大小写,如下所示:
define variable s as character no-undo case-sensitive. display "aBc" matches "abc". s = "aBc". display s matches "abc". display s matches "a*c".
或者您可以使用UPPER()和LOWER(),ASC()和CHR()函数进行逐字符比较。
MATCHES 不支持正则表达式。 文档 说它只需要简单的通配符 . 和 * 。如果您知道您的代码将始终在Windows上运行,则可以 使用CLR桥 运行.NET代码:
MATCHES
.
*
USING System.Text.RegularExpressions.*. DEF VAR cVariable AS CHAR NO-UNDO INITIAL "cPascalCase". DEF VAR regexp AS CLASS Regex NO-UNDO. regexp = NEW Regex("c[A-Z]*"). MESSAGE regexp:IsMatch(cVariable). FINALLY: DELETE OBJECT regexp. END.
除非使用.NET类,否则不能将正则表达式与Progress一起使用,但您的需求很容易通过简单的函数实现。
FUNCTION isPascalCase RETURNS LOGICAL (cString AS CHARACTER): IF LENGTH(cString) < 2 THEN RETURN FALSE. RETURN SUBSTRING(cString,1,1) = "c" AND ASC(SUBSTRING(cString,2,1)) = ASC(UPPER(SUBSTRING(cString,2,1))). END FUNCTION. MESSAGE isPascalCase("cpascalCase").
你可以使用我开发的课程。它可用于 https://github.com/gabsoftware/Progress-ABL-4GL-Regex 。此类添加了对Windows和HP-UX 11.31 ia64的Perl正则表达式的支持。
它非常易于使用。只需执行以下操作:
DEFINE VARIABLE cl_regex AS CLASS Regex NO-UNDO. DEFINE VARIABLE ch_pattern AS CHARACTER NO-UNDO CASE-SENSITIVE. ASSIGN ch_pattern = "c[A-Z]*" cl_regex = NEW Regex(). /* should display: "No" */ MESSAGE cl_regex:mMatch( "ctest", ch_pattern, "" ) VIEW-AS ALERT-BOX.
请注意,您必须在模式中转义Progress特殊字符,如下所述: http://knowledgebase.progress.com/articles/Article/P27229 或者它不会按预期工作。