PRXPARSE选择性区分大小写/不敏感

时间:2014-10-30 15:49:36

标签: regex sas

我有以下正则表达式,我用它来扫描数据集中的字段,查找可能表明该记录属于美国居民的各种标记:

prx_1 = (prxparse("/(?i)^USA$(?-i)|
                      (?i)^United[\s+]States[\s+]of[\s+]America$(?-i)|
                      (?i)^US$(?-i)|
                      (?i)^U[\s+]S[\s+]A$(?-i)|
                      (?i)^United[\s+]States$(?-i)|
                      (?i)^America$(?-i)|
                      (?i)^U[\.+]S[\.+]A$(?-i)|
                      (?i)^U[\.+]S[\.+]A[\.+]$(?-i)|
                      (?-i)^AL$|(?-i)^AK$|(?-i)^AZ$|(?-i)^AR$|
                      (?-i)^CA$|(?-i)^CO$|(?-i)^CT$|(?-i)^DE$|
                      (?-i)^DC$|(?-i)^FL$|(?-i)^GA$|(?-i)^HI$|
                      (?-i)^ID$|(?-i)^IL$|(?-i)^IN$|(?-i)^IA$|
                      (?-i)^KS$|(?-i)^KY$|(?-i)^LA$|(?-i)^ME$|
                      (?-i)^MD$|(?-i)^MA$|(?-i)^MI$|(?-i)^MN$|
                      (?-i)^MS$|(?-i)^MO$|(?-i)^MT$|(?-i)^NE$|
                      (?-i)^NV$|(?-i)^NH$|(?-i)^NJ$|(?-i)^NM$|
                      (?-i)^NY$|(?-i)^NC$|(?-i)^ND$|(?-i)^OH$|
                      (?-i)^OK$|(?-i)^OR$|(?-i)^PA$|(?-i)^RI$|
                      (?-i)^SC$|(?-i)^SD$|(?-i)^TN$|(?-i)^TX$|
                      (?-i)^UT$|(?-i)^VT$|(?-i)^VA$|(?-i)^WA$|
                      (?-i)^WV$|(?-i)^WI$|(?-i)^WY$|(?-i)^AS$|
                      (?-i)^GU$|(?-i)^MP$|(?-i)^PR$|(?-i)^VI$|
                      (?-i)^UM$|(?-i)^FM$|(?-i)^MH$|(?-i)^PW$|
                      (?-i)^AA$|(?-i)^AE$|(?-i)^AP$|(?-i)^CM$|
                      (?-i)^CZ$|(?-i)^NB$|(?-i)^PI$|(?-i)^TT$|
                      (?i)^Alabama$(?-i)|(?i)^Alaska$(?-i)|(?i)^Arizona$(?-i)|(?i)^Arkansas$(?-i)|
                      (?i)^California$(?-i)|(?i)^Colorado$(?-i)|(?i)^Connecticut$(?-i)|(?i)^Delaware$(?-i)|
                      (?i)^District[\s+]of[\s+]Columbia$(?-i)|(?i)^Florida$(?-i)|(?i)^Georgia$(?-i)|(?i)^Hawaii$(?-i)|
                      (?i)^Idaho$(?-i)|(?i)^Illinois$(?-i)|(?i)^Indiana$(?-i)|(?i)^Iowa$(?-i)|(?i)^Kansas$(?-i)|
                      (?i)^Kentucky$(?-i)|(?i)^Louisiana$(?-i)|(?i)^Maine$(?-i)|(?i)^Maryland$(?-i)|
                      (?i)^Massachusetts$(?-i)|(?i)^Michigan$(?-i)|(?i)^Minnesota$(?-i)|(?i)^Mississippi$(?-i)|
                      (?i)^Missouri$(?-i)|(?i)^Montana$(?-i)|(?i)^Nebraska$(?-i)|(?i)^Nevada$(?-i)|
                      (?i)^New[\s+]Hampshire$(?-i)|(?i)^New[\s+]Jersey$(?-i)|(?i)^New[\s+]Mexico$(?-i)|
                      (?i)^New[\s+]York$(?-i)|(?i)^North[\s+]Carolina$(?-i)|(?i)^North[\s+]Dakota$(?-i)|
                      (?i)^Ohio$(?-i)|(?i)^Oklahoma$(?-i)|(?i)^Oregon$(?-i)|(?i)^Pennslyvania$(?-i)|
                      (?i)^Rhode[\s+]Island$(?-i)|(?i)^South[\s+]Carolina$(?-i)|(?i)^South[\s+]Dakota$(?-i)|
                      (?i)^Tennessee$(?-i)|(?i)^Texas$(?-i)|(?i)^Utah$(?-i)|(?i)^Vermont$(?-i)|(?i)^Virginia$(?-i)|
                      (?i)^Washington$(?-i)|(?i)^West[\s+]Virginia$(?-i)|(?i)^Wisconsin$(?-i)|(?i)^Wyoming$(?-i)|
                      (?i)^American[\s+]Samoa$(?-i)|(?i)^Guam$(?-i)|(?i)^Northern[\s+]Mariana[\s+]Islands$(?-i)|
                      (?i)^Puerto[\s+]Rico$(?-i)|(?i)^Virgin[\s+]Islands$(?-i)|
                      (?i)^U[\.*]S[\.*][\s+]Minor[\s+]Outlying[\s+]Islands$(?-i)|
                      (?i)^Federated[\s+]States[\s+]of[\s+]Micronesia$(?-i)|(?i)^Marshall[\s+]Islands$(?-i)|
                      (?i)^Palau$(?-i)/"
            ));

这是一系列与|标记连接的小型正则表达式。我对正则表达式的理解是,如果我想要打开和关闭区分大小写,我应该使用(?i)将其打开并(?-i)将其关闭。但是,此代码不返回匹配,例如,州名称以大写形式写入。

我在这里误解了什么吗?

由于

2 个答案:

答案 0 :(得分:1)

如果正则表达式支持(?i),它还应该支持(?i:pattern)。您应该重写正则表达式并将不应该不区分大小写的模式放在非捕获组(?i:pattern)中。

您需要使用不区分大小写的模式部分的示例:

^(?i:USA|United\s+States\s+of\s+America|United\s+States)$

您需要区分大小写的模式部分的示例:

^(?:AL|AK|AZ|AR)$

答案 1 :(得分:0)

这可以在这里工作。有关详细信息,请参阅this page lower down,title" Comments和Inline Modifiers&#34 ;.

data have;
input state $;
datalines;
AZ
az
Az
ARIZONA
Arizona
ArIzOnA
;;;;
run;

data want;
  set have;
  _rx = prxparse('~(?i)AZ|(?-i)Arizona~o');
  _rc = prxmatch(_rx,state);
  put _rc=;
run;

你的正则表达式现在太复杂了,无法真正帮助你排除故障。如果你想要排除故障,我会把它限制在一个状态(或类似的东西)并从那里算出来。