2012-08-14 56 views
0

我對正則表達式不太熟悉,所以我需要一些幫助。我正在使用一個jQuery dynacloud插件,當正則表達式匹配發生時,它在我的代碼中的某個特定點處斷開。我需要一個人來幫我弄清楚這個正則表達式匹配什麼RegEx的含義

/^[a-z\xE4\xF6\xFC]*[A-Z\xC4\xD6\xDC]([A-Z\xC4\xD6\xDC\xDF]+|[a-z\xE4\xF6\xFC\xDF]{3,} 

請任何幫助!

+4

表達不完整,你錯過了最後... – 2012-08-14 09:31:58

+0

@FelixKling:我敢肯定,這只是一個剪切粘貼錯誤。 paren和斜槓在dynacloud源代碼中存在.. – 2012-08-14 11:01:25

+0

@Alan:當然,但是如果我們要解釋表達的意思,那麼在這裏有整個表達式會很好;) – 2012-08-14 11:03:48

回答

1

\x**部分轉換成一個特殊的charachter,如果更換這些你基本上得到:

/^[a-zäöü]*[A-ZÄÖÜ]([A-ZÄÖÜß]+|[a-zäöüß]{3,})/ 

我會分開給你:

^字符串的開頭

[a-zäöü]字符集:從任何字符a到z或AOU *零次或多次

[A-ZÄÖÜ]字符集:從A任何字符到Z或AOU只是一次

(組的開始

[A-ZÄÖÜß]另一個字符集,你應該現在得到它:) +一次或多次

|

[a-zäöüß]字符集,{3,} 3次或更多次

)端基

也,你錯過了)/在結束時,/在開始和結束意味着什麼在之間是正則表達式。

+0

感謝您的好解釋。所以這意味着這個正則表達式不允許UTF-8字符,對嗎? – karan 2012-08-14 12:19:21

+0

基本上它只允許指定字符集中的字符集 – 2012-08-14 13:01:02

1

我倒是建議你看一看Expresso,因爲你錯過了右括號,這是結果:

enter image description here

+0

這很整齊。謝謝! – karan 2012-08-14 12:21:00

1

^

[...]一類可能的begining chars

a-z範圍(abcde ... yz)

\xE4 char(「ascii」代碼)的十六進制值。

{n,m} n和m發生之間。

*相當於{0,}相當於

+ {1,}

0

假設這是你的正則表達式:

/^[a-z\xE4\xF6\xFC]*[A-Z\xC4\xD6\xDC]([A-Z\xC4\xD6\xDC\xDF]+|[a-z\xE4\xF6\xFC\xDF]{3,})/ 

以下將是正則表達式的解釋:

"^" +        // Assert position at the beginning of a line (at beginning of the string or after a line break character) 
"[a-z\xE4\xF6\xFC]" +    // Match a single character present in the list below 
             // A character in the range between 「a」 and 「z」 
             // ASCII character 0xE4 (228 decimal) 
             // ASCII character 0xF6 (246 decimal) 
             // ASCII character 0xFC (252 decimal) 
    "*" +        // Between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
"[A-Z\xC4\xD6\xDC]" +    // Match a single character present in the list below 
             // A character in the range between 「A」 and 「Z」 
             // ASCII character 0xC4 (196 decimal) 
             // ASCII character 0xD6 (214 decimal) 
             // ASCII character 0xDC (220 decimal) 
"(" +        // Match the regular expression below and capture its match into backreference number 1 
             // Match either the regular expression below (attempting the next alternative only if this one fails) 
     "[A-Z\xC4\xD6\xDC\xDF]" +   // Match a single character present in the list below 
              // A character in the range between 「A」 and 「Z」 
              // ASCII character 0xC4 (196 decimal) 
              // ASCII character 0xD6 (214 decimal) 
              // ASCII character 0xDC (220 decimal) 
              // ASCII character 0xDF (223 decimal) 
     "+" +        // Between one and unlimited times, as many times as possible, giving back as needed (greedy) 
    "|" +        // Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     "[a-z\xE4\xF6\xFC\xDF]" +   // Match a single character present in the list below 
              // A character in the range between 「a」 and 「z」 
              // ASCII character 0xE4 (228 decimal) 
              // ASCII character 0xF6 (246 decimal) 
              // ASCII character 0xFC (252 decimal) 
              // ASCII character 0xDF (223 decimal) 
     "{3,}" +       // Between 3 and unlimited times, as many times as possible, giving back as needed (greedy) 
")" 
0

我會認爲這是一個從正則表達式缺少)/只是一個cut-在你的部分粘貼錯誤;他們出現在DynaCloud source code。什麼是不是目前是一個結束錨點($),我覺得很驚訝。以下是相關的代碼:

var elems = jQuery(this).text() 
      .replace(/[^A-Z\xC4\xD6\xDCa-z\xE4\xF6\xFC\xDF0-9_]/g, ' ') 
      .replace(jQuery.dynaCloud.stopwords, ' ') 
      .split(' '); 
var word = 
    /^[a-z\xE4\xF6\xFC]*[A-Z\xC4\xD6\xDC]([A-Z\xC4\xD6\xDC\xDF]+|[a-z\xE4\xF6\xFC\xDF]{3,})/; 

第一條語句過濾掉不需要的字符,但是隻保留數字和下劃線。第二條語句試圖匹配一個由ASCII字母組成的單詞以及一些在(例如)德語中使用的非ASCII字母。但是,一旦匹配的字母用完,可以繼續匹配任意個字符,而不僅僅是第一個正則表達式中列出的字符。而且,單詞中的任何數字或下劃線都會導致單詞被分成兩個或更多單詞。

我會嘗試在端錨的正則表達式,並增加了對數字和下劃線的支持,這樣的:

/^[a-z\xE4\xF6\xFC]*[A-Z\xC4\xD6\xDC]([A-Z\xC4\xD6\xDC\xDF0-9_]+|[a-z\xE4\xF6\xFC\xDF0-9_]{3,})$/g 

這正則表達式是隻是爲了演示;它並不打算成爲一個解決方案。首先,我猜測了數字和下劃線的位置。另一方面,它現在可以匹配以數字和下劃線結尾的單詞,並且您可能不希望這樣。

+0

非常感謝你@Alan。由於您似乎對RegEx非常熟悉,如果您不介意,我想向您提出一個小問題。我可以創建一個類似的正則表達式,它不僅可以匹配標準[a-z]字符集中的字符,而且可能包含所有中文字符,俄語......基本上是unicode字符集。 – karan 2012-08-14 13:39:57

+0

您總是可以使用像'\ u00E4'或'\ u2018'這樣的Unicode轉義符,但這非常符合JavaScript的Unicode支持。但不用擔心,Steve Levithan的[XReEgxp](http://xregexp.com/)庫在填補這一空白方面做得非常出色。 – 2012-08-14 18:39:15