[英]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.