[英]Two very close regexes with lookahead assertions in Python - why does re.split() behave differently?
[英]Why do these two regexes behave differently?
為什么以下兩個正則表達式的行為不同?
$millisec = "1391613310.1";
$millisec =~ s/.*(\.\d+)?$/$1/;
與
$millisec =~ s/\d*(\.\d+)?$/$1/;
此代碼不打印任何內容:
perl -e 'my $mtime = "1391613310.1"; my $millisec = $mtime; $millisec =~ s/.*(\.\d+)?$/$1/; print "$millisec";'
雖然這會打印字符串的小數部分:
perl -e 'my $mtime = "1391613310.1"; my $millisec = $mtime; $millisec =~ s/\d*(\.\d+)?$/$1/; print "$millisec";'
在第一個正則表達式中, .*
占據字符串末尾的所有內容,因此沒有可選的(.\\d+)?
可以接。 $1
將為空,因此該字符串將替換為空字符串。
在第二個正則表達式中,僅從開頭抓取數字,以便\\d*
停在點前。 (.\\d+)?
將選擇點,包括尾隨數字。
您在括號內使用.\\d+
,它將匹配任何字符和數字。 如果要顯式匹配點,則必須使用\\.
。
為了使第一個正則表達式的行為類似於第二個正則表達式,您必須編寫
$millisec =~ s/.*?(\.\d+)?$/$1/;
這樣初始的.*
不會占用所有內容。
貪婪
Perl的正則表達式引擎會在繼續進行下一個術語之前盡可能地與每個術語匹配。 因此,對於.*(.\\d+)?$
, .*
匹配整個字符串,然后是(.\\d)?
不匹配,因為它是可選的。
\\d*(.\\d+)?$
最多只能匹配點,因此必須將.1
與(.\\d+)?
匹配(.\\d+)?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.