2016-01-24 36 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