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