簡體   English   中英

正則表達式使用 Perl 在變量中捕獲特定的 8 位字符串

[英]Regex to Capture Specific 8-digit String in Variable using Perl

在我的 Perl 腳本中,我有一個包含特定文件路徑的變量。 我需要創建一個可以從該變量中捕獲特定 8 位字符串的正則表達式。

$file_path = "/home/attachments/00883227/sample.txt我想捕獲緊跟在“附件”之后的數字字符串。

我的(失敗)嘗試:

if($file_path =~ /attachments\/(\d{1,2,3,4,5,6,7,8}+)/)
    { $number = $1; }

但是,當我運行此腳本時, $number 變量中似乎沒有存儲任何內容。 對此的解決方案可能非常簡單? 請原諒我的無知,我對 Perl 很陌生。

您不需要在括號中輸入太多數字。 只需使用{8}來強制匹配8位數字。 並且由於字符串中包含/ ,因此可以使用其他定界符,而不用轉義斜杠:

if($file_path =~ m!attachments/(\d{8})!)
   { $number = $1; }

關閉,只需使用(\\d{8}) ,例如:

$file_path =~ /attachments\/(\d{8})\b/

還添加了\\b ,以使其不再捕獲任何數字。

如果要精確匹配8位數字,只需使用\\d{8}

if($file_path =~ /attachments\/(\d{8})/)
    { $number = $1; }
my ($number) = ( $file_path =~ m{ (attachments/( [0-9]{8} ) }x );

使用/以外的模式定界符,例如m{ } ,可以避免由於需要轉義和/出現在模式中的字符而導致的所謂的“ 傾斜牙簽綜合症”

通過在列表上下文中分配$number ,捕獲的子字符串立即進入$number

通過使用x選項,您可以使圖案更具可讀性。

嘗試使用:

if($file_path =~ /attachments\/(\d+)/)
{ $number = $1; }

{ , }用於限制某個字符(或一組字符)重復的次數。 {n,m}表示字符(或組)應重復至少n次,最多重復m次。

如果確定數字字符串的長度為8位數字,則可以使用:

if($file_path =~ /attachments\/(\d{8})/)
{ $number = $1; }

{ } (不帶逗號)將完全匹配指定的數字。

my ($number) = $file_path =~ m{attachments/(\d+)};

如果您要確保長度恰好是八位數,

my ($number) = $file_path =~ m{attachments/(\d{8})(?!\d)};

簡單地給出限制。

像, \\d{3,8} 它將返回 3-8 長度之間的數字。

它是正好是8位數字還是1到8位數字?

由於您將/attachments/視為字符串的一部分,因此您可能不想使用標准的/../分隔符。 也許切換到m{..}m#..#

if ( $file_path =~ m#/attachments/\(d{1,8})/# ) {

這將捕獲1到8位數字。 要精確捕獲8個:

my $number;
if ( $file_path =~ m#/attachments/(\d{8})/# ) {
   $number = $1;
   ...
}
else {
    ....
}

請注意,我在if語句之前定義了$digit_string 這樣,它就位於if語句之后的范圍內(並且位於if語句內部。(您正在使用use strict;對嗎?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM