代码之家  ›  专栏  ›  技术社区  ›  est

四个字母的词,至少有一个“j”,优雅和最兼容的regex解决方案?

  •  4
  • est  · 技术社区  · 14 年前

    我有一个问题让我抓伤了头:

    是否有一种方法可以使用正则表达式来测试至少包含字母“j”的4个字符的字符串?这就是我所带来的:

    ^(j...|.j..|..j.|...j)$
    

    是的,我承认它很难看,如果问题将4个字符改为10个字符,或者将“至少一个J”改为“至少一个J和一个K”,那就太疯狂了。

    为这个编写regex的更优雅和兼容的方法是什么?

    附加问题:

    1. 如果没有简单的答案,学术上来说,regexp的极限是什么?为什么它不能解决这样简单的问题?
    2. 有适合这些任务的DSL吗?
    3. “至少有一个j和一个k的10个字符串”的最佳regex是什么?
    4 回复  |  直到 14 年前
        1
  •  9
  •   Tim Pietzcker    14 年前

    如果您的regex引擎支持lookahead(大多数支持),则可以使用

    ^(?=.*j).{4}$
    

    展望未来 (?=.*j) 断言存在 j 在字符串中的某个位置,不实际使用任何字符串进行匹配。以下内容 .{4} 然后将匹配四个字符的字符串。

    这个 ^ $ 锚定确保字符串完全匹配。

    如果要添加更多约束,只需添加另一个lookahead:

    ^(?=.*j)(?=.*k).{10}$
    

    如果至少有一个匹配 J 还有一个 k 存在于正好10个字符长的字符串中。等。。。

        2
  •  3
  •   codaddict    14 年前

    您可以使用正面展望:

    ^(?=.*j)[a-zA-Z]{4}$
    
        3
  •  2
  •   Michael Low    14 年前

    如果可以确保测试字符串长度正好为4个字符,则可以使用 ^([A-Za-z])*j([A-Za-z])*$ . 也就是说,0个或多个字母后跟j,后跟0个或多个字母,这将确保字符串在开头、中间或结尾至少有一个“j”。

    编辑:事实上,你最好像在其他答案中那样做前瞻性的工作!

        4
  •  2
  •   Matteo Riva    14 年前

    我将尝试回答其他问题1。

    这确实是一个简单的任务,但这并不意味着它是简单的 每一个 你可以使用的工具。正则表达式只是一种工具,在我看来,在这种情况下是错误的。

    如果您只想测试一个带有约束的字符串,它必须是4个字符长并且包含 j 那么每种语言都提供了更好的方法来实现这一点。这些约束不是模式或表达式:它们只是一个长度和一个子字符串。当您必须描述一个不容易用琐碎的固定术语拆分的模式时,正则表达式是有用的。