2017-02-13 74 views
1

我有這個表達式:正則表達式的開始和結束的信,讓逗號和破折號

/^[\a-zøåæäöüß][\a-z0-9øåæäöüß]*(?:\-?[\a-z0-9øåæäöüß,]+)*$/i

它工作正常的像"K61-283øÅ,æk-ken,a-sd"瘋狂投入,但對案件"word,"失敗(所以,當只有一個逗號時)。

另外 - 我怎麼能限制它,它應該在每個逗號或破折號(基本上 - 每個單詞)後以字母開頭?

規則是:以字母開頭並以字母數字結尾;允許字母數字,破折號和逗號;每一劃線後或逗號應該有一個字母

+0

你確定你沒有允許'_'?那麼'\ w'是做什麼的?你的模式要求是什麼? –

+0

哦,我明白了......我以爲'\ w'只允許使用字母數字... – Milkncookiez

+0

好的,試試[/^[a-zøåæäöüß] [a-z0-9øåæäöüß] *(?:[ - ,] [a -z0-9øåæäöüß] +)* $/i'(https://regex101.com/r/RQhsOy/1)。注意我從'[ - ,]' –

回答

1

您可以使用

/^[a-zøåæäöüß][a-z0-9øåæäöüß]*(?:[-,][a-zøåæäöüß][a-z0-9øåæäöüß]*)*$/i 

regex demo

詳細

  • ^ - 串
  • 開始
  • [a-zøåæäöüß] - 從定義的信中
  • [a-z0-9øåæäöüß]* - 0+數字或字母從定義設置
  • (?:[-,][a-zøåæäöüß][a-z0-9øåæäöüß]*)* - 零次或多次的序列:
    • [-,] - 一個-,
    • [a-zøåæäöüß] - 一個從所定義的字母設定
    • [a-z0-9øåæäöüß]* - 0+數字或字母從所定義的設置
  • $ - 字符串的結尾。
+0

這允許'a0'(這是無效的)但不允許'a'(這是有效的)。 – melpomene

+0

@melpomene:爲什麼'a0'無效?順便說一下,'a' [是匹配的](https://regex101.com/r/RQhsOy/4)。 –

+0

'a0'被「*開頭和結尾是一個字母*」(它以一個數字結尾)排除。 'a'是有效的,因爲它是一個以字母開頭和結尾的字符串。 – melpomene

1

更新2:

有看你的需求兩個方面。

  1. 自上而下的視圖

    我們把輸入的一個或多個單詞的列表,用逗號或破折號分開:

    INPUT = WORD (?: [,\-] WORD)* 
    

    每個字由一個字母,後面由零個或多個字母或數字組成:

    WORD = LETTER [ LETTER DIGIT ]* 
    

    翻譯成JavaScript正則表達式語法,這給了我們:

    WORD = [a-zøåæäöüß][a-zøåæäöüß\d]* 
    

    和整個輸入(帶錨):

    /^[a-zøåæäöüß][a-zøåæäöüß\d]*(?:[,\-][a-zøåæäöüß][a-zøåæäöüß\d]*)*$/i 
    

    (這是Wiktor的Stribiżew的答案)

  2. 自下而上的觀點

    我們開始看在允許的字符處。我們知道第一個字符必須是一個字母。在此之後,可以有零個或多個輸入元素:

    INPUT = LETTER ELEMENT* 
    

    每個元素都是

    • 字母或數字,或
    • 逗號或破折號,隨後是字母:

    ELEMENT = [ LETTER DIGIT ] | [ COMMA DASH ] LETTER 
    

    這個翻譯成JavaScript給了我們:

    /^[a-zøåæäöüß](?:[a-zøåæäöüß\d]|[,\-][a-zøåæäöüß])*$/i 
    

這兩個正則表達式是等效的。自下而上的正則表達式更短,包含更少的重複代碼。另一方面,如果輸入的字符串大部分是字母數字的,並且相對較少的破折號/逗號,則自頂向下的正則表達式在某些正則表達式引擎上可能運行得更快。在抓握的手上,如果你的輸入很短,你可能不會在意微小的性能差異。


這裏是您(修訂)要求直接編碼:

/^[a-zøåæäöüß](?:(?:[a-zøåæäöüß\d]|[,\-][a-zøåæäöüß])*[,\-]?[a-zøåæäöüß])?$/i 

的想法是一致的一封信,之後無論是

  • 字符串的結束(這處理長度爲1)的輸入字符串,或
  • 0個或多箇中間體的列表,可選後跟逗號或短劃線,後跟另一個字母

每個中間要麼是

  • 字母或
  • 數字或
  • 逗號或破折號後跟字母
+0

除了在''asd,-asd「'失敗。 – Milkncookiez

+1

@Milkncookiez我已經完全重寫了我的答案。 – melpomene

+0

我想我欠你一筆。 –

-1

嘗試了這一點:(允許字母和數字逗號或破折號後)

/^[a-zøåæäöüß]([a-z0-9øåæäöüß]|(,|-)[a-z0-9øåæäöüß])*[a-zøåæäöüß]$/i 

或這樣的:(允許字母逗號或破折號後)

/^[a-zøåæäöüß]([a-z0-9øåæäöüß]|(,|-)[a-zøåæäöüß])*[a-zøåæäöüß]$/i 
+0

你不必逃避','或'-'。你的正則表達式不允許'a'(這是有效的),但是它們允許'a,0a'(這是無效的)。 – melpomene

+0

'a,a'是您的正則表達式不匹配的另一個有效輸入。 – melpomene

相關問題