我寫了一個正則表達式來驗證必須遵循以下規則的字符串:如何有效地匹配Perl正則表達式中已匹配的內容?
- 必須至少有一個字符
- 必須不包含空格字符
- 第一個字符可能不標點符號
- 最後一個字母可能不是標點符號
- 可能不會以標點符號後面跟數字結尾
- 其他所有字符都可以是除之外的任何UTF-8字符。
這裏是正則表達式:
my $name_re = qr/
[^[:punct:][:blank:]] # not punct or blank
(?: # followed by...
[^[:blank:]:@#]* # any number non-blank, [email protected], non-#, [email protected]
[^[:punct:][:blank:]] # one not blank or punct
)? # ... optionally
/x;
見遺漏什麼嗎?規則#5未被執行。我一直在寫代碼,例如這樣實施的:
die "$proj is not a valid name" unless $proj =~ /\A$name_re\z/
&& $proj !~ /[[:punct:]][[:digit:]]+\z/;
有我必須做這個地方一堆,所以我寧願它在一個單一的正則表達式來完成。問題是:如何?什麼正則表達式會拒絕諸如「foo,23」之類的值?
這並不禁止字符串以標點加上任何數字,即'/ [[:punct:]] [[:digit:]] * /'。後面的部分必須是固定寬度的,所以'*'不能使用。 :-( – theory 2012-08-09 22:32:16
此發出 「有效」,而應發出 「無效」:'perl的-E「說 「富,23」=〜/ \ A(?![:PUNCT:])(?:([?! PUNCT:] \ d + $)[^ [:空白:]:@#])+(<[:PUNCT:])\ Z/「有效」?!? 「無效」'' – theory 2012-08-09 22:34:53
@theory - 有在我的後面沒有重複,我做了一些小的編輯,但它總是檢查標點符號和數字在結尾處(我只將'\ d'切換到'[:digit:]'並將$前綴更改爲'\ z')。 – 2012-08-09 22:36:13