2016-01-24 35 views
2

我有一個錯誤的正則表達式如何獲得正則表達式的優先級?

([A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]*\.) 

我需要接受像字符串:

  • a-b.
  • ab.
  • a.

,但我不需要在這個字符串 - a-.

我應該改變什麼?

+0

試着在regex101上調試它 – Marged

+0

你能用簡單的英語解釋正則表達式的規則是什麼嗎? –

+0

'[A-Za-z0-9](?: - [A-Za-z0-9 \ - ])* [A-Za-z0-9] * \。' –

回答

1
[A-Za-z0-9]+\.|[A-Za-z0-9]+-?[A-Za-z0-9]\. 

的理念是:

  • -? - 可選破折號
  • \. - 逃脫點,以匹配字面點
  • | - 交替(一個或其他)
  • x+ - 一個或多個重複,相當於xx*

如果你不介意匹配強調過,你可以使用word character set

\w+\.|\w+-?\w\. 

See it in action

+0

我已經理解了這個想法。好方法!=)非常感謝你來自俄羅斯) –

1

您可以通過使用可選組嘗試這樣的。

"(?i)[A-Z0-9](?:-?[A-Z0-9]+)*\\." 
  • (?i)標誌區分大小寫匹配。
  • [A-Z0-9]一個字母數字字符
  • (?:-?[A-Z0-9]+)*後面跟着一個或多個alnum )
  • \.字面點(?:一個可選的連字符任何金額

See demo at Regexplanet(單擊Java)

+0

非常感謝你。這是什麼意思 '?:' ? –

+0

@ E.Simchuk歡迎! '(?:'啓動一個[非捕獲組](http://stackoverflow.com/questions/3512471/what-is-a-non-capturing-group)。 –

+0

@ E.Simchuk,'(?:)''與'()'基本相同,它只是不捕獲組。就匹配而言,它並沒有什麼不同。 – ndn

1

這適用於您的測試案例:

[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\. 

請參閱live demo