簡體   English   中英

Java正則表達式:什么是“'-”

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

    字符串必須以任何字母azAZ開頭,重復一次或多次( + )。

  • ([ '-][a-zA-Z]+)*

    • [ '-]

    <space>'-任何單個字符。

    • [a-zA-Z]+

    同樣,任何字母azAZ重復一次或多次。

    字母( '-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]確實匹配所有大寫和小寫字母,因此只要輸入有效,它似乎就可以正常工作。 但它也匹配幾個非字母字符,它們的代碼點恰好位於Za字符之間。 而且很少有IDE或正則表達式工具會捕獲該錯誤。

暫無
暫無

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

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