簡體   English   中英

兩個正則表達式之間的差異

[英]Differences between two regular expressions

有誰知道為什么這個正則表達式:

/^(([a-zA-Z0-9\(\)áéíóúÁÉÍÓÚñÑ,\.°-]+ *)+)$/

可以,但是這個不行:

/^(([a-zA-Z0-9áéíóúÁÉÍÓÚñÑ,\.°-\(\)]+ *)+)$/

區別在於括號所在的位置...我嘗試了一些在線PHP regex測試器,並獲得了相同的結果。 第二個根本不起作用...

PHP返回:

preg_match(): Compilation failed: range out of order in character class at offset 44 in...

這不是批評者的問題,因為我設法使它起作用,但是我有好奇心!

也許Unicode字符正在改變某些東西?

當在括號內使用-字符(表示字符集)時,它指示范圍,除非它是該字符集中的最后一個字符,該字符集中的第一個字符,或緊接在開頭的否定字符之后。 這意味着文字破折號。 通過將其從末尾移動到中間,可以更改其含義。 如果要將其保留在中間,則需要對其進行轉義: \\-

如果將連字符作為字符類中的第一個或最后一個字符放置,則將其視為文字- (而不是范圍),因此不需要轉義。

這些是不需要轉義連字符的位置:

  • 在右方括號( [ )之后,或
  • 就在右括號( ]之前,或者
  • 插入符號( ^ )之后

在第二個正則表達式中,您將連字符放在中間,並且正則表達式引擎嘗試創建一個范圍,其中連字符前面的字符,連字符后面的字符以及按數字順序位於它們之間的所有字符。 由於無法達到此范圍,因此會觸發錯誤消息。 有關字符表,請參見asciitable.com

將連字符放在表達式的末尾實際上會使它不需要轉義,因為它不能成為范圍的一部分,但是您可能仍想養成始終轉義的習慣。

在您的第一個正則表達式中,您甚至已經正確地管理了所有內容-連字符(末尾是連字符)。 好吧,它也應該在那里! 我的意思是,如果您不想逃避它,它有兩個地方,一個地方在char類的末尾,另一個地方在char類的末尾!

你猜很好! 否則,您應該逃脫它!

暫無
暫無

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

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