【问题标题】:How can I prevent the repetition of the words I'm looking for regardless of their order? [duplicate]无论它们的顺序如何,如何防止重复我正在寻找的单词? [复制]
【发布时间】:2015-02-03 10:47:33
【问题描述】:

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

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

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

所以我想出了这个:

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

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

【问题讨论】:

  • 为方便起见,您能否编辑您的问题,并用文字说明您的验证检查是什么?为什么 aps_speed_engine 可以接受,而 engine_trq 不可以,这并不明显。
  • 在字符类中你不需要使用逗号,[eE] 是正确的格式。但是你可以使用i 标志来忽略大小写检查
  • 这不是代码审查。 “改进”是基于意见的。 RegEx 是多余的,input = input.ToLower(); if ((input.Contains("speed") || input.Contains("spd") && input.Contains("engine")) { ... } 会做同样的事情并且更具可读性。
  • @nu11p01n73R 我没能使用regex hero找到i标志的正确语法
  • 您可以先问一个更具体的问题。 “我觉得”和“简化”不是很真实。 “如何防止重复我正在寻找的单词而不管它们的顺序?” 是一个更精确的问题。

标签: c# regex


【解决方案1】:

您可以使用前瞻来简化正则表达式

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

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

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

  • .* 匹配整个字符串

Regex Example

^(?=.*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 标志 i 可用于在匹配正则表达式时忽略大小写

【讨论】:

  • 我喜欢regexr.com更多
  • 另外,我只是在玩弄你的表情,在我删除第二个之后?= 结果没有任何变化:/ 我不能在这里写,因为两个星号在这里算作粗体。
  • @EmreAcar 当然,您可以通过不同的方式完成相同的任务。 :)
  • @EmreAcar 将添加到我的答案中。谢谢指出
【解决方案2】:

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

[e,E]engine_?[s,S]ped|[a-zA-Z]_[s,S]ped_?[e ,E]引擎

VS

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2017-09-19
    • 2020-06-28
    • 2023-03-11
    相关资源
    最近更新 更多