我確信這是一件簡單的事情,但我似乎無法找到任何示例或使其超出我一直在使用的眾多檔案來源。
我在表中有一個變數(稱為位置),例如:OH_DRT HOME_G4-T7 77 Cafe Entrance
我希望能夠根據一些分隔符將其決議為幾列。我的資料集中存在可變性,所以我認為使用 perl 運算式進行模式匹配是可行的方法。我試圖把那個字串分解成這樣的東西:
狀態 | 建造 | 姓名 | 描述 |
---|---|---|---|
哦 | DRT 主頁 | G4 | T7 咖啡廳入口 |
佛羅里達州 | 克利夫蘭 | RG | 03 回傳條目 |
我可以把第一部分分開
Data Mydata;
Set Int_Data;
retain re;
if _N_ = 1 Then re = prxparse("/(\D{2})/");
if prxmatch(re, location) Then Do
State= prxposn(re,1,location);
end;
它正在決議我不知所措的任何其他部分。我唯一能夠正常作業的是狀態。我想我應該能夠在兩個角色之間拉出任何東西。
在我的腦海中,我應該能夠拆分如下內容:第一個 _ 之前的任何內容,第一個 _ 和第二個 _ 之間的任何內容,第二個 _ 到第一個 - 的任何內容,最后是 - 之后的任何內容
uj5u.com熱心網友回復:
所有記錄都完全相同嗎?如果是這樣:
use warnings;
use strict;
my $data = 'OH_DRT HOME_G4-T7 77 Cafe entrance';
my ($state, $building, $name, $desc);
if ($data =~ /^([A-Z]{2})_(.*)_(\w{2})-\w{2}\s (.*)$/) {
$state = $1;
$building = $2;
$name = $3;
$desc = $4;
}
print "$state, $building, $name, $desc\n";
正則運算式的作業方式如下:
- 在字串的開頭捕獲兩個大寫字母并將其放入
$1
- 跳過一個下劃線并捕獲所有內容,直到下一個下劃線并將其放入
$2
- 捕獲以下兩個單詞字符并放入
$3
- 跳過連字符和以下兩個單詞字符以及任意數量的空格,并將字串的剩余部分放入
$4
- 將編號匹配分配給更具描述性的命名變數
請注意,如果任何匹配/捕獲失敗,則所有命名變數都將未定義。
上面的輸出是:
OH, DRT HOME, G4, 77 Cafe entrance
uj5u.com熱心網友回復:
您可以使用具有 4 個捕獲組的模式,但請注意,在考慮以下備注時,它將T7 77 Cafe entrance
在最后一組中給出。
最后是 -
如果您想匹配下劃線和之間的任何內容,-
您可以使用否定字符類排除字符以匹配您指定的字符。
要不跨越換行符,您可以添加換行符和回車符[^_\r\n]
^([^_] )_([^_] )_([^-] )-(.*)
解釋
^
字串的開始([^_] )_
捕獲除第 1 組之外的 1 個字符_
,然后匹配它([^_] )_
捕獲 1 以外的字符_
的 1 個字符,然后匹配它([^-] )-
捕獲 1 以外的字符-
,然后匹配它(.*)
匹配第 4 組中下劃線后的所有內容
正則運算式演示
如果你想77 Cafe entrance
在第 4 組:
^([^_] )_([^_] )_([^-] )-[^\s-]*\s*(.*)
正則運算式演示
uj5u.com熱心網友回復:
我確信正則運算式解決方案作業正常。如果您想要SCAN解決方案。
Data WANT(Keep STATE BUILDING NAME DESC);
Length State $2 Building $50 Name $2 Desc $100;
TEST="OH_DRT HOME_G4-T7 77 Cafe Entrance";
State=scan(test,1,"_");
Building=scan(test,2,"_");
temp=scan(test,3,"_");
Name=scan(temp,1,"-");
Desc=scan(temp,2,"-");
Run;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/504251.html
上一篇:正則運算式(或bash),獲取引號之間的管道(perl)
下一篇:如何從當前日期獲取兩個月前的日期