[英]Java Regular Expression: what is “ '- ”
我來到了使用正則表達式的java中的一行。 需要用戶輸入姓氏
return lastName.matches( "[a-zA-z]+([ '-][a-zA-Z]+)*" );
我想知道['-]的功能是什么。 另外,為什么我們同時需要一個“ +”和一個“ *”,並且['-] [a-zA-Z]放在括號中?
您的RE是: [a-zA-z]+([ '-][a-zA-Z]+)*
我將其分為幾個組成部分:
[a-zA-Z]+
字符串必須以任何字母az
或AZ
開頭,重復一次或多次( +
)。
([ '-][a-zA-Z]+)*
[ '-]
<space>
, '
或-
任何單個字符。
[a-zA-Z]+
同樣,任何字母az
或AZ
重復一次或多次。
字母( '-
和a-ZA-Z
)的組合然后可以重復零次或更多次。
為什么[ '-]
? 允許使用小寫的名稱(例如Higgs-Boson
或帶撇號的名稱(例如O'Reilly
)或帶空格的名稱(例如Van Dyke
。
表達式[ '-]
意思是“其中一個'
, 或者
-
”的順序是非常重要的-儀表板必須是最后一個,否則字符類將被視為一個范圍,並與空間和報價之間的代碼點其他字符'
將被接受為好。
+
表示“一個或多個重復”; *
表示“零個或多個重復”,指+
或*
修飾符之前的正則表達式。
總體而言,該表達式匹配由空格,破折號或單引號分隔的小寫和大寫字母組成的組。
這意味着它可以是space
'
或-
(空格,引號)中的任何字符
-
可以做為\\-
因為它也可以表示范圍...例如az
看起來這是匹配雙桶(空格或連字符)或我不知道該如何調用的名稱(例如O'Grady
...例如:
它會匹配
counter-terrorism
De'ville
O'Grady
smith-jones
smith and wesson
但這不匹配
jones-
O'Learys'
#hashtag
Bob & Sons
這個想法是,在第一個[A-Za-z]+
消耗掉所有可能的字母之后,除非下一個字符是空格,撇號或連字符( [ '-]
),否則匹配將在那里結束。 如果存在這些字符之一,則必須在其后至少再加上一個字母。
很多人對此有困難。 天真地寫類似[A-Za-z]+[ '-]?[A-Za-z]*
,弄清楚分隔符和多余的字母塊都是可選的。 但是它們不是獨立地可選的。 如果有分隔符( [ '-]
),則必須后面再加上至少一個字母。 否則,它將像R'- j'-'
這樣的字符串視為有效。 您的正則表達式沒有這個問題。
順便說一下,您的正則表達式中有一個錯字: [a-zA-z]
。 您需要注意這一點,因為[Az]
確實匹配所有大寫和小寫字母,因此只要輸入有效,它似乎就可以正常工作。 但它也匹配幾個非字母字符,它們的代碼點恰好位於Z
和a
字符之間。 而且很少有IDE或正則表達式工具會捕獲該錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.