我用C语言创建了一个函数,用于使用正则表达式在某些条件下识别整数。 regex表达式在UNIX和其他平台上可以正常工作,但是当我在Mainframe TN3270上使用同一段代码时,字符串/正则表达式中的字符,例如[[,']','{','}'被替换为编译期间的空格。 我尝试在所有这些字符和regcomp期间使用,REG_EXTENDED之前使用'\',但结果没有变化。
int VALNUM ()
{
regex_t s_regex, *ps_regex = &s_regex;
char pc_regexpInt[ ] = "^[+-]{0,1}[0-9]{1,} *";
printf("pc_regexpInt value:%s\n",pc_regexpInt);
regcomp(ps_regex, pc_regexpInt, REG_EXTENDED)
regexec(ps_regex, pc_buffer, 0, NULL, 0);
regfree(ps_regex);
}
对我来说,printf返回:
pc_regexpInt value:^ +- 0,1 0-9 1, *
并且regexec对于pc_buffer值(如+120或-3.1415)也失败。
注意:代码编译没有问题,这里我只写了一段代码。声明和所有内容都在这里丢失,这不是问题。
任何人请提出建议。
答案 0 :(得分:2)
有几个因素在起作用。在ISPF中(如果您正在使用的话)编辑器的代码页,在ISPF中3270会话的终端设置以及正在运行的代码的代码页。
对于3270,我发现使用代码页1047对我有效。该代码页将左括号和右括号分别映射到0xAD [
和0xBD ]
。还有许多其他代码页,但是通常将它们映射以满足需要将其他字符转换为Latin-1的语言环境的编码需求。
设置仿真器的代码页。例如,我通过选择会话上的属性来使用HostOnDemand,然后:
接下来,您需要设置ISPF。这是选择支持括号的终端类型。在ISPF中,通过选择菜单->设置将终端类型设置为3277A。
最后一部分是您对C及其语言环境的设置。找到了这个reference,可以帮助您顺利完成最后一部分。
答案 1 :(得分:1)
TN3270是用于连接到z / OS和其他操作系统的协议。我假设您在这里使用z / OS。通常,z / OS使用EBCDIC而非ASCII进行字符编码。正如@Ctx所说,不同的字符集具有不同的映射,并且TN3270客户端需要与主机系统一起使用适当的映射。
因此,您需要使用其中包含{,},(和)的代码页。代码页1047通常用于此目的。但是,您需要确保可以在主机系统(可能是通过ISPF选项0设置)上以及在客户端中都使用它,可以通过多种不同的方式进行操作。有关更多信息,请参见https://www.askthezoslady.com/tag/setting-tso-code-page/。