2

我想在 OpenEdge 中检查变量是否为帕斯卡大小写。

我找到了matches运算符,我编写了以下代码:

define variable cVariable as character no-undo.

cVariable = "cPascalCase":U.

message cVariable matches 'c[A-Z]*':U.

但它不起作用,它显示“不”。有没有办法在 OpenEdge 中指定第二个字符应该是大写?还有更多,检查变量是否包含以大写开头的单词组?

提前致谢!

4

4 回答 4

3

MATCHES不支持正则表达式。 文档说它只需要像.和这样的简单通配符*。如果您知道您的代码将始终在 Windows 上运行,您可以使用 CLR 桥来运行 .NET 代码:

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.
于 2013-10-23T12:44:03.257 回答
2

Progress 不直接支持正则表达式。

有关使用正则表达式的一些示例:在 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() 函数进行逐个字符的比较。

于 2013-10-23T13:44:40.947 回答
0

除非您使用 .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").
于 2013-10-23T12:58:10.537 回答
0

你可以使用我开发的一个类。它在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否则它将无法按预期工作。

于 2015-06-04T18:09:23.620 回答