2016-10-22 138 views
-1

我用正则表达式正则表达式匹配的句子

(.*)(\s){1}([0-9]*min|lightning)\b 

匹配类似下面的字符串:

  1. 编写快速测试针对企业的Rails 60分钟

  2. 的Clojure吃斯卡拉(在我的项目上)45分钟

  3. Acco unting驱动开发45分钟

的匹配组会给:

  1. 编写快速测试针对企业的Rails

  2. 空间

  3. 60分钟

但是像???????????????????? 60min这样的字符串也匹配。

任何人都可以帮我解决这个问题吗?

更新

按照答案的正则表达式如下喜欢将解决这个问题,但对于输入3

^([^XX]*)(\s){1}([0-9]*min|lightning)\b$ 
  1. 我想允许 - 使输入3场比赛。串像,下面将 同时符合这是不正确

  2. 1组应该只包含字母

    ------------ 60分钟

请参阅链接https://regex101.com/r/JH5sl1/6

+1

似乎其由ThoughtWorks的分配! – SMA

回答

0

更改(.*)(\s){1}([0-9]*min|lightning)\b^([\w ]*)(\s){1}([0-9]*min|lightning)\b$

它将确保您只匹配字符串开头的字母数字和空格。请参阅demo

由于问题在演变,所以让我们从另一个角度来考虑问题。您正则表达式更改为:

^([^XX]*)(\s){1}([0-9]*min|lightning)\b$ 
    ^^^^^ 

,并更改XX,无论你不想匹配。它被称为否定字符类,并允许您“拒绝”其包含的字符。


如果你想避免两个连续的非字母数字字符的存在,你可以使用负前瞻:

^(?!.*(\W)\1)(\D*)\s(\d*min|lightning)$ 

Demo

+0

nopes它给出 组1 -rils 组3-60分钟 – coder25

+0

@ThomasAyoub这不匹配OPs第二个样本字符串,因为有括号。你可能会将它们包括到你的字符类中,但我猜它会随着进一步的样本增长越来越大。 –

+0

字符串会计驱动开发45分钟 – coder25