在z / OS REXX中解析字符串,且不区分大小写

时间:2019-06-05 10:35:25

标签: parsing rexx

我有一个格式为REXX的参数字符串:

arg = 'update summary(A summary of something) description(The description)'

我正在解析模式,摘要和描述,如下所示:

parse upper var arg mode . ,
   1, 'SUMMARY('summary')' .,
   1, 'DESCRIPTION('description')' .

我将arg转换为大写字母,这样,summary和description关键字实际上不区分大小写(用户可以编写Summary或​​SUmmAry或sUmMaRy等),但是现在我已经将实际的摘要和说明翻译为大写。

如何使关键字的解析不区分大小写,而对实际参数却保留正确的大小写?

我已经考虑过提取关键字的字符位置,并在PARSE语句中使用它们,而不是“ 1”等,但是如果可能,希望有一个简单的过程。

3 个答案:

答案 0 :(得分:1)

我想出了这个“ toUpper”功能,它比预期的要简单一些。它使用一个字符串和一个单词列表作为输入,并返回该字符串,如果找到该单词,则将任何单词转换为大写字母:

parms = 'UPdatE summary(The summary) Description(The description)'     
say 'Parms are :' parms                                                

parms = toUpper(parms, 'CHANGE UPDATE SUMMARY DESCRIPTION')            
say 'Parms are now :' parms                                            

exit                                                                   

/********************************************************************/ 
/* Subroutines                                                      */ 
/********************************************************************/ 
toUpper:                                                               

parse arg string, wordList                                             
stringUpper = string                                                   
upper stringUpper wordlist                                             

do i = 1 to words(wordlist)                                            
   word = word(wordlist,i)                                             
   pos = pos(word, stringUpper)                                        
   if pos > 0 then string = overlay(word, string, pos)                 
end                                                                    

return string 

输出:

Parms are : UPdatE summary(The summary) Description(The description)       
Parms are now : UPDATE SUMMARY(The summary) DESCRIPTION(The description) 

答案 1 :(得分:1)

当尝试在Rexx中模拟TSO-ish / IDCAMS-ish语法时,这是一个非常常见的任务。我通常会做这样的事情。这是一个简短的习语,我从不费心去做一个子例程,只需要内联使用它即可。

summary = 'Whatever the default value is'
description = 'Whatever the default value is'
parse var arg mode arg
mode = upper(mode)
do while arg <> ''
    parse var arg keyword '(' value ')' arg
    select upper(keyword)
        when 'SUMMARY' then summary = value
        when 'DESCRIPTION' then description = value
        otherwise Say 'Unknown option:' keyword
    end
end

答案 2 :(得分:0)

按原样,Ross的代码在z / OS系统上不起作用。 z / OS上的REXX有点古老。 :-(以下代码将起作用。

summary = 'Whatever the default value is'                           
description = 'Whatever the default value is'                       
arg =  'UPdatE summary(The summary) Description(The description)'   
parse var arg mode arg                                              
upper mode                                                          
do while arg <> ''                                                  
    parse var arg keyword '(' value ')' arg                         
    upper keyword                                                   
    select                                                          
        when keyword='SUMMARY' then summary = value                 
        when keyword='DESCRIPTION' then description = value         
        otherwise Say 'Unknown option:' keyword                     
    end                                                             
end