2016-08-10 2 views
0

У меня есть строка, содержащая одно слово в верхнем регистре где-то внутри. Я хочу извлечь это одно слово в новую переменную, используя SAS.SAS находит слово в верхнем регистре в строке

Мне кажется, мне нужно найти способ закодировать поиск слова, содержащего две или более прописных букв (так как начало предложения начиналось с прописной буквы).

т.е. Как создать переменную «слова»:

data example; 

    length txtString $50; 

    length word $20; 

    infile datalines dlm=','; 

    input txtString $ word $; 

datalines; 

This is one EXAMPLE. Of what I need.,EXAMPLE 

THIS is another.,THIS 

etc ETC,ETC 

; 

run; 

Надежда кто-то может помочь и вопрос ясен

Заранее спасибо

+0

создан для цикла по длине строки а затем используйте функцию байта, чтобы проверить значения в верхнем регистре ascii – DCR

ответ

0

Рассмотрят матч регулярного выражения/замену с отрицательный lookbehind включать два типа совпадений:

  1. последовательные слова в верхнем регистре, за которыми следует sp асе, по крайней мере, двух символов (чтобы избежать случаев заголовка в начале предложения): (([A-Z ]){2,})
  2. последовательных верхних слов случае с последующим периодом, по меньшей мере, два символа: (чтобы избежать случаев заголовка в начале предложения): (([A-Z.]){2,})

CAVEAT: Это решение работает, за исключением статьи I, которая также соответствует действительности, так как она также является заглавной однословной. Будучи единственным типом на английском языке, рассмотрите замену tranwrd() для такого особого случая. На самом деле, это решение соответствует всем заглавным словам.

data example; 
    length txtString $50; 
    length word $20; 
    infile datalines dlm=','; 
    input txtString $ word $; 
datalines; 
This is one EXAMPLE. Of what I need.,EXAMPLE 
THIS is another.,THIS 
etc ETC,ETC 
; 
run; 

data example; 
    set example; 
    pattern_num = prxparse("s/(?!(([A-Z ]){2,})|(([A-Z.]){2,})).//"); 
    wordextract = prxchange(pattern_num, -1, txtString); 

    wordextract = tranwrd(wordextract, " I ", ""); 
    drop pattern_num; 
run; 

txtString        word  wordextract 
This is one EXAMPLE. Of what I need. EXAMPLE EXAMPLE 
THIS is another.      THIS  THIS 
etc ETC         ETC  ETC 
0

SAS имеет вызов функции prxsubstr(), который находит начальную позицию и длину подстроки, которая соответствует заданному шаблону регулярного выражения в пределах заданной строки. Вот пример решения с помощью вызова функции prxsubstr():

data solution; 
    set example; 

    /* Build a regex pattern of the word to search for, and hang on to it */ 
    /* (The regex below means: word boundary, then two or more capital letters, 
    then word boundary. Word boundary here means the start or the end of a string 
    of letters, digits and/or underscores.) */ 
    if _N_ = 1 then pattern_num = prxparse("/\b[A-Z]{2,}\b/"); 
    retain pattern_num; 

    /* Get the starting position and the length of the word to extract */ 
    call prxsubstr(pattern_num, txtString, mypos, mylength); 

    /* If a word matching the regex pattern is found, extract it */ 
    if mypos ^= 0 then word = substr(txtString, mypos, mylength); 
run; 

SAS prxsubstr() документация: http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002295971.htm

Regex граница слова информация: http://www.regular-expressions.info/wordboundaries.html

Смежные вопросы