我怎样才能防止重复我正在寻找的单词而不管他们的顺序如何?

时间:2014-12-05 09:44:44

标签: c# regex

我花了一个小时试图制作一个更好的正则表达式,但这不是我的一杯茶...我需要一个正则表达式,它将执行以下操作(如果需要可以提供更多):

Spd_Engine          #Ok
speedengine         #Ok
enginespd           #Ok
Engine_speed        #Ok
aps_speed_engine    #Ok
engine_speed        #Ok
engine_trq          #Not Ok
speed_rpm           #Not Ok

正则表达式匹配至少包含的每一行(引擎&&(speed || spd))

所以我想出了这个:

[e,E]ngine[_]?[s,S]p[e]*d|[a-zA-Z]*[_]*[s,S]p[e]*d[_]?[e,E]ngine

但我觉得它可以改进。我该如何简化它?

2 个答案:

答案 0 :(得分:9)

你可以使用预见来简化正则表达式

^(?=.*spe*d)(?=.*engine).*
  • ^将正则表达式锚定在字符串的开头

  • (?=.*spe*d)积极向前看。检查字符串是否包含spe*d

  • (?=.*engine)另一个正面的展望。检查字符串是否包含engine

  • .*匹配整个字符串

Regex Example

OR

^(?=.*spe*d).*engine.*

放下第二个展望

Regex Example

有关[e,E]ngine[_]?[s,S]p[e]*d|[a-zA-Z]*[_]*[s,S]p[e]*d[_]?[e,E]ngine

的说明
  • [e,E]字符类中的逗号并不代表e 逗号 E。您可以将其修改为

    [eE]

  • [_]?在字符类中添加单个字符没有任何好处。它与_?

  • 相似
  • i标志我可以用来在匹配正则表达式时忽略大小写

答案 1 :(得分:0)

因此,如果这个正则表达式的较短版本算作简化,那么它就是我想到的

  

[E,E] ngine _ [S,S] PE d |?[A-ZA-Z] _ [S,S] PE d _并[e ,E] ngine

VS

  

[E,E] ngine [] [S,S] P [E] * d?| [A-ZA-Z] * [] * [S,S] p [E ] * d [_] [E,E] ngine